diff options
| author | Fuwn <[email protected]> | 2025-11-20 21:39:18 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-11-20 21:53:25 -0800 |
| commit | 5ccd4667082a7ba69b737d252e239c3ac77fe658 (patch) | |
| tree | bbd4060335beb4332574993f499310b53ebed1d4 /diagrams/assignment_3 | |
| parent | feat: Implement Assignment 3 functionality (diff) | |
| download | cst276-5ccd4667082a7ba69b737d252e239c3ac77fe658.tar.xz cst276-5ccd4667082a7ba69b737d252e239c3ac77fe658.zip | |
feat: Add Assignment 3 diagram sources
Diffstat (limited to 'diagrams/assignment_3')
| -rw-r--r-- | diagrams/assignment_3/mmd/complete_framework_class_diagram.mmd | 167 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/decorator_pattern.mmd | 45 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/factory_pattern.mmd | 57 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/framework_architecture.mmd | 52 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/framework_vs_specialization.mmd | 20 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/iterator_pattern.mmd | 34 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/observer_pattern.mmd | 34 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/strategy_pattern.mmd | 56 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/system_flow.mmd | 31 | ||||
| -rw-r--r-- | diagrams/assignment_3/mmd/template_method_pattern.mmd | 26 |
10 files changed, 522 insertions, 0 deletions
diff --git a/diagrams/assignment_3/mmd/complete_framework_class_diagram.mmd b/diagrams/assignment_3/mmd/complete_framework_class_diagram.mmd new file mode 100644 index 0000000..6d884a3 --- /dev/null +++ b/diagrams/assignment_3/mmd/complete_framework_class_diagram.mmd @@ -0,0 +1,167 @@ +classDiagram + class Entity { + <<abstract>> + +int Id + +string Type + +(int x, int y) Location + +(int x, int y) Direction + +bool IsAlive + +IMovementStrategy MovementStrategy + +IFeedingStrategy FeedingStrategy + +List~string~ PreyTypes + +Entity Prey + -List~Entity~ _observers + +Attach(observer: Entity) + +Detach(observer: Entity) + +Notify() + +Update(subject: Entity) + +Move() + +Feed() + +CanEat(targetType: string) bool + +CalculateDirectionToTarget(target: (int, int)) (int, int) + +DistanceTo(target: (int, int)) double + } + + class Morg { + +Morg(id, location, direction) + } + + class Simulator~T~ { + <<abstract>> + #List~T~ _entities + #const double FEEDING_DISTANCE + +AddEntity(entity: T) + +GetAllEntities() IEnumerable~T~ + +CreateIterator() IEntityIterator~T~ + +Run(runTime: int) + #ProcessTimeStep() + #FindPreyIfNeeded(entity: T) + #CheckAndFeed(entity: T) + #FindNearestPrey(predator: T) Entity* + } + + class Dish { + +AddMorg(morg: Morg) + +GetAllMorgs() List~Morg~ + #FindNearestPrey(predator: Morg) Entity* + } + + class IMovementStrategy { + <<interface>> + +Move(entity: Entity, newLocation: (int, int)) + } + + class MovementStrategyPaddles { + +Move(entity: Entity, newLocation: (int, int)) + } + + class MovementStrategyOozes { + +Move(entity: Entity, newLocation: (int, int)) + } + + class IFeedingStrategy { + <<interface>> + +Feed(predator: Entity, prey: Entity) + } + + class FeedingStrategyAbsorbs { + +Feed(predator: Entity, prey: Entity) + } + + class FeedingStrategyEnvelops { + +Feed(predator: Entity, prey: Entity) + } + + class Reader { + <<abstract>> + +ReadLine() string* + +EndOfStream bool + +Close() + } + + class FileReader { + -StreamReader _streamReader + +ReadLine() string* + } + + class ReaderDecorator { + <<abstract>> + #Reader _reader + +ReadLine() string* + } + + class CSVReader { + +ReadLine() string* + +ReadCSVLine() string[]* + } + + class EntityReader~T~ { + <<abstract>> + #IEntityFactory~T~ _factory + +ReadEntity(id: int) T* + } + + class MorgReader { + +ReadEntity(id: int) Morg* + } + + class IEntityFactory~T~ { + <<interface>> + +CreateEntity(id, type, x, y, movement, feeding) T + +CreateMovementStrategy(movementType) IMovementStrategy + +CreateFeedingStrategy(behavior) IFeedingStrategy + } + + class MorgFactory { + +CreateEntity(...) Morg + +CreateMovementStrategy(...) IMovementStrategy + +CreateFeedingStrategy(...) IFeedingStrategy + -ParsePreyTypes(feedingParts) List~string~ + } + + class IEntityIterator~T~ { + <<interface>> + +HasNext() bool + +Next() T* + +Reset() + } + + class EntityIterator~T~ { + -List~T~ _entities + -int _currentIndex + +HasNext() bool + +Next() T* + +Reset() + } + + class Program { + +Main() + } + + Entity <|-- Morg + Simulator~T~ <|-- Dish + Entity --> IMovementStrategy : uses + Entity --> IFeedingStrategy : uses + Entity --> Entity : Observer Pattern + IMovementStrategy <|.. MovementStrategyPaddles + IMovementStrategy <|.. MovementStrategyOozes + IFeedingStrategy <|.. FeedingStrategyAbsorbs + IFeedingStrategy <|.. FeedingStrategyEnvelops + Reader <|-- FileReader + Reader <|-- ReaderDecorator + ReaderDecorator <|-- CSVReader + ReaderDecorator <|-- EntityReader~T~ + EntityReader~T~ <|-- MorgReader + EntityReader~T~ --> IEntityFactory~T~ : uses + IEntityFactory~T~ <|.. MorgFactory + MorgFactory --> Morg : creates + MorgFactory --> IMovementStrategy : creates + MorgFactory --> IFeedingStrategy : creates + Simulator~T~ --> IEntityIterator~T~ + IEntityIterator~T~ <|.. EntityIterator~T~ + Dish --> Morg + Program --> Dish + Program --> FileReader + Program --> CSVReader + Program --> MorgReader + Program --> MorgFactory diff --git a/diagrams/assignment_3/mmd/decorator_pattern.mmd b/diagrams/assignment_3/mmd/decorator_pattern.mmd new file mode 100644 index 0000000..5bf05a5 --- /dev/null +++ b/diagrams/assignment_3/mmd/decorator_pattern.mmd @@ -0,0 +1,45 @@ +classDiagram + class Reader { + <<abstract>> + +ReadLine() string* + +EndOfStream bool + +Close() + } + + class FileReader { + -StreamReader _streamReader + +ReadLine() string* + } + + class ReaderDecorator { + <<abstract>> + #Reader _reader + +ReadLine() string* + } + + class CSVReader { + +ReadLine() string* + +ReadCSVLine() string[]* + } + + class EntityReader~T~ { + <<abstract>> + #IEntityFactory~T~ _factory + +ReadEntity(id: int) T* + } + + class MorgReader { + +ReadEntity(id: int) Morg* + } + + Reader <|-- FileReader : concrete + Reader <|-- ReaderDecorator : abstract decorator + ReaderDecorator <|-- CSVReader : decorates with CSV parsing + ReaderDecorator <|-- EntityReader~T~ : decorates with entity creation + EntityReader~T~ <|-- MorgReader : Morg specialisation + ReaderDecorator *-- Reader : wraps + + note for ReaderDecorator "Decorator wraps Reader component" + note for CSVReader "Adds CSV parsing functionality" + note for EntityReader~T~ "Adds entity creation using Factory" + note for MorgReader "Morg-specific entity creation" diff --git a/diagrams/assignment_3/mmd/factory_pattern.mmd b/diagrams/assignment_3/mmd/factory_pattern.mmd new file mode 100644 index 0000000..78a04d4 --- /dev/null +++ b/diagrams/assignment_3/mmd/factory_pattern.mmd @@ -0,0 +1,57 @@ +classDiagram + class IEntityFactory~T~ { + <<interface>> + +CreateEntity(id, type, x, y, movement, feeding) T + +CreateMovementStrategy(movementType) IMovementStrategy + +CreateFeedingStrategy(behavior) IFeedingStrategy + } + + class MorgFactory { + +CreateEntity(...) Morg + +CreateMovementStrategy(...) IMovementStrategy + +CreateFeedingStrategy(...) IFeedingStrategy + -ParsePreyTypes(feedingParts) List~string~ + } + + class Entity { + <<abstract>> + } + + class Morg { + } + + class IMovementStrategy { + <<interface>> + } + + class MovementStrategyPaddles { + } + + class MovementStrategyOozes { + } + + class IFeedingStrategy { + <<interface>> + } + + class FeedingStrategyAbsorbs { + } + + class FeedingStrategyEnvelops { + } + + IEntityFactory~T~ <|.. MorgFactory : implements + MorgFactory ..> Morg : creates + MorgFactory ..> IMovementStrategy : creates + MorgFactory ..> IFeedingStrategy : creates + Entity <|-- Morg + IMovementStrategy <|.. MovementStrategyPaddles + IMovementStrategy <|.. MovementStrategyOozes + IFeedingStrategy <|.. FeedingStrategyAbsorbs + IFeedingStrategy <|.. FeedingStrategyEnvelops + Morg --> IMovementStrategy + Morg --> IFeedingStrategy + + note for MorgFactory "Creates Morg instances with +configured strategies and prey types +from file input" diff --git a/diagrams/assignment_3/mmd/framework_architecture.mmd b/diagrams/assignment_3/mmd/framework_architecture.mmd new file mode 100644 index 0000000..744f29f --- /dev/null +++ b/diagrams/assignment_3/mmd/framework_architecture.mmd @@ -0,0 +1,52 @@ +graph TD + subgraph "Framework Layer" + A[Entity<br/>Abstract Base] + B[Simulator~T~<br/>Abstract with Template Method] + C[EntityReader~T~<br/>Abstract] + D[IEntityFactory~T~<br/>Interface] + E[IEntityIterator~T~<br/>Interface] + end + + subgraph "Morg Specialisation" + F[Morg<br/>Inherits Entity] + G[Dish<br/>Inherits Simulator~Morg~] + H[MorgReader<br/>Inherits EntityReader~Morg~] + I[MorgFactory<br/>Implements IEntityFactory~Morg~] + end + + subgraph "Strategy Pattern" + J[IMovementStrategy] + K[IFeedingStrategy] + L[MovementStrategyPaddles] + M[MovementStrategyOozes] + N[FeedingStrategyAbsorbs] + O[FeedingStrategyEnvelops] + end + + subgraph "Decorator Pattern" + P[FileReader] + Q[CSVReader] + R[MorgReader] + end + + A --> F + B --> G + C --> H + D --> I + E --> S[EntityIterator~T~] + + F --> J + F --> K + J --> L + J --> M + K --> N + K --> O + + P --> Q + Q --> R + R --> H + + I --> F + I --> J + I --> K +
\ No newline at end of file diff --git a/diagrams/assignment_3/mmd/framework_vs_specialization.mmd b/diagrams/assignment_3/mmd/framework_vs_specialization.mmd new file mode 100644 index 0000000..e5dab65 --- /dev/null +++ b/diagrams/assignment_3/mmd/framework_vs_specialization.mmd @@ -0,0 +1,20 @@ +graph LR + subgraph "Framework - Abstract Layer" + A[Entity<br/>Abstract Base Class] + B[Simulator~T~<br/>Abstract Template Method] + C[EntityReader~T~<br/>Abstract] + D[IEntityFactory~T~<br/>Interface] + end + + subgraph "Morg Specialisation - Concrete Layer" + E[Morg<br/>Concrete Entity] + F[Dish<br/>Concrete Simulator] + G[MorgReader<br/>Concrete Reader] + H[MorgFactory<br/>Concrete Factory] + end + + A -->|inherits| E + B -->|inherits| F + C -->|inherits| G + D -->|implements| H +
\ No newline at end of file diff --git a/diagrams/assignment_3/mmd/iterator_pattern.mmd b/diagrams/assignment_3/mmd/iterator_pattern.mmd new file mode 100644 index 0000000..5b8775c --- /dev/null +++ b/diagrams/assignment_3/mmd/iterator_pattern.mmd @@ -0,0 +1,34 @@ +classDiagram + class IEntityIterator~T~ { + <<interface>> + +HasNext() bool + +Next() T* + +Reset() + } + + class EntityIterator~T~ { + -List~T~ _entities + -int _currentIndex + +HasNext() bool + +Next() T* + +Reset() + } + + class Simulator~T~ { + <<abstract>> + -List~T~ _entities + +CreateIterator() IEntityIterator~T~ + } + + class Dish { + } + + IEntityIterator~T~ <|.. EntityIterator~T~ + Simulator~T~ --> IEntityIterator~T~ : creates + Simulator~T~ <|-- Dish + EntityIterator~T~ *-- List~T~ : iterates over + + note for Simulator~T~ "Provides iterator for +entity collections" + note for EntityIterator~T~ "Iterates over entities +in the simulator" diff --git a/diagrams/assignment_3/mmd/observer_pattern.mmd b/diagrams/assignment_3/mmd/observer_pattern.mmd new file mode 100644 index 0000000..f23196e --- /dev/null +++ b/diagrams/assignment_3/mmd/observer_pattern.mmd @@ -0,0 +1,34 @@ +classDiagram + class Entity { + <<Subject & Observer>> + -List~Entity~ _observers + +Entity Prey + +Attach(observer: Entity) + +Detach(observer: Entity) + +Notify() + +Update(subject: Entity) + +Move() + } + + class Morg { + } + + Entity <|-- Morg + + note for Entity "Entity can be both Subject (prey) +and Observer (predator) + +- When prey moves, it Notifies observers +- Observers Update() to follow prey +- Enables predator-prey following behavior" + + Entity --> Entity : observes + Entity --> Entity : subject + + note for Entity "Observer Flow: +1. Predator finds prey +2. Predator.Attach(prey) +3. Prey moves +4. Prey.Notify() +5. Predator.Update(prey) +6. Predator turns toward prey" diff --git a/diagrams/assignment_3/mmd/strategy_pattern.mmd b/diagrams/assignment_3/mmd/strategy_pattern.mmd new file mode 100644 index 0000000..7b6dfc8 --- /dev/null +++ b/diagrams/assignment_3/mmd/strategy_pattern.mmd @@ -0,0 +1,56 @@ +classDiagram + class Entity { + <<abstract>> + +IMovementStrategy MovementStrategy + +IFeedingStrategy FeedingStrategy + +Move() + +Feed() + } + + class Morg { + } + + class IMovementStrategy { + <<interface>> + +Move(entity: Entity, newLocation: (int, int)) + } + + class IFeedingStrategy { + <<interface>> + +Feed(predator: Entity, prey: Entity) + } + + class MovementStrategyPaddles { + +Move(...) + } + + class MovementStrategyOozes { + +Move(...) + } + + class FeedingStrategyAbsorbs { + +Feed(...) + } + + class FeedingStrategyEnvelops { + +Feed(...) + } + + class MorgFactory { + +CreateMovementStrategy(...) IMovementStrategy + +CreateFeedingStrategy(...) IFeedingStrategy + } + + Entity <|-- Morg + Entity --> IMovementStrategy : uses + Entity --> IFeedingStrategy : uses + IMovementStrategy <|.. MovementStrategyPaddles + IMovementStrategy <|.. MovementStrategyOozes + IFeedingStrategy <|.. FeedingStrategyAbsorbs + IFeedingStrategy <|.. FeedingStrategyEnvelops + MorgFactory ..> IMovementStrategy : creates + MorgFactory ..> IFeedingStrategy : creates + + note for Entity "Any combination of movement +and feeding behaviors +configured via Factory" diff --git a/diagrams/assignment_3/mmd/system_flow.mmd b/diagrams/assignment_3/mmd/system_flow.mmd new file mode 100644 index 0000000..d3bd105 --- /dev/null +++ b/diagrams/assignment_3/mmd/system_flow.mmd @@ -0,0 +1,31 @@ +sequenceDiagram + participant P as Program + participant FR as FileReader + participant CR as CSVReader + participant MR as MorgReader + participant MF as MorgFactory + participant M as Morg + participant D as Dish + participant S as Simulator~Morg~ + + P->>FR: new FileReader("morgs.txt") + FR->>CR: new CSVReader(fileReader) + CR->>MR: new MorgReader(csvReader, factory) + MR->>MF: CreateEntity(...) + MF->>MF: CreateMovementStrategy() + MF->>MF: CreateFeedingStrategy() + MF->>MF: ParsePreyTypes() + MF-->>MR: Morg instance + MR-->>P: Morg + P->>D: AddMorg(morg) + D->>S: AddEntity(morg) + + P->>D: Run(RUN_TIME) + D->>S: Run(runTime) + loop Template Method + S->>S: ProcessTimeStep() + S->>S: FindPreyIfNeeded() + S->>M: Move() + M->>M: Notify() + S->>S: CheckAndFeed() + end diff --git a/diagrams/assignment_3/mmd/template_method_pattern.mmd b/diagrams/assignment_3/mmd/template_method_pattern.mmd new file mode 100644 index 0000000..96e7605 --- /dev/null +++ b/diagrams/assignment_3/mmd/template_method_pattern.mmd @@ -0,0 +1,26 @@ +classDiagram + class Simulator~T~ { + <<abstract>> + +Run(runTime: int) + #ProcessTimeStep() + #FindPreyIfNeeded(entity: T) + #CheckAndFeed(entity: T) + #FindNearestPrey(predator: T) Entity* + } + + class Dish { + #FindNearestPrey(predator: Morg) Entity* + } + + Simulator~T~ <|-- Dish + + note for Simulator~T~ "Template Method Pattern: +Run() defines the algorithm +ProcessTimeStep() is the template +FindPreyIfNeeded() is virtual +CheckAndFeed() is virtual +FindNearestPrey() is abstract" + + note for Dish "Concrete implementation: +Implements FindNearestPrey() +for Morg-specific prey finding" |