Java 设计模式之中介者学习与掌握

Posted 邹奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之中介者学习与掌握相关的知识,希望对你有一定的参考价值。

文章目录

定义

  • 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。

中介者模式又叫调停模式,它是迪米特法则的典型应用。


优点

  • 类之间各司其职,符合迪米特法则。
  • 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

缺点

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

模式的结构与实现

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

模式的结构

有下面 4 种角色:

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

模式的实现

  • 抽象中介者】,代码如下:
package com.example.designmodedemo.principle.mediator;

/**
 * 抽象中介者
 * 定义接口,声明注册方法和转发消息方法
 */
public interface Mediator 

    void register(Colleague colleague);// 注册

    void transmitMsg(Colleague colleague);// 转发消息



  • 具体中介者】,代码如下:
package com.example.designmodedemo.principle.mediator;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体中介者:实现抽象中介者接口
 */
public class MediatorIml implements Mediator

    private List<Colleague> colleagueList = new ArrayList<>();// 管理同事对象

    @Override
    public void register(Colleague colleague) 
        if (!colleagueList.contains(colleague))
            colleagueList.add(colleague);
            colleague.setMediator(this);
        
    

    @Override
    public void transmitMsg(Colleague colleague) 
        for (Colleague temp : colleagueList)
            if (temp != colleague)
                temp.receiveMsg();
            
        
    


  • 抽象同事类】,代码如下:
package com.example.designmodedemo.principle.mediator;

/**
 * 抽象同事类
 */
public abstract class Colleague 

    protected Mediator mediator;

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

    public abstract void sendMsg();// 发送消息

    public abstract void receiveMsg();// 接收消息



  • 具体同事类】,代码如下:
/**
 * 具体同事 1
 */
public class Sub1Colleague extends Colleague 
    @Override
    public void sendMsg() 
        System.out.println(":> 同事 1 发送消息");
        mediator.transmitMsg(this);// 委托中介者转发消息
    

    @Override
    public void receiveMsg() 
        System.out.println(":> 同事 1 收到消息");
    


/**
 * 具体同事 2
 */
public class Sub2Colleague extends Colleague 
    @Override
    public void sendMsg() 
        System.out.println(":> 同事 2 发送消息");
        mediator.transmitMsg(this);// 委托中介者转发消息
    

    @Override
    public void receiveMsg() 
        System.out.println(":> 同事 2 收到消息");
    


-【客户端】,调用代码如下:

	/**
     * 中介者模式
     */
    private void principle_mediator() 
        Mediator mediator = new MediatorIml();// 创建中介者对象
        // 创建同事对象
        Colleague sub1 = new Sub1Colleague();
        Colleague sub2 = new Sub2Colleague();
        // 中介者对象注册同事对象
        mediator.register(sub1);
        mediator.register(sub2);
        // 同事1 发送消息
        sub1.sendMsg();
        System.out.println(":> ======");
        // 同事2 发送消息
        sub2.sendMsg();
    
  • 【运行结果】,如下图示:


应用场景

  • 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。

技术永不眠!我们下期见!

以上是关于Java 设计模式之中介者学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章

Java 设计模式之中介者学习与掌握

Java 设计模式之代理 学习与掌握

Java 设计模式之装饰器学习与掌握

Java 设计模式之装饰器学习与掌握

Java 设计模式之建造者学习与掌握

Java 设计模式之建造者学习与掌握