OOP基础:抽象 封装 多态 继承
OOP原则:封装变化
多用组合, 少用继承
针对接口编程, 不针对实现编程
为交互对象之间的松耦合设计而努力
观察者模式:在对象之间定义一对多的依赖,这样依赖, 当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
UML类图:
https://img-blog.csdn.net/20131211085641296watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHV0dWJva2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
具体实现:
class Subject{
public:
Subject();
virtual void registerObserver(Observer *temp=0;virtual void removeObserver(Observer *temp=0;virtual void notifyObservers()=0;virtual ~Subject(void);};
#pragma once
#include "subject.h"
#include <list>
#include "Observer.h"
class WeatherData :
public Subject
{
public:
WeatherData(void);
~WeatherData(void);
void registerObserver(Observer *temp);
void removeObserver( Observer *temp);
void notifyObservers();
void measurementsChanged();
void setMeasurements(float temper, float humid, float press);
private:
std::list<Observer *> obeservers;
float temperature;//温度
float humidity;//湿度
float pressure;//压力
};
#include "WeatherData.h"
WeatherData::WeatherData(void)
{
//obeservers = new std::list<Observer *>;
}
WeatherData::~WeatherData(void)
{
}
void WeatherData::registerObserver( Observer *temp)
{
obeservers.push_back(temp);
//obeservers->push_back(temp);
}
void WeatherData::removeObserver( Observer *temp)
{
obeservers.remove(temp);
}
void WeatherData::notifyObservers()
{
for(std::list<Observer *>::iterator iter = obeservers.begin(); iter != obeservers.end(); ++iter)
{
(*iter)->update(temperature, humidity, pressure);
}
}
void WeatherData::measurementsChanged()
{
notifyObservers();
}
void WeatherData::setMeasurements(float temper, float humid, float press)
{
temperature = temper;
humidity = humid;
pressure = press;
measurementsChanged();
}
CurrentConditionsObserver::CurrentConditionsObserver(void)
{
}
CurrentConditionsObserver::~CurrentConditionsObserver(void)
{
}
void CurrentConditionsObserver::display()
{
}
//推送消息这里 可以是 Subject *psubject 然后在内部自己取自己需要的关注的消息,从而达到解耦消息的目的。
void CurrentConditionsObserver::update(float temp, float humidity, float pressure)
{
std::cout << "CurrentConditionsObserver current data : temperature = " << temp << " humidity = " << humidity << " pressure = " << pressure << std::endl;
}
//继承 Observer
#pragma once
#include "observer.h"
class CurrentConditinsObserver2 :
public Observer
{
public:
CurrentConditinsObserver2(void);
~CurrentConditinsObserver2(void);
void update(float temp, float humidity, float pressure);
void display();
};
void CurrentConditinsObserver2::update(float temp, float humidity, float pressure)
{
std::cout << "CurrentConditionsObserver2 current data : temperature = " << temp << " humidity = " << humidity << " pressure = " << pressure << std::endl;
}
#include "stdafx.h"
#include "Observer.h"
#include "CurrentConditionsObserver.h"
#include "Subject.h"
#include "WeatherData.h"
#include "CurrentConditinsObserver2.h"
int _tmain(int argc, _TCHAR* argv[])
{
WeatherData WeatherDataTest = WeatherData();
Observer *pObserver = new CurrentConditionsObserver();
WeatherDataTest.registerObserver( pObserver);
WeatherDataTest.setMeasurements(100,200,300);
WeatherDataTest.removeObserver( pObserver);
//pObserver = NULL;
Observer *pObserver2 = new CurrentConditinsObserver2();
WeatherDataTest.registerObserver(pObserver2);
WeatherDataTest.setMeasurements(300,400,500);
delete pObserver;
delete pObserver2;
std::cin.get();
return 0;
}
运行结果:
OK.
<<有时候人并不是缺少方法,而是缺少一往无前的决心!>>