Design of the Original
Material in Tags: Bluej KaraclockThe #colon;ClockDisplay project is the first example for solving a problem using communicating objects. (in the Book “Objects First with Java: A Practical Introduction Using Bluej.” by David J Barnes and Michael Kölling)
Here’s a class diagram with the private fields and public methods (Constructors are omitted for clarity):
%%{
init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#f0cd91',
'primaryTextColor': '#000',
'primaryBorderColor': '#000',
'lineColor': '#F8B229',
'secondaryColor': '#006100',
'tertiaryColor': '#fff'
}
}
}%%
classDiagram
class ClockDisplay
class NumberDisplay
ClockDisplay ..> NumberDisplay
class ClockDisplay{
-NumberDisplay hours
-NumberDisplay minutes
-String displayString
void timeTick()
void setTime(int hour, int minute)
String getTime()
-void updateDisplay()
}
NumberDisplay: -int limit
NumberDisplay: -int value
NumberDisplay: int getValue()
NumberDisplay: String getDisplayValue()
NumberDisplay: void setValue(int)
NumberDisplay: void increment()
Within the example the field displayString in ClockDisplay is used to simulate the digital display. It is updated after every change to the time by calling the private method updateDisplay after every change to the time. The two instances of NumberDisplay generate their part of the displayString in getDisplayValue.
But they also hold their part of the model - the value for hours and minutes respectively.
The observable behavior of this example is returning a String like “13:45” from getTime() after either the time has been set to 13:45 by calling setTime() or by calling the tick() method the appropriate amount of times.
Original Version: Creation
%%{
init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#f69e9d',
'primaryTextColor': '#000',
'primaryBorderColor': '#000',
'lineColor': '#F8B229',
'secondaryColor': '#f4f4f4',
'activationBorderColor': '#000',
'tertiaryColor': '#fff'
}
}
}%%
sequenceDiagram
actor YOU
create Participant #colon;ClockDisplay
YOU->>+#colon;ClockDisplay: new ClockDisplay()
create Participant hours#colon;NumberDisplay
#colon;ClockDisplay->>+hours#colon;NumberDisplay:new NumberDisplay(24)
hours#colon;NumberDisplay-->>-#colon;ClockDisplay:hours
create Participant minutes#colon;NumberDisplay
#colon;ClockDisplay->>+minutes#colon;NumberDisplay:new NumberDisplay(60)
minutes#colon;NumberDisplay-->>-#colon;ClockDisplay:minutes
#colon;ClockDisplay-->>-YOU:#colon;ClockDisplay
Original Version: setTime()
%%{
init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#f69e9d',
'primaryTextColor': '#000',
'primaryBorderColor': '#000',
'lineColor': '#F8B229',
'secondaryColor': '#f4f4f4',
'activationBorderColor': '#000',
'tertiaryColor': '#fff'
}
}
}%%
sequenceDiagram
actor YOU
YOU->>+#colon;ClockDisplay: setTime(13,45)
#colon;ClockDisplay->>+hours#colon;NumberDisplay:setValue(13)
hours#colon;NumberDisplay-->>-#colon;ClockDisplay:void
#colon;ClockDisplay->>+minutes#colon;NumberDisplay:setValue(45)
minutes#colon;NumberDisplay-->>-#colon;ClockDisplay:void
#colon;ClockDisplay->>+#colon;ClockDisplay:updateDisplay()
#colon;ClockDisplay->>+hours#colon;NumberDisplay:getDisplayValue()
hours#colon;NumberDisplay-->>-#colon;ClockDisplay:displayString
#colon;ClockDisplay->>+minutes#colon;NumberDisplay:getDisplayValue()
minutes#colon;NumberDisplay-->>-#colon;ClockDisplay:displayString
deactivate #colon;ClockDisplay
#colon;ClockDisplay-->>-YOU:void
Original Version: timeTick()
%%{
init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#f69e9d',
'primaryTextColor': '#000',
'primaryBorderColor': '#000',
'lineColor': '#F8B229',
'secondaryColor': '#f4f4f4',
'activationBorderColor': '#000',
'tertiaryColor': '#fff'
}
}
}%%
sequenceDiagram
actor YOU
participant #colon;ClockDisplay
participant hours#colon;NumberDisplay
participant minutes#colon;NumberDisplay
YOU->>+#colon;ClockDisplay: timeTick()
#colon;ClockDisplay->>+minutes#colon;NumberDisplay:increment()
minutes#colon;NumberDisplay-->>-#colon;ClockDisplay:void
#colon;ClockDisplay->>+minutes#colon;NumberDisplay:getValue()
minutes#colon;NumberDisplay-->>-#colon;ClockDisplay:value
alt [value == 0]
#colon;ClockDisplay->>+hours#colon;NumberDisplay:increment()
hours#colon;NumberDisplay-->>-#colon;ClockDisplay:void
end
#colon;ClockDisplay->>+#colon;ClockDisplay:updateDisplay()
#colon;ClockDisplay->>+hours#colon;NumberDisplay:getDisplayValue()
hours#colon;NumberDisplay-->>-#colon;ClockDisplay:displayString
#colon;ClockDisplay->>+minutes#colon;NumberDisplay:getDisplayValue()
minutes#colon;NumberDisplay-->>-#colon;ClockDisplay:displayString
deactivate #colon;ClockDisplay
#colon;ClockDisplay-->>-YOU:void
Original Version: getTime()
%%{
init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#f69e9d',
'primaryTextColor': '#000',
'primaryBorderColor': '#000',
'lineColor': '#F8B229',
'secondaryColor': '#f4f4f4',
'activationBorderColor': '#000',
'tertiaryColor': '#fff'
}
}
}%%
sequenceDiagram
actor YOU
participant #colon;ClockDisplay
YOU->>+#colon;ClockDisplay: getTime()
#colon;ClockDisplay-->>-YOU:displayString
