Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /