设计模式学习笔记(C++实现)(二十)--观察者模式

1.观察者模式简介

  • 英文名称
    Observer
  • 主要目的
    定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。
  • 使用场景
    1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面;
    2.当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变;
    3.当一个对象必须通知其他对象,而它又不能假定其他对象是谁。

2.观察者模式代码示例

  • 测试平台
    1.开发语言:C++
    2.开发工具:VS2015
    3.操作系统:Win7 X64
  • 代码说明
    1.Observer–抽象观察者,定义基本接口;
    2.MarketEmployee、DevelopEmployee–具体观察者类,分别用于表示市场部和研发部职员;
    3.Subject–抽象通知者,提供基本接口定义;
    4.Assistant–具体通知者,总经理助理。

    注意:
    1.本例用观察者模式来描述助理通知事件。

  • 具体代码

class Observer
{
public:
    //函数功能:观察者构造函数
    //参数:    const string strName[IN]                -- 姓名
    //返回值:  无
    Observer(const string strName)
    {
        this->m_strName = strName;
    }

    //函数功能:更新当前状态
    //参数:    const string strNotifyInfo[IN]           -- 通知内容
    //返回值:  无
    virtual void UpdateState(const string strNotifyInfo) = 0;

protected:
    string m_strName;                                   //观察者姓名
};

//市场部人员,具体观察者
class MarketEmployee :public Observer
{
public:
    //函数功能:观察者构造函数
    //参数:    const string strName[IN]                -- 姓名
    //返回值:  无
    MarketEmployee(const string strName) :Observer(strName)
    {
    }

    //函数功能:更新当前状态
    //参数:    const string strNotifyInfo[IN]           -- 通知内容
    //返回值:  无
    virtual void UpdateState(const string strNotifyInfo)
    {
        cout << "市场部" <<this->m_strName<<"收到通知:" << strNotifyInfo << endl;
        if ("研发部加班" == strNotifyInfo)
        {
            cout << "市场部" << this->m_strName << "太好了,没咱啥事了,可以正常下班了!" << endl;
        }
        else if ("全体加班" == strNotifyInfo)
        {
            cout << "市场部"<<this->m_strName<<"崩溃了,又要加班!" << endl;
        }
    }
};

//研发部人员,具体的观察者
class DevelopEmployee :public Observer
{
public:
    //函数功能:观察者构造函数
    //参数:    const string strName[IN]                -- 姓名
    //返回值:  无
    DevelopEmployee(const string strName) :Observer(strName)
    {
    }

    //函数功能:更新当前状态
    //参数:    const string strNotifyInfo[IN]           -- 通知内容
    //返回值:  无
    virtual void UpdateState(const string strNotifyInfo)
    {
        cout << "研发部" << this->m_strName << "收到通知:" << strNotifyInfo << endl;
        if ("研发部加班" == strNotifyInfo)
        {
            cout << "研发部" << this->m_strName << "崩溃了,又是咱们部门加班!" << endl;
        }
        else if ("全体加班" == strNotifyInfo)
        {
            cout << "研发部" << this->m_strName << "好吧,又加班!不过还好有其他人陪。" << endl;
        }
    }
};

//抽象通知者,提供基本接口定义
class Subject
{
public:
    //函数功能:增加一个观察者
    //参数:    Observer* pObserver[IN]           -- 新的观察者
    //返回值:  无
    virtual void Attach(Observer* pObserver) = 0;

    //函数功能:移除一个观察者
    //参数:    Observer* pOberser[IN]           -- 要移除的观察者
    //返回值:  无
    virtual void Detach(Observer* pObserver) = 0;

    //函数功能:发出通知
    //参数:    const string strNotifyInfo[IN]        -- 通知内容
    //返回值:  无
    virtual void Notify(const string strNotifyInfo) = 0;
protected:

    list<Observer*> m_ObserverList;                     //观察者列表
};

//具体通知者,总经理助理
class Assistant :public Subject
{
    //函数功能:增加一个观察者
    //参数:    Observer* pObserver[IN]           -- 新的观察者
    //返回值:  无
    void Attach(Observer *pObserver)
    {
        if (pObserver != NULL)
        {
            m_ObserverList.push_back(pObserver);
        }
    }

    //函数功能:移除一个观察者
    //参数:    Observer* pOberser[IN]           -- 要移除的观察者
    //返回值:  无
    void Detach(Observer *pOberser)
    {
        if (pOberser != NULL)
        {
            this->m_ObserverList.remove(pOberser);
        }
    }

    //函数功能:发出通知
    //参数:    const string strNotifyInfo[IN]        -- 通知内容
    //返回值:  无
    void  Notify(const string strNotifyInfo)
    {
        for each (Observer* pServer in this->m_ObserverList)
        {
            pServer->UpdateState(strNotifyInfo);
        }
    }
};


int main()
{
    //创建通知者,即总经理助理
    Subject* pAssistant = new Assistant();  

    //创建观察者
    Observer* pXiaoWang = new MarketEmployee("小王");
    Observer* pXiaoLi = new DevelopEmployee("小李");
    Observer* pXiaoZhang = new DevelopEmployee("小张");

    //加入观察队列
    pAssistant->Attach(pXiaoWang);
    pAssistant->Attach(pXiaoLi);
    pAssistant->Attach(pXiaoZhang);

    //事件1
    pAssistant->Notify("全体加班");
    cout << endl;

    //事件2
    pAssistant->Notify("研发部加班");
    cout << endl;

    //小张和助理闹矛盾了,助理将小张移出通知序列
    pAssistant->Detach(pXiaoZhang);

    //新事件
    pAssistant->Notify("全体加班");
    cout << endl;

    delete pXiaoWang;
    pXiaoWang = NULL;

    delete pXiaoLi;
    pXiaoLi = NULL;

    delete pXiaoZhang;
    pXiaoZhang = NULL;

    getchar();
    return 0;
}
  • 输出结果
    这里写图片描述

栏目导航
上一篇:设计模式学习笔记(C++实现)(十九)–备忘录模式
下一篇:无

参考文献:
1.《设计模式:可复用面向对象软件的基础》

猜你喜欢

转载自blog.csdn.net/u014337397/article/details/80501286