From 3b3202e0c25051e12bf5c5b918b56a312c3be382 Mon Sep 17 00:00:00 2001 From: Armin Co <armin.co@hs-bochum.de> Date: Sun, 4 Oct 2020 17:51:04 +0200 Subject: [PATCH] Adding ObserverPattern --- CMakeLists.txt | 1 + src/observ/ObserverPattern.hpp | 35 ++++++++++++++++++++++++++ src/smart_grid/ModelState.cpp | 1 - src/smart_grid/ModelState.hpp | 5 +++- src/smart_grid/SmgStateMachine.hpp | 40 ++++++++++++++++++++++++++++++ src/smart_grid/StateLogger.hpp | 15 +++++++++++ 6 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 src/observ/ObserverPattern.hpp create mode 100644 src/smart_grid/SmgStateMachine.hpp create mode 100644 src/smart_grid/StateLogger.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 098a1c2..96c755b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ add_subdirectory(libs/spdlog) include_directories(src) include_directories(libs/spdlog/include) +include_directories(src/observ) include_directories(src/com) add_library(soc_com diff --git a/src/observ/ObserverPattern.hpp b/src/observ/ObserverPattern.hpp new file mode 100644 index 0000000..fe79426 --- /dev/null +++ b/src/observ/ObserverPattern.hpp @@ -0,0 +1,35 @@ +/// Subject of oberver pattern + +#ifndef OBSERVER_PATTERN_HPP +#define OBSERVER_PATTERN_HPP + +#include <vector> +#include <memory> + +/// Type sub has to be an observable subject. +template<typename T> +class IObserver +{ +public: + virtual void update(const T &subject) = 0; +}; + +template<typename T> +class Subject +{ +public: + virtual ~Subject() = default; + void attach(std::shared_ptr<IObserver<T>> observer){ + m_observers.push_back(observer); + } + + void notify() const{ + for (auto &observer : m_observers){ + observer.update(this); + } + } +private: + std::vector<std::shared_ptr<IObserver<T>>> m_observers; +}; + +#endif \ No newline at end of file diff --git a/src/smart_grid/ModelState.cpp b/src/smart_grid/ModelState.cpp index 241b3cc..6e5bf82 100644 --- a/src/smart_grid/ModelState.cpp +++ b/src/smart_grid/ModelState.cpp @@ -114,5 +114,4 @@ void ModelState::next_hour() update_power_production(); update_modell(); print_states(); - notify(); } \ No newline at end of file diff --git a/src/smart_grid/ModelState.hpp b/src/smart_grid/ModelState.hpp index 86c9012..7026932 100644 --- a/src/smart_grid/ModelState.hpp +++ b/src/smart_grid/ModelState.hpp @@ -10,6 +10,7 @@ #include "spdlog/spdlog.h" #include "SmartGridModell.hpp" +#include "ObserverPattern.hpp" struct MaxPower { static constexpr double village = 600; @@ -56,7 +57,8 @@ struct PowerUsage double sum() { return village + industry; } }; -class ModelState + +class ModelState : Subject<ModelState> { public: ModelState(SmartGridModell &modell); @@ -72,6 +74,7 @@ private: void update_modell(); void print_states(); + static constexpr double solar_size{10}; static constexpr double windpark_size{1.0}; static constexpr double village_size{10}; diff --git a/src/smart_grid/SmgStateMachine.hpp b/src/smart_grid/SmgStateMachine.hpp new file mode 100644 index 0000000..6dcb770 --- /dev/null +++ b/src/smart_grid/SmgStateMachine.hpp @@ -0,0 +1,40 @@ +/// + +#ifndef SMG_STATE_MACHINE_HPP +#define SMG_STATE_MACHINE_HPP + +#include "ModelState.hpp" +#include "SmartGridModell.hpp" + +enum class MainState +{ + Simulation, + ManualControl +}; + +enum class SimSate +{ + Entry, + Do, + Exit +}; + +enum class ManualSate +{ + Entry, + Do, + Exit +}; + + +class SmgStateMachine +{ +public: + void run(); + +private: + SmartGridModell m_modell; + ModelState m_state; +}; + +#endif \ No newline at end of file diff --git a/src/smart_grid/StateLogger.hpp b/src/smart_grid/StateLogger.hpp new file mode 100644 index 0000000..2ab362f --- /dev/null +++ b/src/smart_grid/StateLogger.hpp @@ -0,0 +1,15 @@ +/// + +#ifndef STATE_LOGGER_HPP +#define STATE_LOGGER_HPP + +#include "ModelState.hpp" +#include "ObserverPattern.hpp" + +class StateLogger : IObserver<ModelState> +{ +public: + virtual void update(const ModelState &state) override; +}; + +#endif \ No newline at end of file -- GitLab