Skip to content

Commit 271b738

Browse files
authored
KTLN-603: The Composite Pattern in Kotlin (#853)
* added code * made code fixes
1 parent 1c71360 commit 271b738

File tree

5 files changed

+127
-0
lines changed

5 files changed

+127
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.baeldung.composite
2+
3+
class Movie(private val name: String) : MovieComponent {
4+
override fun play(): String {
5+
return "Playing movie: $name\n"
6+
}
7+
8+
override fun stop(): String {
9+
return "Stopping movie: $name\n"
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.baeldung.composite
2+
3+
interface MovieComponent {
4+
fun play(): String
5+
fun stop(): String
6+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.composite
2+
3+
class Playlist(private val name: String) : MovieComponent {
4+
private val movieComponents = mutableListOf<MovieComponent>()
5+
6+
fun add(movieComponent: MovieComponent) {
7+
movieComponents.add(movieComponent)
8+
}
9+
10+
fun remove(movieComponent: MovieComponent) {
11+
movieComponents.remove(movieComponent)
12+
}
13+
14+
override fun play(): String {
15+
val result = StringBuilder()
16+
result.append("Playing playlist: $name\n")
17+
for (movieComponent in movieComponents) {
18+
result.append(movieComponent.play())
19+
}
20+
return result.toString()
21+
}
22+
23+
override fun stop(): String {
24+
val result = StringBuilder()
25+
result.append("Stopping playlist: $name\n")
26+
for (movieComponent in movieComponents) {
27+
result.append(movieComponent.stop())
28+
}
29+
return result.toString()
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.baeldung.composite
2+
3+
4+
fun main() {
5+
6+
val actionMoviesPlayList = Playlist("Action Movies")
7+
actionMoviesPlayList.add(Movie("The Matrix"))
8+
actionMoviesPlayList.add(Movie("Die Hard"))
9+
10+
val comicMoviesPlayList = Playlist("Comic Movies")
11+
comicMoviesPlayList.add(Movie("The Hangover"))
12+
comicMoviesPlayList.add(Movie("Bridesmaids"))
13+
14+
val allPlaylists = Playlist("All Playlists")
15+
allPlaylists.add(actionMoviesPlayList)
16+
allPlaylists.add(comicMoviesPlayList)
17+
18+
val playResult = allPlaylists.play()
19+
20+
val stopResult = allPlaylists.stop()
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.baeldung.composite
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.Test
5+
6+
class MovieApplicationUnitTest {
7+
8+
@Test
9+
fun `should play movie`() {
10+
val movie = Movie("The Matrix")
11+
val result = movie.play()
12+
13+
assertEquals("Playing movie: The Matrix\n", result)
14+
}
15+
16+
@Test
17+
fun `should stop movie`() {
18+
val movie = Movie("Die Hard")
19+
val result = movie.stop()
20+
21+
assertEquals("Stopping movie: Die Hard\n", result)
22+
}
23+
24+
@Test
25+
fun `should play and stop playlist`() {
26+
val actionMoviesPlayList = Playlist("Action Movies")
27+
actionMoviesPlayList.add(Movie("The Matrix"))
28+
actionMoviesPlayList.add(Movie("Die Hard"))
29+
30+
val comicMoviesPlayList = Playlist("Comic Movies")
31+
comicMoviesPlayList.add(Movie("The Hangover"))
32+
comicMoviesPlayList.add(Movie("Bridesmaids"))
33+
34+
val allPlaylists = Playlist("All Playlists")
35+
allPlaylists.add(actionMoviesPlayList)
36+
allPlaylists.add(comicMoviesPlayList)
37+
38+
val playResult = allPlaylists.play()
39+
val stopResult = allPlaylists.stop()
40+
41+
assertEquals("Playing playlist: All Playlists\n" +
42+
"Playing playlist: Action Movies\n" +
43+
"Playing movie: The Matrix\n" +
44+
"Playing movie: Die Hard\n" +
45+
"Playing playlist: Comic Movies\n" +
46+
"Playing movie: The Hangover\n" +
47+
"Playing movie: Bridesmaids\n", playResult)
48+
49+
assertEquals("Stopping playlist: All Playlists\n" +
50+
"Stopping playlist: Action Movies\n" +
51+
"Stopping movie: The Matrix\n" +
52+
"Stopping movie: Die Hard\n" +
53+
"Stopping playlist: Comic Movies\n" +
54+
"Stopping movie: The Hangover\n" +
55+
"Stopping movie: Bridesmaids\n", stopResult)
56+
}
57+
}

0 commit comments

Comments
 (0)