-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClassDiagram.plantuml
187 lines (148 loc) · 5.05 KB
/
ClassDiagram.plantuml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
@startuml LifeGame
package view {
package component {
abstract class AbstractCellComponent {
# void paintComponent(Graphics g)
}
class DefaultCellComponent {
# void paintComponent(Graphics g)
}
class TrilemmaCellComponent {
# void paintComponent(Graphics g)
}
class WithVitalityCellComponent {
# void paintComponent(Graphics g)
}
JComponent <|-right- AbstractCellComponent
AbstractCellComponent <|-up- DefaultCellComponent
AbstractCellComponent <|-up- TrilemmaCellComponent
AbstractCellComponent <|-up- WithVitalityCellComponent
hide DefaultCellComponent methods
hide TrilemmaCellComponent methods
hide WithVitalityCellComponent methods
}
abstract class AbstractLifeGameView {
# {abstract} AbstractCellComponent createCellComponent(Position position)
+ void launch()
}
class DefaultLifeGameView {
# DefaultCellComponent createCellComponent(Position position)
}
class TrilemmaLifeGameView {
# TrilemmaCellComponent createCellComponent(Position position)
}
class WithVitalityLifeGameView {
# WithVitalityCellComponent createCellComponent(Position position)
}
AbstractLifeGameView <|-- DefaultLifeGameView
AbstractLifeGameView <|-- TrilemmaLifeGameView
AbstractLifeGameView <|-- WithVitalityLifeGameView
DefaultLifeGameView --> DefaultCellComponent : > create
TrilemmaLifeGameView --> TrilemmaCellComponent : > create
WithVitalityLifeGameView --> WithVitalityCellComponent : > create
hide DefaultLifeGameView methods
hide TrilemmaLifeGameView methods
hide WithVitalityLifeGameView methods
}
package model {
package core {
interface ICell<L> {
+ boolean hasLife()
+ L getLife()
+ void putLife(L life)
+ void removeLife()
+ ICell copyCell()
}
class Cell<L> {
- L life
+ boolean hasLife()
+ L getLife()
+ void putLife(L life)
+ void removeLife()
+ ICell copyCell()
}
class NullCell<L> {
+ void putLife(L life)
+ ICell copyCell()
}
class Position {
- int row
- int column
+ int getRow()
+ int getColumn()
}
interface ILifeGameField<L> {
+ ICell getCellAt(Position position)
+ ILifeGameField update()
}
abstract class AbstractLifeGameField<L> {
+ ICell getCellAt(Position position)
+ ILifeGameField update()
# {abstract} void updateCell(ICell selfCell, List<ICell> neiborCells)
}
ICell <|.. Cell
Cell <|-right- NullCell
ILifeGameField <|.. AbstractLifeGameField
AbstractLifeGameField *-left- "*" ICell
Position -() Comparable
}
enum MonoLife {
+ ONE
}
enum TrilemmaLife {
+ ROCK
+ SCISSORS
+ PAPER
+ TrilemmaLife getStrongOpponent()
+ TrilemmaLife getWeakOpponent()
}
class MonoLifeWithVitality {
- int vitality
+ int getVitality()
+ boolean weaken()
+ MonoLifeWithVitality clone()
}
class DefaultLifeGameField<MonoLife> {
# void updateCell(ICell selfCell, List<ICell> neiborCells)
}
class TrilemmaLifeGameField<TrilemmaLife> {
# void updateCell(ICell selfCell, List<ICell> neiborCells)
}
class WithVitalityLifeGameField<MonoLifeWithVitality> {
# void updateCell(ICell selfCell, List<ICell> neiborCells)
}
class LifeGame<L, F extends AbstractLifeGameField> {
- int generationIndex
+ void reset()
+ void next()
+ void previous()
}
DefaultLifeGameField -right-> MonoLife : > use
TrilemmaLifeGameField -up-> TrilemmaLife : > use
WithVitalityLifeGameField -up-> MonoLifeWithVitality : > use
AbstractLifeGameField <|-down- DefaultLifeGameField
AbstractLifeGameField <|-up- TrilemmaLifeGameField
AbstractLifeGameField <|-right- WithVitalityLifeGameField
LifeGame *-- "1" AbstractLifeGameField
LifeGame *-- "*" ILifeGameField
MonoLifeWithVitality -() Cloneable
}
package util {
class EventNotifier<S, P> {
- List<BiConsumer<S, P>> eventHandlerList
- S sender
+ addEventHandler(BiConsumer<S, P> eventHandler)
+ void fire(P eventParams)
}
class MapCounter<K> {
- Map<K, Integer> counts
+ increment(K key)
+ getCount(K key)
}
}
LifeGame *-up- EventNotifier
TrilemmaLifeGameField -up-> MapCounter : > use
AbstractLifeGameView *-- "1" LifeGame
EventNotifier o-right- AbstractLifeGameView : < add
AbstractLifeGameView -left- EventNotifier : < notify
@enduml