summaryrefslogtreecommitdiff
path: root/diagrams
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-11-20 21:39:18 -0800
committerFuwn <[email protected]>2025-11-20 21:53:25 -0800
commit5ccd4667082a7ba69b737d252e239c3ac77fe658 (patch)
treebbd4060335beb4332574993f499310b53ebed1d4 /diagrams
parentfeat: Implement Assignment 3 functionality (diff)
downloadcst276-5ccd4667082a7ba69b737d252e239c3ac77fe658.tar.xz
cst276-5ccd4667082a7ba69b737d252e239c3ac77fe658.zip
feat: Add Assignment 3 diagram sources
Diffstat (limited to 'diagrams')
-rw-r--r--diagrams/assignment_3/mmd/complete_framework_class_diagram.mmd167
-rw-r--r--diagrams/assignment_3/mmd/decorator_pattern.mmd45
-rw-r--r--diagrams/assignment_3/mmd/factory_pattern.mmd57
-rw-r--r--diagrams/assignment_3/mmd/framework_architecture.mmd52
-rw-r--r--diagrams/assignment_3/mmd/framework_vs_specialization.mmd20
-rw-r--r--diagrams/assignment_3/mmd/iterator_pattern.mmd34
-rw-r--r--diagrams/assignment_3/mmd/observer_pattern.mmd34
-rw-r--r--diagrams/assignment_3/mmd/strategy_pattern.mmd56
-rw-r--r--diagrams/assignment_3/mmd/system_flow.mmd31
-rw-r--r--diagrams/assignment_3/mmd/template_method_pattern.mmd26
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"