加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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" 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有