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;
    }
  • 相关阅读:
    normalize.css 中文版
    [转载]自适应高度输入框
    【转载】H5页面列表的无线滚动加载(前端分页)
    CSS设置table下tbody滚动条与thead对齐的方法
    [转载]Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件
    wordpress 目录、数据结构和解析原理
    WordPress基础知识:条件判断标签及用法大全
    主题如何添加tag标签页面
    WordPress进阶:[2]不同页面显示不同的侧边栏
    WordPress进阶:[1]怎样用tag标签做导航菜单
  • 原文地址:https://www.cnblogs.com/justkong/p/6321848.html
Copyright © 2011-2022 走看看