QT 设计模式之 Observer 模式
(2013-07-01 14:38:49)
标签:
qt设计模式observer |
分类: QT设计模式 |
观察者模式(Observer)定义了对象间一对多的联系。当一个对象的状态发生变化时,所有与它有联系的观察者对象都会得到通知。观察者模式将被观察的目标和观察者解耦,一个目标可以有任意多的观察者,观察者也可以观察任意多的目标,构成复杂的联系,而每个观察者都不知道其他观察者的存在。
这里使用的是QT语言的实现,其实也就是C++实现,要是使用QT的话直接用信号槽连接机制会更好一些。
#include
#include
#include
#include
class Observer
{
public:
virtual void Update()=0;
};
class Subject
{
protected:
QList <</span>Observer *> list;
public:
void Attach(Observer *observer)
{
list.append(observer);
}
void Detach()
{
list.removeLast();
}
void Notify()
{
for(int i=0; i<</span> list.length();i++)
{
Observer *o= list.at(i);
o->Update();
}
}
};
class ContreteSubject:public Subject
{
private:
QString subjectSatus;
public:
QString getSubjectSatus()
{
return this->subjectSatus;
}
void setSubjectSatus(QString value)
{
this->subjectSatus=value;
}
};
class ConcreteObserver:public Observer
{
private:
QString name;
QString observerStatu;
ContreteSubject subject;
public :
ConcreteObserver(ContreteSubject subject,QString name)
{
this->subject=subject;
this->name=name;
}
void Update()
{
observerStatu=subject.getSubjectSatus();
qDebug()<<"Observer " << name << "'s now status is "
<< this->observerStatu;
}
};
class ConcreteObserverB:public Observer
{
private:
ContreteSubject subject;
public :
ConcreteObserverB(ContreteSubject subject )
{
this->subject=subject;
}
void Update()
{
QString observerStatu=subject.getSubjectSatus();
qDebug()<<"The another type observer" << " now status is "
<< observerStatu;
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ContreteSubject s;
s.setSubjectSatus("ABC");
ConcreteObserver ca(s,"1");
ConcreteObserver cb(s,"2");
ConcreteObserver cc(s,"3");
ConcreteObserverB b(s);
s.Attach(&ca);
s.Attach(&cb);
s.Attach(&cc);
s.Attach(&b);
s.Notify();
return a.exec();
}
运行结果:
Observer "1" 's now status is "ABC"
Observer "2" 's now status is "ABC"
Observer "3" 's now status is "ABC"
The another type observer now status is "ABC"

加载中…