IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> GoF总结-20(中介者模式) -> 正文阅读

[Java知识库]GoF总结-20(中介者模式)

1. 概念

定义一个中介对象来封装一系列对象之间的交互,使原有对象之间耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
中介者模式是一种对象行为型模式。

2. 优点

  1. 类之间各司其职,符合迪米特法则。
  2. 降低了对象之间的耦合性,使得对象易于独立地被复用。
  3. 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

3. 缺点

中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。

4. 结构与实现

中介者模式实现的关键事找出“中介者”。

4.1 结构

主要角色:

  1. 抽象中介者角色:它事中介者的接口,提供了同事对象注册与转发同事对象抽象信息的抽象方法。
  2. 具体中介者角色:实现中介者接口,定义一个List来管理同事对象,协调各个同事对象之间的交互关系,因此它依赖于同事对象。
  3. 抽象同事类角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  4. 具体同事类角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
    在这里插入图片描述

4.2 实现

//抽象中介者
public abstract class Mediator {
    //接受同事注册的方法
    public abstract void register(Colleague colleague);

    //帮助转发消息的方法
    public abstract void relay(Colleague colleague);
}
//抽象同事类
public abstract class Colleague {
    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void send();

    public abstract void receive();
}
//具体中介者
public class ConcreteMeditor extends Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void register(Colleague colleague) {
        colleagues.add(colleague);
        colleague.setMediator(this);
    }

    @Override
    public void relay(Colleague colleague) {
        for (Colleague col :
                colleagues) {
            if (!colleague.equals(col)) {
                col.receive();
            }
        }
    }
}
//具体同事霍桑
public class HuoSang extends Colleague {
    @Override
    public void send() {
        System.out.println("霍桑今天吃黄焖鸡");
        mediator.relay(this);
    }

    @Override
    public void receive() {
        System.out.println("霍桑收到");
    }
}
//具体同事我
public class Me extends Colleague {
    @Override
    public void send() {
        System.out.println("我今天吃老碗面");
        mediator.relay(this);
    }

    @Override
    public void receive() {
        System.out.println("我收到");
    }
}
//具体同事虎桑
public class HuSang extends Colleague {
    @Override
    public void send() {
        System.out.println("虎桑今天吃小姜");
        mediator.relay(this);
    }

    @Override
    public void receive() {
        System.out.println("虎桑收到");
    }
}

测试

public class MediatorTest {
    @Test
    public void test1() {
        Mediator mediator = new ConcreteMeditor();
        Me me = new Me();
        HuoSang huoSang = new HuoSang();
        HuSang huSang = new HuSang();
        mediator.register(me);
        mediator.register(huoSang);
        mediator.register(huSang);
        me.send();
        huoSang.send();
        huSang.send();
    }
}

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:29:52  更:2022-04-07 22:34:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:36:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码