Skip to content

Commit 3197243

Browse files
added Mediator design pattern
1 parent c3d0a79 commit 3197243

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package design_patterns
2+
3+
/**
4+
*
5+
* Mediator is a behavioral design pattern that reduces the coupling of many classes among themselves
6+
*
7+
* by moving these couplings into one mediator class
8+
*
9+
*/
10+
11+
// SoftwareDevelopmentManager is a mediator for the customer, designer, programmer and tester
12+
class SoftwareDevelopmentManager {
13+
14+
private lateinit var customer: SoftwareDevelopmentMember
15+
private lateinit var designer: SoftwareDevelopmentMember
16+
private lateinit var programmer: SoftwareDevelopmentMember
17+
private lateinit var tester: SoftwareDevelopmentMember
18+
19+
fun changeCustomer(member: SoftwareDevelopmentMember) { customer = member }
20+
fun changeDesigner(member: SoftwareDevelopmentMember) { designer = member }
21+
fun changeProgrammer(member: SoftwareDevelopmentMember) { programmer = member }
22+
fun changeTester(member: SoftwareDevelopmentMember) { tester = member }
23+
24+
private val stages = mutableListOf<String>()
25+
val stagesAsString: String
26+
get() = stages.joinToString("\n")
27+
28+
// members do not interact directly with each other because the mediator does it
29+
// which reduces the coupling between them
30+
fun nextStage(work: String, member: SoftwareDevelopmentMember) {
31+
val finishedStage = when (member) {
32+
33+
is CustomerSoftwareDevelopmentMember -> designer.receiveWork(work)
34+
35+
is DesignerSoftwareDevelopmentMember -> programmer.receiveWork(work)
36+
37+
is ProgrammerSoftwareDevelopmentMember -> tester.receiveWork(work)
38+
39+
is TesterSoftwareDevelopmentMember -> customer.receiveWork(work)
40+
41+
else -> ""
42+
}
43+
44+
stages.add(finishedStage)
45+
}
46+
47+
}
48+
49+
// SoftwareDevelopmentMember works with other members through the mediator
50+
abstract class SoftwareDevelopmentMember(protected val mediator: SoftwareDevelopmentManager) {
51+
52+
abstract fun receiveWork(work: String): String
53+
54+
abstract fun finishWork()
55+
56+
}
57+
58+
class CustomerSoftwareDevelopmentMember(mediator: SoftwareDevelopmentManager) : SoftwareDevelopmentMember(mediator) {
59+
override fun receiveWork(work: String) = "Customer accepted the work: $work"
60+
61+
override fun finishWork() {
62+
mediator.nextStage("design development", this)
63+
}
64+
}
65+
66+
class DesignerSoftwareDevelopmentMember(mediator: SoftwareDevelopmentManager) : SoftwareDevelopmentMember(mediator) {
67+
override fun receiveWork(work: String) = "Designer accepted the work: $work"
68+
69+
override fun finishWork() {
70+
mediator.nextStage("writing code", this)
71+
}
72+
}
73+
74+
class ProgrammerSoftwareDevelopmentMember(mediator: SoftwareDevelopmentManager) : SoftwareDevelopmentMember(mediator) {
75+
override fun receiveWork(work: String) = "Programmer accepted the work: $work"
76+
77+
override fun finishWork() {
78+
mediator.nextStage("application testing", this)
79+
}
80+
}
81+
82+
class TesterSoftwareDevelopmentMember(mediator: SoftwareDevelopmentManager) : SoftwareDevelopmentMember(mediator) {
83+
override fun receiveWork(work: String) = "Tester accepted the work: $work"
84+
85+
override fun finishWork() {
86+
mediator.nextStage("business valuation", this)
87+
}
88+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package design_patterns
2+
3+
import org.junit.Test
4+
import org.junit.Assert.assertEquals
5+
6+
class MediatorTest {
7+
8+
@Test
9+
fun test() {
10+
val manager = SoftwareDevelopmentManager()
11+
12+
val customer = CustomerSoftwareDevelopmentMember(manager)
13+
manager.changeCustomer(customer)
14+
val designer = DesignerSoftwareDevelopmentMember(manager)
15+
manager.changeDesigner(designer)
16+
val programmer = ProgrammerSoftwareDevelopmentMember(manager)
17+
manager.changeProgrammer(programmer)
18+
val tester = TesterSoftwareDevelopmentMember(manager)
19+
manager.changeTester(tester)
20+
21+
customer.finishWork()
22+
designer.finishWork()
23+
programmer.finishWork()
24+
tester.finishWork()
25+
26+
assertEquals("""
27+
Designer accepted the work: design development
28+
Programmer accepted the work: writing code
29+
Tester accepted the work: application testing
30+
Customer accepted the work: business valuation
31+
""".trimIndent(), manager.stagesAsString)
32+
}
33+
34+
}

0 commit comments

Comments
 (0)