• c++设计模式:观察者模式


    主要思想:建立一个一对多的关系,当一个对象发生发生变化时,其他对象也发生变化。

    可以举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改 变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主与读者之间存在种一对多的依赖关系。下面给出相应的UML图设 计。

    #include <iostream>
    #include <list>
    #include <string>
    
    using namespace std;
    
    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 std::string GetStatus()
        {
            return m_status;
        }
    private:
        list<Observer* > m_observers;
    protected:
        std::string m_status;
    };
    
    class BlogBKY : public Blog
    {
    public:
        BlogBKY(string name):m_name(name) {}
        ~BlogBKY() {}
        void SetStatus(string s)
        {
            m_status = s ;
        }
        string GetStatus()
        {
            return m_status;
        }
    private:
        string m_name;
    };
    
    class ObserverBlog : public Observer
    {
    public:
        ObserverBlog(string name,Blog *blog):m_name(name),m_blog(blog)
        {
        
        }
        ~ObserverBlog() {}
        void Update()
        {
            std::string status = m_blog->GetStatus();
            cout << m_name  <<"-------" << status <<endl;
        }
    private:
        std::string m_name;
        Blog *m_blog;
    };
    #include "observer.h"
    int main()
    {
        Blog *blog = new BlogBKY("mcy");//实例化的目标,被关注的对象,他的动态要通知观察者。
        Observer *observer1 = new ObserverBlog("hello",blog);//粉丝创建实例,关注观察者。
        blog->Attach(observer1);//博士挂载自己的观察者
        blog->SetStatus("发表博客!");//博主动态改变
        blog->Notify();//博主通知观察者
        system("pause");
        //delete blog;
        //delete observer1;
        return 0;

    四个必须:

    Subject(目标)
    ——目标知道它的观察者。可以有任意多个观察者观察同一个目标;
    ——提供注册和删除观察者对象的接口。

    Observer(观察者)
    ——为那些在目标发生改变时需获得通知的对象定义一个更新接口。

    ConcreteSubject(具体目标)
    ——将有关状态存入各ConcreteObserver对象;
    ——当它的状态发生改变时,向它的各个观察者发出通知。

    ConcreteObserver(具体观察者)
    ——维护一个指向ConcreteSubject对象的引用;
    ——存储有关状态,这些状态应与目标的状态保持一致;
    ——实现Observer的更新接口以使自身状态与目标的状态保持一致。

  • 相关阅读:
    Discuz的sc 和tc版本有什么区别
    使用Word2010发布博客到博客园
    如何快速产生流量,流量精灵使用方法
    XP系统如何把桌面图标变大
    打印机后台程序没有运行怎么办
    CF无法全屏怎么办
    XP如何找到网上邻居
    P2P终结者和反P2P终结者如何使用
    PortableApps的使用方法
    JavaScript,JS如何控制input输入字符限制
  • 原文地址:https://www.cnblogs.com/mcy0808/p/10833716.html
Copyright © 2020-2023  润新知