Template、Strategy、Observor属于构件协作类型的设计模式。
motivation:在目标对象状态发生改变时,所有订阅者将得到通知;构建消息通知依赖关系,并使之到达松耦合。
key interface or class:
1.observor—观察者,在目标状态更新发出通知时,自身进行更新操作(update);
2.subject—目标对象,可以增加(attach)和减少(detach)观察者,对所有观察者发出通知(notify)。
structure:
template codes:
观察者基类:
//观察者接口
class IObservor{
pubilc:
virtual void update()==0;
virtual ~IObservor(){}
protect:
//根据情况决定是否在此与目标对象进行耦合??
Subject mySubject;
}
//不同的观察者类型
class Observer1:IObservor{
public:
Observer1(Subject subject){
//构造函数,并选择订阅目标对象
this->mySubject =subject;
this->mySubject.attch(this);
}
void update(){
//实现该观察者的更新操作
}
}
//目标对象基类
class Subject{
private:
List<IObservor*> observersList;
int state;
puhlic:
Subject(){
//构造函数
}
int getState(){//获得目标当前状态}
void setState(int stateValue){//改变目标状态}
void attch(IObservor observor){
//增加观察者
observersList.add(observor);
}
void detach(IObservor observor){
//删减观察者
observersList.remove(observor);
}
void notify(){
//通知所有的观察者
List<IObservor*> iter = observersList.begin();
while(iter != observersList.end()){
iter->update();
}
}
}
summary:
1. observor模式可以使我们独立地改变目标和观察者,使二者达到松耦合;
2.目标发送通知时,无需指定观察者,通知自动扩散到订阅者;
3.订阅者自己决定是否订阅,目标对次一无所知;
4.observer模式是基于事件的UI框架常用的模式,也是MVC模式中常用的模式。