设计模式—行为型模式之中介者模式

设计模式—行为型模式之中介者模式

中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,减少对象间混乱的依赖关系,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象行为型模式。

包含以下角色:

  • Mediator: 抽象中介者

  • ConcreteMediator: 具体中介者

  • Colleague: 抽象同事类

  • ConcreteColleague: 具体同事类

示例

如下图所示,如果我们要几架飞机,互相联系的话,会很麻烦。如果有一个中间塔台来联系,就会方便很多。

图示

代码如下:

/**
 * 抽象机长
 */
public abstract class AbstarctCaptain {
    //起飞
    abstract void fly();
    //降落
    abstract void land();
    //完成
    abstract void success();

}
/**
 * 塔台:中介者
 *
 * 网状变为星状
 */
public class ControlTower {
    private boolean canDo = true;

    //接受请求...
    public void acceptRequest(AbstarctCaptain captain,String action){
        if("fly".equals(action)||"land".equals(action)){
            if(canDo == true){
                System.out.println("允许......");
                canDo = false;
            }else {
                System.out.println("不允许.....");
            }
        }
        if("success".equals(action)){
            canDo = true;
        }
    }
}

具体机长:

public class CZ222 extends AbstarctCaptain{

    private ControlTower controlTower;
    public void setControlTower(ControlTower controlTower) {
        this.controlTower = controlTower;
    }

    @Override
    void fly() {
        System.out.println("请求起飞");
        this.controlTower.acceptRequest(this,"fly");
    }

    @Override
    void land() {
        System.out.println("请求降落");
        this.controlTower.acceptRequest(this,"land");
    }

    @Override
    void success() {
        System.out.println("成功");
        this.controlTower.acceptRequest(this,"success");
    }
}

内部包含塔台;

多个类

其余两个类也是如此;

测试类如下:

public class MediatorTest {
    public static void main(String[] args) {
        ControlTower controlTower = new ControlTower();
        CZ222 cz222 = new CZ222();
        cz222.setControlTower(controlTower);
        EU111 eu111 = new EU111();
        eu111.setControlTower(controlTower);
        
        cz222.fly();
        eu111.fly();
        cz222.success();
        eu111.fly();
        eu111.success();
    }
}

运行结果如下:

运行截图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的交流论坛设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue、HTML 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是…

What is `@Repository` does?

Repository 是Spring注解,标识数据访问层组件(DAO, Data Access Object) 当一个类被标记为 Repository 时: 1、组件扫描与自动代理: Spring通过组件扫描(Component Scan)机制发现带有 Reposit…

基于FPGAWS2812B的贪吃蛇方案设计(含源码)

第1章 基于FPGA&WS2812B的贪吃蛇方案设计 1.2 贪吃蛇游戏系统的功能需求分析 为了更好的实现我们的贪吃蛇游戏系统,我们需要对项目进行功能分析,利于我们对整个系统的分析、架构。 首先,对于整个游戏系统,我们需要界面来引…

ChatGPT Plus 经验分享:是否值得花钱升级?

ChatGPT Plus 经验分享:是否值得花钱升级? 五星上将麦克阿瑟曾经说过:“在有钱与没钱面前,我选择了or” ChatGPT 的每月订阅方案- ChatGPT Plus 已经推出一段时间了,目前的费用是$20 USD / 月(约TWD 610 / 月)。 Open…

STM32--7针0.96寸OLED屏幕显示(4线SPI)

本文介绍基于STM32F103C8T60.96寸OLED(7针)的显示(完整程序代码见文末链接) 一、简介 OLED,即有机发光二极管( Organic Light Emitting Diode)。 OLED 由于同时具备自发光,不需背光…

C程序技能:彩色输出

在终端上输出的字体总是单色,但在一些场景彩色输出更能满足需求,在Linux环境中,可以使用终端控制字符来设置输出字符的颜色,在部分版本的Windows系统中也可以使用。本文参考一些文献简要介绍一下在Windows下彩色输出的方法。 1. …

3D PDF查看器HOOPS Publish助力Smartscape拓展日本AEC市场!

​ 公司:Smartscape Co., Ltd. 行业:建筑、工程和施工(AEC) 软件:适用于AEC行业的3D PDF工具 软件开发工具包:Hoops Publish HOOPS_3D软件开发工具_HOOPS中文网慧都科技是HOOPS全套产品中国地区指定授权经销商,提供3D…

使用@Slf4j后引入log,idea标红

引入Slf4j注解 idea标红Cannot resolve symbol ‘log’ 引入Lombok插件 如果在Marketplace查不到时,不妨关闭菜单再打开试下

微信小程序canvas画布图片保存到相册官方授权、自定义授权、保存

关键步骤介绍 wx.getSetting可以获取授权信息。 wx.authorize首次授权时会打开弹框让用户授权,若用户已选择同意或拒绝,后续不会再显示授权弹框。 如果授权信息显示未进行相册授权,则打开自定义弹框(show_auth: true&#xff0…

【前端框架】Vue3合集

一、Vue3初识 1、create-vue create-vue是Vue官方新的脚手架工具,底层切换到了 vite (下一代前端工具链),为开发提供极速响应 前置条件:16.0或更高版本的Node.js 安装并执行 create-vue npm init vuelatest2、项目…

前端如何压缩图片在进行上传给后端

前端压缩图片我目前能想到的就是 通过canvas 改变图片的 画质去改变图片的大小。 解决方案如下: 1、首先获取图片的全部内容,然后转化为base64让他可以在页面上展示。 2、当我们获取到base64的图片的时候我们就可以获取图片的大小尺寸。 3、我们把这个图…

Notepad++运行C语言输出乱码

方法一:编码-编码字符集-中文-GB2312 这时原程序中文会变成乱码,我是重新输入中文 重新编译执行即可 缺陷:重开一个程序有中文还是会显示乱码,需要重新设置编码,比较麻烦 方法二:设置-首选项-新建-右侧编…

What does `ResponseEntity` do?

ResponseEntity 作为 Spring MVC controller层 的 HTTP response,包含 status code, headers, body 这三部分。 正常场景 RestController Slf4j public class SearchController {AutowiredUserService userService;RequestMapping(value "/getAllStudents4&…

F-Droid:开源Android应用的宝库

F-Droid:开源Android应用的宝库 引言 F-Droid是一个开源应用程序存储库,旨在为安卓用户提供自由、隐私和安全的应用程序。它最初于2010年由Ciaran Gultnieks创建,因为他认为Google Play Store上的应用程序不够透明和安全。F-Droid的目标是为…

【C语言知识】原码反码和补码

一,简介 总结进制转换,原码,反码和补码相关基础知识。 二,具体说明 2.1 十进制转二进制方法 14(D)转换为二进制为(0000 1110 ) -21(D)转换为二进制为(1001 0101),先…

Java中的Socket你了解吗

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

java基础 - 03 List之AbstractSequentialList、LinkedList

上一篇我们围绕了ArrayList以及List进行简单介绍,本篇我们将围绕AbstractSequentialList、LinkedList进行。 AbstractSequentialList AbstractSequentialList是Java集合框架中的一个抽象类,它实现了List接口,并且是针对顺序访问的列表数据结…

探索设计模式的魅力:工厂方法模式

工厂方法模式是一种创建型设计模式,它提供了一种创建对象的接口,但将具体实例化对象的工作推迟到子类中完成。这样做的目的是创建对象时不用依赖于具体的类,而是依赖于抽象,这提高了系统的灵活性和可扩展性。 以下是工厂方法模式的…

基于物联网设计的智能储物柜(4G+华为云IOT+微信小程序)

一、项目介绍 在游乐场、商场、景区等人流量较大的地方,往往存在用户需要临时存放物品的情况,例如行李箱、外套、购物袋等。为了满足用户的储物需求,并提供更加便捷的服务体验,当前设计了一款物联网智能储物柜。 该智能储物柜通…

矩阵快速幂技巧练习(一)— 经典牛问题

上一篇文章简单介绍了斐波那契数列的矩阵乘法,并做了一个小推广,这篇文章来小试牛刀,做一个经典的练习题。 求斐波那契数列矩阵乘法的方法 题目 第一年农场有一只成熟的母牛A,往后的每年: 每一只成熟的母牛都会生一只…