行为型模型 观察者模式

行为型模型 观察者模式

Subject(被观察者)
        被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
        被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
        接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
        观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

典型应用
        - 侦听事件驱动程序设计中的外部事件
        - 侦听/监视某个对象的状态变化
        - 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者
适用于:
        定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。
使用场景:
        定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。

/**
 * 行为型模型 观察者模式
 * Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
 * Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
 *
 */

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>

// 前置声明
class Secretary;

class PlayerObserver
{
public:
    PlayerObserver(std::string name, Secretary * secretary)
    {
        m_name = name;
        m_secretary = secretary;
    }
    void update(std::string action)
    {
        std::cout << "观察者收到 action: " << action << std::endl;
    }
private:
    std::string m_name;
    Secretary * m_secretary;
};

class Secretary
{
public:
    void addObserver(PlayerObserver * o)
    {
        v.push_back(o);
    }
    void Notify(std::string action)
    {
        for (std::vector<PlayerObserver *>::iterator it = v.begin(); it != v.end(); it++)
        {
            (*it)->update(action);
        }
    }
    void setAction(std::string action)
    {
        m_action = action;
        Notify(m_action);
    }
private:
    std::string m_action;
    std::vector<PlayerObserver *> v;
};

void mytest()
{
    // subject 被观察者
    Secretary *s1 = new Secretary();
    // 具体的观察者 被通知对象
    PlayerObserver *po1 = new PlayerObserver("小张", s1);
    PlayerObserver *po2 = new PlayerObserver("小李", s1);
    s1->addObserver(po1);
    s1->addObserver(po2);
    s1->setAction("老板来了");
    s1->setAction("老板走了");

    delete po1;
    po1 = nullptr;
    delete po2;
    po2 = nullptr;
    delete s1;
    s1 = nullptr;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
时间: 2024-11-08 03:37:22

行为型模型 观察者模式的相关文章

第21章 行为型模式—观察者模式

1. 观察者模式(Observer Pattern)的定义 (1)定义:定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. (2)观察者模式的结构和说明(拉模型) ①Subject:目标对象,通常具如的功能:一个目标可以被多个观察者观察:目标提供对观察者的注册和退订的维护:当目标的状态发生变化时,目标负责通知所有注册的.有效的观察者. ②Observer:定义观察者的接口,提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,可以在这

设计模式3 创建型模型

设计模式3 创建型模型 目录: 简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 简单工厂 模型 [email protected]:~$ cat main.cpp  //设计模式:简单工厂 模型 #include<iostream> using namespace std; class Fruit { public: Fruit(string kind) { this->kind = kind; if(kind == "apple") {} else if (ki

行为型模型 迭代器模式

行为型模型 迭代器模式 GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示. 为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口. Iterator(迭代器接口):         该接口必须定义实现迭代功能的最小定义方法集         比如提供hasNext()和next()方法. ConcreteIterator(迭代器实现类):         迭代器接口Iterator的实现类.可以根据具体情况加以实现. Aggregate(容器接口)

行为型模型 空对象模式

行为型模型 空对象模式 /** * 行为型模型 空对象模式 * 创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方. * 不要为了屏蔽null而使用空对象,应保持用null,远比用非null的值来替代"无值"要好.(慎用) * */ #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> void mytest() { return; } int m

行为型模型 模版模式

行为型模型 模版模式 应用场景 Template Method模式一般应用在具有以下条件 的应用中:        - 具有统一的操作步骤或操作过程         - 具有不同的操作细节         - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同总结:        在抽象类中统一操作步骤,并规定好接口:让子类实现接口.这样可以把各个具体的子类和操作步骤接耦合 AbstractClass:        抽象类的父类 ConcreteClass:         具

行为型模型 策略模式

行为型模型 策略模式 Strategy:        策略(算法)抽象. ConcreteStrategy         各种策略(算法)的具体实现. Context         策略的外部封装类,或者说策略的容器类.根据不同策略执行不同的行为.策略由外部环境决定. 好处:         //算法的实现 和 客户端的使用 解耦合         //使得算法变化,不会影响客户端 适用于:         准备一组算法,并将每一个算法封装起来,使得它们可以互换. /** * 行为型模型

行为型模型 状态模式

行为型模型 状态模式 Context:用户对象        拥有一个State类型的成员,以标识对象的当前状态: State:接口或基类         封装与Context的特定状态相关的行为: ConcreteState:接口实现类或子类         实现了一个与Context某个状态相关的行为. 适用于:         对象的行为,依赖于它所处的当前状态.行为随状态改变而改变的场景. /** * 行为型模型 状态模式 * State模式也叫状态模式,是行为设计模式的一种. * St

行为型模型 解释模型

行为型模型 解释模型 /** * 行为型模型 解释模型 * 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. * */ #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> class Context { public: Context(int num) { m_num = num; } void setNum(int num) { m_num = num

行为型模型 责任链模式

行为型模型 责任链模式 Handler         处理类的抽象父类. concreteHandler         具体的处理类. 责任链优缺点 优点:         1.责任的分担.每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则.         2.可以根据需要自由组合工作流程.如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程.         3.类与类之间可以以松耦合的形式加以组织.缺点: