- Öppna projektet i Visual Studio
- Tryck på Run
▶️ - Output visas i konsolen
Detta projekt är ett enkelt Smart Home system. Man kan styra en lampa, köra kommandon och byta mode.
Programmet visar hur ett system kan vara uppbyggt bakom kulisserna. Fokus är inte på grafik, utan på hur koden är strukturerad.
Syftet med uppgiften är att visa att jag kan använda designmönster i praktiken. Jag ska inte bara kunna dem i teori, utan också använda dem i kod.
Jag visar också att jag kan bygga ett system som är tydligt, modulärt och lätt att ändra.
Observer används för att skicka uppdateringar när något ändras. När lampan sätts på får flera delar information direkt. Jag har tre observers: Dashboard, Logger och Audit. Detta gör att flera delar kan reagera samtidigt utan att Lamp behöver känna till dem.
Command används för att kapsla in actions som objekt. Jag har TurnOnCommand som sätter på lampan. CommandInvoker kör kommandon och sparar dem i en lista. Jag kan också köra senaste kommandon igen (replay), vilket ger mer flexibilitet.
Strategy används för olika lägen i systemet. Jag har NormalMode, EcoMode och PartyMode. När man byter mode ändras systemets beteende utan att ändra annan kod. Det gör systemet mer flexibelt och lätt att bygga ut.
Facade används för att göra systemet enklare att använda. SmartHomeFacade samlar alla funktioner i en klass. Program.cs använder bara Facade istället för att prata direkt med alla klasser. Det gör koden ren och lätt att förstå.
Singleton används för Logger. Det betyder att det bara finns en instans av Logger i hela systemet. Alla delar använder samma logger, vilket gör loggning enkel och centraliserad.
Projektet är uppdelat i mappar baserat på ansvar:
- Core → gemensamma delar (Logger)
- Devices → enheter (Lamp)
- Observers → lyssnare
- Commands → kommandon och invoker
- Strategy → olika modes
- Facade → huvudkontroll
- Docs → klassdiagram (PDF)
SmartHomeHub
├── Core
│ └── Logger.cs
│
├── Devices
│ └── Lamp.cs
│
├── Observers
│ ├── IObserver.cs
│ ├── DashboardObserver.cs
│ ├── LoggerObserver.cs
│ └── AuditObserver.cs
│
├── Commands
│ ├── ICommand.cs
│ ├── TurnOnCommand.cs
│ └── CommandInvoker.cs
│
├── Strategy
│ ├── IModeStrategy.cs
│ ├── NormalMode.cs
│ ├── EcoMode.cs
│ └── PartyMode.cs
│
├── Facade
│ └── SmartHomeFacade.cs
│
├── Docs
│ └── SmartHome_UML_DrawIO_Style.pdf
│
├── Program.cs
└── README.md
Detta visar tydligt hur hela projektet är uppbyggt.
Klassdiagram finns i mappen Docs som PDF-fil.
Fil: Docs/SmartHome_UML_DrawIO_Style.pdf
Diagrammet visar hur klasserna hänger ihop och vilka relationer de har.
Normal Mode active
Dashboard: Lamp turned ON LOG: Lamp turned ON Audit: Lamp turned ON
Party Mode active
Dashboard: Lamp turned ON LOG: Lamp turned ON Audit: Lamp turned ON
Replaying last commands:
Dashboard: Lamp turned ON LOG: Lamp turned ON Audit: Lamp turned ON
Designmönster hjälper att göra kod mer strukturerad och flexibel. De gör det lättare att ändra och bygga ut systemet.
Men man ska inte alltid använda designmönster i små projekt, för det kan göra koden mer komplex än nödvändigt.
I detta projekt passar de bra eftersom flera delar jobbar tillsammans.