---オブザーバーモードを達成するために、ヘッドファーストデザインパターン-C ++

1.意図

Observerパターン(Observerパターン):オブジェクトの状態が変化したが、それに依存するすべてのオブジェクトが自動的に通知され、更新されている多くのカスタムオブジェクトの依存関係のうちの1種類、。

2.エイリアス

依存性(扶養)、パブリッシュ - サブスクライブ(パブリッシュ/サブスクライブ)モード。

3.動機:

 様々なタイプの緊密な結合を減らします。

ここでは、Java言語を使用してヘッドファーストデザインパターンのオブザーバーパターンは、C ++で実装されています。

Subject.h

#pragma once
#include<memory>
#include<list>
class Observer;
class Subject
{
public:
	virtual void registerObserver(Observer* obs) = 0;
	virtual void deleteObserver(Observer* obs) = 0;
	virtual void notifyObservers() = 0;
	
protected:
	std::list<Observer*> m_observers;
};

DerivedSubject.h

#pragma once
#include "Subject.h"
#include<memory>

class Observer;
class DerivedSubject : public Subject
{
public:
	DerivedSubject();
	~DerivedSubject();

	void registerObserver(Observer* obs)override;
	void deleteObserver(Observer* obs)override;
	void notifyObservers()override;

	float getTemperature();
	float getHumidity();
	float getPressure();
	//当从气象站得到更新观测值时, 通知观察者
	void measurementsChanged();
	void setMesurements(float temperature, float humidity, float pressure);
private:
	float m_temperature;
	float m_humidity;
	float m_pressure;
};

Observer.h

#pragma once
class Observer
{
public:
	virtual void update(float temp, float humidity, float pressure) = 0;
	virtual ~Observer() {};
};

DisplayElement.h

#pragma once
class DisplayElement
{
	virtual void display() = 0;
};

DerivedObserver.h

#pragma once
#include "Observer.h"
#include "DisplayElement.h"
#include<memory>
class Subject;
class DerivedObservers : public Observer, public DisplayElement
{
public:
	DerivedObservers(Subject* weatherData);
	~DerivedObservers();
	void update(float temp, float humidity, float pressure)override;
	void display()override;
private :
	float m_temperature;
	float m_humidity;
	Subject* m_pWeatherData;
};

SecondObserver.h

#pragma once
#include "Observer.h"
#include "DisplayElement.h"
#include<memory>
class Subject;
class secondObserver:public Observer, public DisplayElement
{
public:
	secondObserver(Subject* obj);
	~secondObserver();
	void update(float temp, float humidity, float pressure)override;
	void display()override;
private:
	float m_temperature;
	float m_humidity;
	Subject* m_pWeatherData;
};

 

実装のテーマ:

DerivedSubject.cpp

#include "pch.h"
#include "DerivedSubject.h"
#include"Observer.h"

DerivedSubject::DerivedSubject()
{
}


DerivedSubject::~DerivedSubject()
{
	if(m_observers.size()>0)
		m_observers.clear();
}

void DerivedSubject::registerObserver(Observer* obs)
{
	m_observers.push_back(obs);
}
void DerivedSubject::deleteObserver(Observer* obs)
{
	m_observers.remove(obs);
}
void DerivedSubject::notifyObservers()
{
	for (auto obs : m_observers)
	{
		obs->update(m_temperature, m_humidity, m_pressure);
	}
}

float DerivedSubject::getTemperature()
{
	return 0;
}
float DerivedSubject::getHumidity()
{
	return 0;
}
float DerivedSubject::getPressure()
{
	return 0;
}
void DerivedSubject::measurementsChanged()
{
	notifyObservers();
}
void DerivedSubject::setMesurements(float temperature, float humidity, float pressure)
{
	this->m_temperature = temperature;
	this->m_humidity = humidity;
	this->m_pressure = pressure;
	measurementsChanged();
}

 

オブザーバを達成するために

DerivedObserver.cpp

#include "pch.h"
#include "DerivedObservers.h"
#include "Subject.h"
#include <iostream>

DerivedObservers::~DerivedObservers()
{
	
}
DerivedObservers::DerivedObservers(Subject* weatherData)
{
	this->m_pWeatherData = weatherData;
	m_pWeatherData->registerObserver(this);
}

void DerivedObservers::update(float temp, float humidity, float pressure)
{
	this->m_temperature = temp;
	this->m_humidity = humidity;
	display();
}

void DerivedObservers::display()
{
	std::cout << "Current conditions: " << m_temperature << "F degrees and " << m_humidity << "% humidity" << std::endl;
}

 

SecondObserver.cpp

#include "pch.h"
#include "secondObserver.h"
#include <iostream>
#include"Subject.h"
secondObserver::secondObserver(Subject* weatherData)
{
	this->m_pWeatherData = weatherData;
	m_pWeatherData->registerObserver(this);
}


secondObserver::~secondObserver()
{
}
void secondObserver::update(float temp, float humidity, float pressure)
{
	this->m_temperature = temp;
	this->m_humidity = humidity;
	display();
}

void secondObserver::display()
{
	std::cout << "second conditions: " << m_temperature << "F degrees and " << m_humidity << "% humidity" << std::endl;
}

 

main.cppに

#include "pch.h"
#include <iostream>
#include "DerivedObservers.h"
#include "DerivedSubject.h"
#include"Observer.h"
#include"secondObserver.h"

int main()
{
	DerivedSubject* weatherData =new DerivedSubject;
	Observer* obj = new DerivedObservers(weatherData);
	Observer* sobj = new secondObserver(weatherData);
	weatherData->setMesurements(80, 65, 30.4f);
	weatherData->setMesurements(82, 70, 29.2f);
	weatherData->setMesurements(78, 90, 29.2f);
	std::cout << "------------------delete observer-------------------------" << std::endl;
	weatherData->deleteObserver(obj);
	weatherData->setMesurements(58, 40, 19.2f);
	system("pause");
}

 

出力:

公開された69元の記事 ウォン称賛10 ビュー30000 +

おすすめ

転載: blog.csdn.net/u010096608/article/details/103517655