【行为型模式】中介者模式

embedded/2024/9/25 2:32:33/

一、中介者模式概述

        中介者模式定义用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。(对象行为型模式)

  • 中介者模式的优缺点
    • 优点
      • 1.简化了对象之间的交互;
      • 2.将各同事解耦;
      • 3.减少子类生成;
      • 4.可以简化各同事类的设计和实现。
    • 缺点
      • 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
  • 适用环境
    • 1.系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;
    • 2.一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象;
    • 3.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类
    • 4.我们所常知道的MVC模式中,controller就是我们所谓的中介者。

二、代码实现

中介者模式主要包含4个角色:

  • Mediator: 抽象中介者,是中介者的接口/抽象类;
  • ConcreteMediator: 具体中介者,中介者的具体实现,实现中介者接口,定义一个List来管理Colleague对象;
  • Colleague: 抽象同事类,定义同事类的接口/抽象类,保存中介者对象,实现同事类的公共方法;
  • ConcreteColleague: 具体同事类,实现抽象同事类。通过中介者间接完成具体同事类之间的通信交互。
        2.1 抽象中介者(Mediator)
package Mediator.example;
//抽象中介者
public abstract class Mediator {/**注册同事类*/public abstract void register(Colleague colleague);/**处理接收逻辑*/public abstract void operation(Colleague colleague);
}
        2.2 具体中介者(ConcreteMediator)
package Mediator.example;
import java.util.List;
import java.util.ArrayList;
//具体中介者类
public class ConcreteMediator extends Mediator {private List<Colleague> colleagues = new ArrayList<Colleague>();@Overridepublic void register(Colleague colleague) {// TODO Auto-generated method stubif (!colleagues.contains(colleague)) {colleagues.add(colleague);colleague.setMediator(this);}}@Overridepublic void operation(Colleague colleague) {// TODO Auto-generated method stubfor (Colleague coll : colleagues) {if (!coll.equals(colleague)) {coll.receive();}}}}
        2.3 抽象同事类(Colleague)
package Mediator.example;
//抽象同事类
public abstract class Colleague {protected Mediator mediator;public void setMediator(Mediator mediator) {this.mediator = mediator;}public abstract void receive();public abstract void send();
}
        2.4 具体同事类(ConcreteColleague1、ConcreteColleague2)
package Mediator.example;
//具体同事类1
public class ConcreteColleague1 extends Colleague {@Overridepublic void receive() {// TODO Auto-generated method stubSystem.out.println("具体同事类 ConcreteColleague1 接收请求");}@Overridepublic void send() {// TODO Auto-generated method stubSystem.out.println("具体同事类 ConcreteColleague1 发送请求");/*中介者进行转发*/mediator.operation(this);}}
package Mediator.example;
//具体同事类2
public class ConcreteColleague2 extends Colleague {@Overridepublic void receive() {// TODO Auto-generated method stubSystem.out.println("具体同事类 ConcreteColleague2 接收到请求");}@Overridepublic void send() {// TODO Auto-generated method stubSystem.out.println("具体同事类 ConcreteColleague2 发送请求");mediator.operation(this);}}
        2.5 客户端(Client)
package Mediator.example;public class Client {public static void main(String[] args) {Mediator concreteMediator = new ConcreteMediator();Colleague concreteColleague1 = new ConcreteColleague1();Colleague concreteColleague2 = new ConcreteColleague2();concreteMediator.register(concreteColleague1);concreteMediator.register(concreteColleague2);concreteColleague1.send();concreteColleague2.send();}
}
        2.6 UML图

三、代码结构图


http://www.ppmy.cn/embedded/12133.html

相关文章

如何写好SQL

SQL语法 CREATE TABLE CREATE TABLE table_name (column_1 datatype,column_2 datatype,column_3 datatype ); ALTER TABLE ALTER TABLE table_name ADD column_name datatype; UPDATE TABLE UPDATE table_name SET column1 value1, column2 value2, ... WHERE conditi…

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日&#xff0c;中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选&#xff0c;深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…

c++设计模式之桥接模式(拼接组合)

桥接模式&#xff1a;就是进行拼接组装 应用举例&#xff1a; 1.定义了形状&#xff0c;抽象形状接口&#xff0c;圆&#xff0c;矩形 2.定义了颜色&#xff0c;抽象颜色接口&#xff0c;红色&#xff0c;蓝色 3&#xff0c;怎么桥接&#xff0c;抽象具体形状和具体颜色的组合…

Jammy@Jetson Orin - Tensorflow Keras Get Started: 000 setup for tutorial

JammyJetson Orin - Tensorflow & Keras Get Started: 000 setup for tutorial 1. 源由2. 搭建环境2.1 安装IDE环境2.2 安装numpy2.3 安装keras2.4 安装JAX2.5 安装tensorflow2.6 安装PyTorch2.7 安装nbdiff 3. 测试DEMO3.1 numpy版本兼容问题3.2 karas API - model.compil…

在docker容器中编译 rk3588 ubuntu固件

文件准备 Linux SDK ---- rk3588_linux_release_20230114_v1.0.6c_0*Ubuntu根文件系统 ---- Ubuntu22.04-Xfce_RK3588_v3.11-27_20240410.img.7z 硬件环境 一个可联网的linux机器&#xff0c;并且装有docker 打包一个docker编译环境 Dockerfile内容 直接通过dockerfile构…

OpenHarmony开源鸿蒙NEXT星河版内核嵌入式编程

一、前景提要 2024年1月18日&#xff0c;华为放出HarmonyOS NEXT 鸿蒙星河版开发者预览版本&#xff08;不是HarmonyOS NEXT版&#xff0c;是HarmonyOS NEXT星河版&#xff09;&#xff0c;首次提到用鸿蒙内核&#xff08;暂命名&#xff09;取代了Linux内核。 该内核源码还未放…

项目实践---贪吃蛇小游戏(下)

对于贪吃蛇小游戏&#xff0c;最主要的还是主函数部分&#xff0c;这里就和大家一一列举出来&#xff0c;上一章已经写过头文件了&#xff0c;这里就不多介绍了。 首先就是打印桌面&#xff0c;也就是背景&#xff0c;则对应的代码为&#xff1a; void SetPos(short x, short …

构建NodeJS库--前端项目的打包发布

1. 前言 学习如何打包发布前端项目&#xff0c;需要学习以下相关知识&#xff1a; package.json 如何初始化配置&#xff0c;以及学习npm配置项&#xff1b; 模块类型type配置&#xff0c; 这是nodejs的package.json的配置main 入口文件的配置 webpack 是一个用于现代 JavaSc…