#include #include #include class MoveObserver { public: virtual ~MoveObserver() = default; virtual void update_target(int x) = 0; }; class CruiseMissile : public MoveObserver { public: CruiseMissile(int x) : x{x} {} void update_target(int target_x) override { if ( x == target_x ) { std::cout << "Spot on!" << std::endl; } else { std::cout << "Move closer to " << target_x << std::endl; } } private: int x; }; class SpyDrone : public MoveObserver { public: SpyDrone(int x, int d) : x{x}, safe_dist{d} {} void update_target(int target_x) override { if ( std::abs(target_x - x) < safe_dist ) { std::cout << "Move away" << std::endl; } else { std::cout << "Move closer" << std::endl; } } private: int x; int safe_dist; }; class MoveNotifier { public: MoveNotifier() : v{} {} void subscribe(MoveObserver* o) { v.push_back(o); } void notify_move(int x) { for ( MoveObserver* o : v ) { o->update_target(x); } } private: std::vector v; }; int main() { // vektorn med spelobjekt (förenklat betraktar vi MoveObserver som spelobjekt) std::vector object_list { new SpyDrone{2, 5}, new SpyDrone{8, 3}, new CruiseMissile{4}, new CruiseMissile{9}, new SpyDrone{0, 0}, new CruiseMissile{10}, }; MoveNotifier pos_notifier{}; // vi anmäler att de 4 första objekten i object_list är intresserade av positionsuppdateringar for ( int i{}; i < 4; ++i ) { pos_notifier.subscribe( object_list.at(i) ); } // vi flyttar målet (kanske spelaren) till 6 olika positioner och // ser hur de observerande objekten svarar på positionsförändringen for ( int i{}; i <= 10; i+=2) { std::cout << "Target moved to " << i << std::endl; pos_notifier.notify_move(i); std::cout << std::endl; } for ( MoveObserver* o : object_list ) { delete o; } }