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
+ }
0 commit comments