zoukankan      html  css  js  c++  java
  • 设计模式--观察者模式Observer(对象行为型)

    一、观察者模式

    观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多。

    二、UML类图

    三、示例

    //观察者
    class Observer  
    {
    public:
        Observer() {}
        virtual ~Observer() {}
        virtual void Update() {} 
    };
    //博客
    class Blog  
    {
    public:
        Blog() {}
        virtual ~Blog() {}
        void Attach(Observer *observer) { m_observers.push_back(observer); }     //添加观察者
        void Remove(Observer *observer) { m_observers.remove(observer); }        //移除观察者
        void Notify() //通知观察者
        {
            list<Observer*>::iterator iter = m_observers.begin();
            for(; iter != m_observers.end(); iter++)
                (*iter)->Update();
        }
        virtual void SetStatus(string s) { m_status = s; } //设置状态
        virtual string GetStatus() { return m_status; }    //获得状态
    private:
        list<Observer* > m_observers; //观察者链表
    protected:
        string m_status; //状态
    };
    
    //具体博客类
    class BlogCSDN : public Blog
    {
    private:
        string m_name; //博主名称
    public:
        BlogCSDN(string name): m_name(name) {}
        ~BlogCSDN() {}
        void SetStatus(string s) { m_status = "CSDN通知 : " + m_name + s; } //具体设置状态信息
        string GetStatus() { return m_status; }
    };
    //具体观察者
    class ObserverBlog : public Observer   
    {
    private:
        string m_name;  //观察者名称
        Blog *m_blog;   //观察的博客,当然以链表形式更好,就可以观察多个博客
    public: 
        ObserverBlog(string name,Blog *blog): m_name(name), m_blog(blog) {}
        ~ObserverBlog() {}
        void Update()  //获得更新状态
        { 
            string status = m_blog->GetStatus();
            cout<<m_name<<"-------"<<status<<endl;
        }
    };
    
    //测试案例
    int main()
    {
        Blog *blog = new BlogCSDN("wuzhekai1985");
        Observer *observer1 = new ObserverBlog("tutupig", blog);
        blog->Attach(observer1);
        blog->SetStatus("发表设计模式C++实现(15)——观察者模式");
        blog->Notify();
        delete blog; delete observer1;
        return 0;
    }
  • 相关阅读:
    NO OO NO LIFE:OO第二单元总结
    凡为过往,皆是序章——软工全系列个人总结
    Think on 小黄衫
    软工-结对编程作业#3
    你问我答,不亦乐乎——软工案例分析作业
    软工-结对编程作业#2
    软工-结对编程作业#1
    道法之间——软工第2次博客作业
    软工-个人阅读作业#1
    OO_Unit4 UML模型化设计总结
  • 原文地址:https://www.cnblogs.com/justkong/p/6321848.html
Copyright © 2011-2022 走看看