首页 > 其他分享 >设计模式—行为型模式之中介者模式

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

时间:2024-01-15 19:45:02浏览次数:26  
标签:fly success controlTower 中介 public 模式 设计模式 void

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

中介者模式(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();
    }
}

运行结果如下:

运行截图

标签:fly,success,controlTower,中介,public,模式,设计模式,void
From: https://www.cnblogs.com/nicaicai/p/17966160

相关文章

  • 部署模式理论
    单层架构模式单层架构模式是一种简单的架构模式,将整个应用程序的各个组件都集中在一个层级中。在这种架构模式中,应用程序的用户界面(UI)、业务逻辑和数据访问逻辑都在同一个层级中。这种架构模式的优点是简单和易于理解,因为所有的组件都在一个层级中,没有复杂的层级关系。它也具有......
  • 软件测试/测试开发/全日制|Page Object模式:为什么它是Web自动化测试的必备工具
    为UI页面写测试用例时(比如web页面,移动端页面),测试用例会存在大量元素和操作细节。当UI变化时,测试用例也要跟着变化,PageObject很好的解决了这个问题。使用UI自动化测试工具时(包括selenium,appium等),如果无统一模式进行规范,随着用例的增多会变得难以维护,而PageObject让......
  • 设计模式--简单工厂模式
    目录概念使用场景概念简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。在C++中,简单工厂模式可以通过一个工厂类来实现,该工厂类负责根据输入参数创建不同的对象实例。下面是一个简单的C++示例来说明简单工厂模式的实现:#include<iostr......
  • 添加头文件在某一种模式(Debug/Release)下 提示不存在对应的 .h 文件
    在C++引用头文件中,如在Debug模式下进行编译,可能此时本地环境中没有对应的***_d.lib文件,只有***.lib,就会提示对应的错误信息。如C++中Debug模式下#include<Python.h>会提示链接错误信息无法打开文件“python311_d.lib”,此时可以将项目修改为Release模式,或在包含头文件......
  • VisualStudio — Release 模式下进行调试
    VS在Release模式下进行调试时,需要在项目属性中进行配置,步骤如下:1.设置调试信息格式C/C++->常规->调试信息格式设为:用于“编辑并继续”的程序数据库(/ZI)2.禁用优化项如果需要在调试过程中,查看各种变量的信息,就需要禁用优化项,否则在单步调试时很多变量的信息被优......
  • Spring 中的设计模式详解
    1、控制反转(IoC)和依赖注入(DI)IoC是一个原则,而不是一个模式,以下模式(但不限于)实现了IoC原则。 控制反转怎么理解呢? 举个例子:"对象a依赖了对象b,当对象a需要使用对象b的时候必须自己去创建。但是当系统引入了IOC容器后,对象a和对象b之前就失去了直接的......
  • 设计模式--策略(strategy)模式
    策略模式概念策略模式是一种行为设计模式,它允许定义一系列算法,并将每个算法封装到一个对象中。这些算法对象可以相互替换,使得客户端调用算法的代码与具体算法的实现分离。在C++中,策略模式通常由一个接口类、具体策略类、上下文类和客户端代码组成。下面是一个使用C++实现策略模......
  • 设计模式
    单例模式的优点1)实例控制:Singleton会阻止其他对象实例化其自己的Singleton对象的副本,从而确保所有对象都访问唯一实例。2)灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程。5.2、单例模式的缺点1)开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的......
  • 关于ArcEngine在多线程模式下的注意点
    仅以我的环境来描述的我问题和解决方案,超出该范围的暂时没有考虑。一、环境ArcEngine10.2语言:C#.net版本:4.6.1二、需求创建GDB数据库,并从json文件把数据写入GDB中,包含了图形数据,为了兼顾效率,我使用了多线程来生成GDB,但也做了控制,一个线程只会对一个GDB进行操作。三、问题:......
  • 访问模式(visitor)
    1#include<iostream>2#include<string>3usingnamespacestd;45//访问者模式:核心叫做双重分发:两个多态:accept,visit67classXiaoMi;8classHuaWei;9classOppo;10classCellPhoneVisitor{11public:12virtualvoidvisit(Xia......