Java设计模式--中介者模式

简介: 中介者模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。Mediator PatternDefine an object that encapsulates how a set of objects interact. Mediator promotes loose couplin

中介者模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Mediator Pattern

Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from refering to each other explicitly, and it lets you vary their interaction independently.

类图

模式的结构与使用

中介者模式的结构中包括四种角色。
+ 中介者(Mediator):中介者使一个接口,该接口定义了用于同事(Colleague)对象之间进行通信的方法。
+ 具体中介者(Concrete Mediator):具体中介者是实现中介者接口的类。具体中介者需要包含所有具体同事(Concrete Colleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信请求。
+ 同事(Colleague):一个接口,规定了具体同事需要实现的方法。
+ 具体同事(Concrete Colleague):实现同事接口的类。具体同事需要包含具体中介者的引用,一个具体同事需要和其他同事交互时,只需将自己的请求通知给它所包含的具体中介者即可。

简单的例子

同事接口类Colleague.java

package Mediator;

public interface Colleague {
    public void giveMess(String[] mess);
    public void receiverMess(String mess);
    public void setName(String name);
    public String getName();
}

本问题直接需要一个具体中介者ConcreteMediator.java

package Mediator;

public class ConcreteMediator {
    ColleagueA colleagueA;
    ColleagueB colleagueB;
    ColleagueC colleagueC;

    public void registerColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void registerColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }

    public void registerColleagueC(ColleagueC colleagueC) {
        this.colleagueC = colleagueC;
    }

    public void deliverMess(Colleague colleague, String[] mess) {
        if (colleague == colleagueA) {
            if (mess.length >= 2) {
                colleagueB.receiverMess(colleague.getName() + mess[0]);
                colleagueC.receiverMess(colleague.getName() + mess[1]);
            }
        }
        if (colleague == colleagueB) {
            if (mess.length >= 2) {
                colleagueA.receiverMess(colleague.getName() + mess[0]);
                colleagueC.receiverMess(colleague.getName() + mess[1]);
            }
        }
        if (colleague == colleagueC) {
            if (mess.length >= 2) {
                colleagueA.receiverMess(colleague.getName() + mess[0]);
                colleagueB.receiverMess(colleague.getName() + mess[1]);
            }
        }
    }
}

ConcreteColleague的实现类ColleagueA.java

package Mediator;

public class ColleagueA implements Colleague {

    ConcreteMediator cm;
    String name;

    public ColleagueA(ConcreteMediator cm) {
        this.cm = cm;
        cm.registerColleagueA(this);
    }

    @Override
    public void giveMess(String[] mess) {
        cm.deliverMess(this, mess);
    }

    @Override
    public void receiverMess(String mess) {
        System.out.println(name + "收到的信息");
        System.out.println("\t" + mess);
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

ConcreteColleague的实现类ColleagueB.java

package Mediator;

public class ColleagueB implements Colleague {

    ConcreteMediator cm;
    String name;

    public ColleagueB(ConcreteMediator cm) {
        this.cm = cm;
        cm.registerColleagueB(this);
    }

    @Override
    public void giveMess(String[] mess) {
        cm.deliverMess(this, mess);
    }

    @Override
    public void receiverMess(String mess) {
        System.out.println(name + "收到的信息");
        System.out.println("\t" + mess);
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

ConcreteColleague的实现类ColleagueC.java

package Mediator;

public class ColleagueC implements Colleague {

    ConcreteMediator cm;
    String name;

    public ColleagueC(ConcreteMediator cm) {
        this.cm = cm;
        cm.registerColleagueC(this);
    }

    @Override
    public void giveMess(String[] mess) {
        cm.deliverMess(this, mess);
    }

    @Override
    public void receiverMess(String mess) {
        System.out.println(name + "收到的信息");
        System.out.println("\t" + mess);
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

测试类Application.java

package Mediator;

public class Appication {

    public static void main(String[] args) {
        ConcreteMediator cm = new ConcreteMediator();
        ColleagueA colleagueA = new ColleagueA(cm);
        ColleagueB colleagueB = new ColleagueB(cm);
        ColleagueC colleagueC = new ColleagueC(cm);
        colleagueA.setName("A国");
        colleagueB.setName("B国");
        colleagueC.setName("C国");
        String[] messA = {"要求归还曾抢夺的100斤土豆", "要求归还曾抢夺的20头牛"};
        colleagueA.giveMess(messA);

        String[] messB = {"要求归还曾抢夺的10只公鸡", "要求归还曾抢夺的15匹马"};
        colleagueB.giveMess(messB);

        String[] messC = {"要求归还曾抢夺的300斤小麦", "要求归还曾抢夺的50头驴"};
        colleagueC.giveMess(messC);
    }
}

运行截图

中介者模式的优点

  • 可以避免许多的对象为了之间的通信而相互显示引用,否则,不仅系统难于维护,而且也使其他系统难以复用这些对象。
  • 可以通过中介者将原本分布于多个对象之间的交互行为集中在一起。当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用。
  • 具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码不会影响到其他同事。
  • 具体中介者集中了同事之间是如何交互的细节,使系统比较清楚地知道整个系统中同事是如何交互的。
  • 当一些对象想相互通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使这些对象互相通信。
    注:由于具体中介者集中了同事之间是如何交互的细节,可能使具体具体中介者变得非常复杂,增加了维护的难度。

适用中介者模式的情景

  • 许多对象以复杂的方式交,所导致的依赖关系使系统难以理解和维护。
  • 一个对象引用其他很多对象,导致难以复用该对象。

下载源码请到

MyGitHub

目录
相关文章
|
2月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
247 2
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
281 0
|
4月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
280 35
|
2月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
241 8
|
7月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
167 0
|
4月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
4月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
7月前
|
设计模式 Java 程序员
【设计模式】【行为型模式】中介者模式(Mediator)
一、入门 什么是中介者模式? 中介者模式(Mediator Pattern)是一种行为设计模式,旨在减少对象之间的直接依赖,通过引入一个中介者对象来协调多个对象之间的交互。这种模式特别适用于对象间存在
161 9
|
10月前
|
设计模式 供应链 安全
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽
中介者模式定义了一个中介对象来封装一组对象之间的交互方式。中介者使得各对象之间不需要显式地相互引用,从而降低了它们之间的耦合度。它通过将对象之间的交互逻辑集中到中介者对象中,使得系统的结构更加清晰,易于维护和扩展。
218 18
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽