设计模式之观察者模式建议收藏

在日常生活中,交通信号灯指挥者日益拥挤的城市交通。红灯亮,汽车停止;绿灯亮,汽车继续前行;在这个过程中,交通信号灯是汽车的观察目标,而汽车则是观察者。随着交通信号灯的变化,汽车的行为也会随之变化,一盏

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

设计模式之观察者模式建议收藏此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

  在日常生活中,交通信号灯指挥者日益拥挤的城市交通。红灯亮,汽车停止;绿灯亮,汽车继续前行;在这个过程中,交通信号灯是汽车的观察目标,而汽车则是观察者。随着交通信号灯的变化,汽车的行为也会随之变化,一盏交通信号灯可以指挥多辆汽车。在软件系统中,有些对象之间也存在类似交通信号灯和汽车之间的关系,一个对象的状态或行为的变化将会导致其他对象的状态或者行为也发生改变,它们之间将产生联动,正所谓牵一发而动全身。为了更好地描述对象之间存在的这种一对多的联动,观察者模式应运而生。

一、多人联机对战游戏的设计

需求背景:M公司欲开发一款多人联机对战游戏,在游戏中,多个游戏玩家可以加入同一战队组成联盟,当战队中某一成员收到敌人攻击时将给所有其他盟友发送通知,盟友收到通知后将作出响应。M公司开发人员需要提供一个设计方案来实现战队成员之间的联动。

  M公司开发人员通过分析,发现在该系统中战队成员之间的联动过程可以简单描述如下:

  联盟成员收到攻击 => 发送通知给盟友 => 盟友作出响应

  如果每个联盟成员都需要持有盟友的信息才能及时通知每一位盟友,因此这样系统开销较大。因此,M公司开发人员决定引入一个新角色“战队控制中心”来负责维护和管理每个战队所有成员的信息,如下图所示:设计模式之观察者模式建议收藏

二 观察者模式

  观察者模式是一种使用频率最高的设计模式之一,用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。

2.1 观察者模式类图

  设计模式之观察者模式建议收藏

  注意:由于Player需要向控制中心发送消息,控制中心又需要给所有玩家发送消息,在实现过程中存在头文件相互引用的问题,特引入IControlCenter类。

2.2 代码实现

(1)抽象观察者类

class IObserver
{
public:
    IObserver(char *pName = NULL){}
    ~IObserver(){}

    virtual void Help() = 0;
    virtual void BeAttacked(IControlCenter *pControlCenter) = 0;
};

(2)实体CPlayer类

class Player : public IObserver
{
public:
    Player(char *pName = NULL)
    {
        size_t nLen = strlen(pName);
        memcpy(m_pName, pName, nLen + 1);
    }
    ~Player(){}

    void Help()
    {
        cout << m_pName << ":" << "坚持住,马上支援!" << endl;
    }

    void BeAttacked(IControlCenter *pControlCenter)
    {
        cout << m_pName << ":" << "我被攻击,请求支援!" << endl;
        pControlCenter->NotifyObserver(m_pName);
    }

private:
    char m_pName[NAME_LENGTH];
};

(3)抽象控制中心

#pragma once

class IControlCenter
{
public:
    IControlCenter(){}
    ~IControlCenter(){}

    virtual void NotifyObserver(char* pName) = 0;
};

(4)实体控制中心

#pragma once
#include <map>
using namespace std;

#include "IControlCenter.h"
#include "IObserver.h"
class CControlCenter:public IControlCenter
{
public:
    CControlCenter(){}
    ~CControlCenter(){}

    void Regesiter(char* pName, IObserver* pObserver)
    {
        m_ObserverMap[pName] = pObserver;
        cout << "通知:" << pName <<" " << "加入战队!" << endl;
    }

    void UnRegister(char *pName)
    {
        map<char*, IObserver*>::iterator iter;
        for (iter = m_ObserverMap.begin(); iter != m_ObserverMap.end(); iter ++)
        {
            if (0 == strcmp(pName, iter->first))
            {
                m_ObserverMap.erase(iter);
                cout << pName <<" " << "离开战队!" << endl;
                break;
            }
        }
    }

    void NotifyObserver(char* pName)
    {
        cout << "通知:" << "盟友们,"<< pName <<"正在被攻击" << endl;
        map<char*, IObserver*>::iterator iter;
        for (iter = m_ObserverMap.begin(); iter != m_ObserverMap.end(); iter ++)
        {
            if (0 != strcmp(pName, iter->first))
            {
                IObserver *pPlayer = iter->second;
                pPlayer->Help();
            }
        }
    }

private:
    map<char*, IObserver*> m_ObserverMap;
};

2.3 测试

(1)测试代码

#include "stdio.h"
#include "ControlCenter.h"
#include "IObserver.h"
void main()
{
    CControlCenter *pControlCenter = new CControlCenter();
    IObserver *pPlayer1 = new Player("张三");
    IObserver *pPlayer2 = new Player("李四");
    IObserver *pPlayer3 = new Player("王麻子");
    pControlCenter->Regesiter("张三", pPlayer1);
    pControlCenter->Regesiter("李四", pPlayer2);
    pControlCenter->Regesiter("王麻子",pPlayer3);
    pPlayer1->BeAttacked(pControlCenter);
}

(2)结果

 设计模式之观察者模式建议收藏

三、观察者模式与MVC

  在当前流行的MVC(Model-View-Controller)结构中也应用了观察者模式,它包含了3个角色:模型、视图和控制器。其中,模型可对应观察者模式中的观察目标,而视图则对应于观察者,控制器充当二者之间的中介者。当模型层的数据发生改变时,视图将会自动改变其显示内容,如下图所示:

设计模式之观察者模式建议收藏

四、观察者模式总结

4.1 主要优点

  (1)可以实现表示层和数据逻辑层的分离 => 各种不同的表示层可以充当具体观察者

  (2)支持广播通信,观察目标会向已注册的观察者对象发送通知 => 简化一对多系统设计的难度

  (3)增加新的观察者无须修改原有系统代码 => 满足开闭原则

4.2 主要缺点

  (1)如果一个观察目标有很多直接和间接的观察者 => 所有观察者收到通知会花费大量时间

  (2)如果观察者和观察目标之间存在循环依赖 => 可能导致系统崩溃

4.3 应用场景

  (1)一个抽象模型有两个方面,其中一个方面依赖于另一个方面 => 封装起来使其独立改变和复用

  (2)一个对象的改变将导致一个或多个其他对象也发生改变,但并不知道具体有多少个对象将要发生改变 => 最熟悉的陌生人

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120141.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 三、设计模式介绍—她是谁,我们要去哪里? #和设计模式一起旅行#

    模式模式(Pattern),指事物的标准样式,百度百科上面说的,其实说白了模式就是我们现在说的套路!模式 == 套路模式是一种思想,说大了特别的复杂和深奥,不管怎么样模式的使用可以解决特定场景下特定的问题!准确表达:模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。软件模式那么在软件中使用模式,就是软件模式(Software Pattern),用…

  • JS工厂模式_工厂模式进行封装

    JS工厂模式_工厂模式进行封装JS设计模式一:工厂模式

  • Java设计模式之创建型:单例模式

    Java设计模式之创建型:单例模式

  • 23种设计模式汇总整理

    设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式,共七种:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。其实还有两类:并发型模式和线程池模式。…

  • java prototype是什么,Java设计模式之原型模式(Prototype模式)介绍

    java prototype是什么,Java设计模式之原型模式(Prototype模式)介绍Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。如何使用原型模式因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式…

    2022年10月31日
  • ❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️

    ❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!金九银十已经来了,挺近大厂最好的机会已经来了!如果你是要找工作的,一定要抓住这个机会!前面已经整理了很多的面试资料:1,❤️爆肝!整理了一周的Spring面试大全【含答案】,吊打Java面试官【建议收藏】!❤️2,❤️肝完了,一天掌握数据结构和算法面试题,吊打面试官,建议收藏❤️3,❤️集合很简单?开什么玩笑?肝了一周,全是精华,万字讲解!面试再不怕集合问题了!!!❤️4,肝完了,总结了SpringBoot与缓存的知识点,快速掌

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号