设计模式_中介者模式

news2024/10/7 6:45:13

中介者模式

介绍

设计模式定义案例问题堆积在哪里解决办法
中介者代替了多个对象之间的互动

使对象1 2 3 之间的互动
变为:
对象1->中介
对象2->中介
对象3->中介
好友之间
约饭
好友1 通知 好友2
-3
-4 等等
加一个群
谁想吃饭就
通知一下

类图

代码

角色

BasePeople        // 基类

FriendA

FriendB

FriendC               

FriendGroup        // 群

BasePeople       


public abstract class BasePeople
{
    public string name;

    public abstract void ReceiverMsg(string msg);

    public abstract void Send(string msg);
}

FriendA

using UnityEngine;

public class FriendA : BasePeople
{
    FriendA() { }
    public FriendA(string name)
    {
        this.name = name;
    }

    public override void ReceiverMsg(string msg)
    {
        Debug.Log(name + "接收:" + msg);
    }

    public override void Send(string msg)
    {
        Debug.Log(name + "发送:" + msg);
        FriendGroup.GetIns().SendAllPeopleMsg(name, msg);
    }
}

FriendB 类似A

FriendC类似A

FriendGroup 

using System.Collections.Generic;

public class FriendGroup 
{
   //---------------------------------------------
    static FriendGroup self = null;
    private FriendGroup() { }
    public static  FriendGroup GetIns()
    {
        if (null == self)
        {
            self = new FriendGroup();
        }

        return self;
    }

    //--------------------------------------------

    List<BasePeople> gruop = new List<BasePeople>();

    // 添加
    public void AddPeople(BasePeople friend)
    {
        if (null == friend)
            return;

        gruop.Add(friend);
    }

    // 发送
    public void SendAllPeopleMsg(string senderName, string msg)
    {
        foreach (var item in gruop)
        {
            if (senderName != item.name)
            {
                item.ReceiverMsg(msg);
            }
        }
    }

}

测试代码
 

using UnityEngine;

public class TestZJZ : MonoBehaviour
{
    void Start()
    {
        // 创建people
        BasePeople p1 = new FriendA("P1");
        BasePeople p2 = new FriendA("P2");
        BasePeople p3 = new FriendA("P3");

        // 创建群
        FriendGroup group = FriendGroup.GetIns();
        group.AddPeople(p1);
        group.AddPeople(p2);
        group.AddPeople(p3);

        p3.Send("晚上8点吃饭!");
    }
}

结果

总结

在 多对象之间互相通信 提炼出一个中介者 ,会让类图变得简单漂亮

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security认证架构介绍

在之前的Spring Security&#xff1a;总体架构中&#xff0c;我们讲到Spring Security整个架构是通过Bean容器和Servlet容器对过滤器的支持来实现的。我们将从过滤器出发介绍Spring Security的Servlet类型的认证架构。 1.AbstractAuthenticationProcessingFilter AbstractAut…

操作系统——进程互斥的软件实现算法(王道视频p27、课本ch6)

1.总结概览&#xff1a; 2.单标志[turn]法——算法代码&#xff1a; 可能违反“空闲让进” 3.双标志[flag[2]]先检查法——算法代码&#xff1a; 如果不能利用硬件的原语的话&#xff0c;就可能出现违反“忙则等待”的问题: 4.双标志[flag[2]]后检查法——算法代码&#xff1…

RT-Smart 应用开发笔记:fopen 造成文件被清空问题的分析记录

前言 RT-Smart 应用&#xff08;apps&#xff09;开发环境&#xff0c;ubuntu 20.04 win10 VS Code 最近在调试一个问题&#xff0c;需要使用 FILE 的 fopen、fread 等去读取处理一个大文件&#xff0c;为了尽快复现验证问题&#xff0c;随手搜了一下 fopen 等几个 API的用法…

Pytorch搭建DTLN降噪算法

前面介绍了几种轻量级网路结构的降噪做法&#xff0c;本文介绍DTLN—一种时频双核心网络降噪做法。 AI-GruNet降噪算法 AI-CGNet降噪算法 AI-FGNet降噪算法 Pytorch搭建实虚部重建AI-GruNet降噪算法 一、模型结构 DTLN来自[2005.07551] Dual-Signal Transformation LSTM N…

无代码的未来

随着无代码技术越来越成熟&#xff0c;很多web应用已经可以基于无代码平台进行开发。本文分析了4个最流行的无代码平台&#xff0c;并梳理了无代码行业今后可能的发展方向。原文: The future of NoCode 所有无代码编辑器都需要回答的问题 当需要选择无代码解决方案时&#xff0…

小白也能成功搭建网站

随着互联网的快速发展&#xff0c;拥有一个个人网站已经成为了越来越多人的追求。然而&#xff0c;对于编程知识不太了解的小白来说&#xff0c;搭建个人网站似乎是一件很困难的事情。但是&#xff0c;现在有了一个不需要编程的方法&#xff0c;小白也能够轻松建立自己的个人网…

高速DSP系统设计参考指南(六)锁相环(PLL)

&#xff08;六&#xff09;锁相环&#xff08;PLL&#xff09; 1.模拟锁相环2.数字锁相环3.PLL隔离技术 系统设计人员需要隔离PLL&#xff0c;使其免受内部和外部噪声的影响。PLL通常用作频率合成器&#xff0c;将输入时钟乘以一个整数。该整数是反馈计数器M除以输入计数器N的…

C++学习过程中的一些值得注意的小点(1)

一、内联函数 1.1内联函数的定义 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 call指令表明Add函数在被调用的时候建立了栈帧。如果在上述函数前增…

如何更换微信公众号主体?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不止局限…

java8 Optional理解及示例

大量判空的代码 实际中&#xff0c;对象不判空会导致空指针异常。 为了规避为指针&#xff0c;不得不写出这种非常冗长又丑陋的空指针判断。 public void tooMuchNull(Worker worker) {if (worker ! null) {Address addressworker.getAddress();if (address ! null) {String…

UVM 验证方法学之interface学习系列文章(八)《interface不小心引入X态问题》

前面的文章学习,想必大家都对interface 有了深入了解。大家可不要骄傲哦,俗话说:小心驶得万年船。今天,再给大家介绍一个工作中,不是经常遇到,但是一旦遇到,会让你纠结很久的事情。 前面文章提到,随着验证复杂度的不断增加,interface 的bind 的操作,是必不可少的用法…

1.1 网页的基本概念

思维导图&#xff1a; 网页设计基础知识 --- **导言&#xff1a;** 随着互联网的迅速蔓延&#xff0c;世界各地的数亿人群均可以通过网络实现聊天、购物、阅读新闻、查询天气等功能。而在幕后&#xff0c;是成千上万的网页支撑这一切。但这些网页是如何制作的&#xff1f;我们…

Unity之ShaderGraph如何实现靠近显示溶解效果

前言 今天我们来实现一个我再B站看到的一个使用LeapMotion实现的用手部触摸就可以显示的溶解效果。 效果如下图所示&#xff1a; 主要节点 Position&#xff1a;提供对网格顶点或片段的Position 的访问&#xff0c;具体取决于节点所属图形部分的有效着色器阶段。使用Space下…

无痕视频去水印方法分享-这些软件你值得拥有

怎么无痕视频去水印&#xff1f;喜欢剪视频的你是不是经常碰到这种烦人的事&#xff1f;就是每次在网上找到好看的视频素材&#xff0c;下载下来却总是带着各种各样的水印&#xff0c;这些水印不仅影响美观&#xff0c;还挡住了视频里重要的内容&#xff0c;如果你也遇到这种情…

JAVA基础-方法(5)

目录 1、方法介绍<br />2、方法的重载&#xff08;在同一个类中&#xff0c;方法名相同&#xff0c;列表参数不同&#xff08;数量不同&#xff0c;类型不同&#xff0c;顺序&#xff09;&#xff09;3、方法的重写&#xff08;方法的覆盖-参数类别相同&#xff0c;返回值…

java项目容器化(docker)部署注意点

cgroup 支持 从 jdk 8u121 开始支持&#xff0c;即低于这个版本无法使用容器特性 https://bugs.java.com/bugdatabase/view_bug.do?bug_id8170888 https://bugs.openjdk.org/browse/JDK-8170888 https://bugs.java.com/bugdatabase/view_bug.do?bug_id8175898 https://b…

EPLAN_008#3D布局图

一、新建页 多线原理图纸画好以后 打开布局空间导航器——右键——新建 二、插入箱柜 菜单栏——插入——箱柜 三、显示安装板 然后调整视角 四、插入线槽 菜单栏——插入——线槽——选择合适的线槽——确定 按A键可以切换线槽方向&#xff0c;如果位置不对&#xff0c;可以再…

redis的cluster

1.我们的哨兵模式中&#xff0c;当主节点挂掉以后&#xff0c;此时哨兵会重新进行选举&#xff0c;选举出新的主节点去对外提供写服务 在选举的过程中,他redis整个集群是不提供写服务的 &#xff08;因为此时我们哨兵对外提供写服务的只有Master&#xff09; 2.我们单节点的red…

NRK3301语音芯片在智能窗帘上的应用

窗帘是人们日常生活中所经常使用的家居产品&#xff0c;传统的窗帘大多都需要手动拉动窗帘使用&#xff1b;存在着拉拽费劲&#xff0c;挂钩容易掉落等问题。随着数字化转型的升级&#xff0c;推进了窗帘市场的高质量发展。智能窗帘也“适时出现”出现了&#xff0c;一款带有语…

CV计算机视觉每日开源代码Paper with code速览-2023.10.20

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【目标检测】Click on Mask: A Labor-efficient Annotati…