@startuml skinparam classAttributeIconSize 0 ' --- Interfaces --- interface StreetSegmentObserver <> { } interface StreetSegmentSubject <> { } interface LabelManager <> { + adjustHeadValue(segment : StreetSegment) + getLabel(intersectionID : int) : Label } interface CandidateLabelManager <> { + getCandidateLabel() : Label } interface PermanentLabelManager <> { + getSmallestLabel() : Label + makePermanent(intersectionID : int) } interface ShortestPathAlgorithm <> { + findPath(origin : int, destination : int, net : StreetNetwork) : Map + addStreetSegmentObserver(observer : StreetSegmentObserver) + removeStreetSegmentObserver(observer : StreetSegmentObserver) + notifyStreetSegmentObservers(segmentIDs : List) } ' --- Main Classes --- class Label { - permanent : boolean - value : double - id : int - predecessor : StreetSegment + Label() + Label(id : int) + adjustValue(possibleValue : double, possiblePredecessor : StreetSegment) + getID() : int + getPredecessor() : StreetSegment + getValue() : double + isPermanent() : boolean + makePermanent() + setValue(value : double) } class StreetNetwork { - intersections : List + StreetNetwork() + addIntersection(index : int, intersection : Intersection) + getIntersection(index : int) : Intersection + size() : int + createStreetNetwork(streets : Map) : StreetNetwork } abstract class AbstractLabelManager { # labels : Label[] + AbstractLabelManager(networkSize : int) + adjustHeadValue(segment : StreetSegment) + getLabel(intersectionID : int) : Label } class CandidateLabelList { + NEWEST : String = "N" + OLDEST : String = "O" - candidates : List - policy : String + CandidateLabelList(policy : String, networkSize : int) + adjustHeadValue(segment : StreetSegment) + getCandidateLabel() : Label } class PermanentLabelList { + PermanentLabelList(networkSize : int) + adjustHeadValue(segment : StreetSegment) + getSmallestLabel() : Label + makePermanent(intersectionID : int) } class PermanentLabelHeap { - <> + PermanentLabelHeap(d : int, networkSize : int) + adjustHeadValue(segment : StreetSegment) + getSmallestLabel() : Label + makePermanent(intersectionID : int) - <> } class PermanentLabelBuckets { - <> + PermanentLabelBuckets(networkSize : int) + adjustHeadValue(segment : StreetSegment) + getSmallestLabel() : Label + makePermanent(intersectionID : int) - <> } abstract class AbstractShortestPathAlgorithm { - observers : Collection + AbstractShortestPathAlgorithm() + findPath(origin : int, destination : int, net : StreetNetwork) : Map + addStreetSegmentObserver(observer : StreetSegmentObserver) + removeStreetSegmentObserver(observer : StreetSegmentObserver) + notifyStreetSegmentObservers(segmentIDs : List) } class LabelCorrectingAlgorithm { - labels : CandidateLabelManager + LabelCorrectingAlgorithm(labels : CandidateLabelManager) + findPath(origin : int, destination : int, net : StreetNetwork) : Map } class LabelSettingAlgorithm { - labels : PermanentLabelManager + LabelSettingAlgorithm(labels : PermanentLabelManager) + findPath(origin : int, destination : int, net : StreetNetwork) : Map } ' --- GUI / Worker Classes --- class SwingWorker { } class PathFindingWorker { } class BackgroundTaskDialog { } abstract class AbstractModalDialog { } class "javax.swing.JDialog" as JDialog { } ' --- Updated Relationships --- ' Correction: ShortestPathAlgorithm extends StreetSegmentSubject StreetSegmentSubject <|-- ShortestPathAlgorithm ' Correction: PathFindingWorker implements StreetSegmentObserver StreetSegmentObserver <|.. PathFindingWorker ' Standard Hierarchy LabelManager <|-- CandidateLabelManager LabelManager <|-- PermanentLabelManager LabelManager <|.. AbstractLabelManager AbstractLabelManager <|-- CandidateLabelList CandidateLabelManager <|.. CandidateLabelList AbstractLabelManager <|-- PermanentLabelList PermanentLabelManager <|.. PermanentLabelList AbstractLabelManager <|-- PermanentLabelHeap PermanentLabelManager <|.. PermanentLabelHeap AbstractLabelManager <|-- PermanentLabelBuckets PermanentLabelManager <|.. PermanentLabelBuckets ShortestPathAlgorithm <|.. AbstractShortestPathAlgorithm AbstractShortestPathAlgorithm <|-- LabelCorrectingAlgorithm AbstractShortestPathAlgorithm <|-- LabelSettingAlgorithm SwingWorker <|-- PathFindingWorker PathFindingWorker -> ShortestPathAlgorithm : executes BackgroundTaskDialog -left-|> SwingWorker AbstractModalDialog -left-|> BackgroundTaskDialog JDialog -left-|> AbstractModalDialog @enduml