标准 专业
多元 极客

设计模式实验室(5)——中介者模式

什么是中介者模式

中介者模式是一种对象行为型模式。

中介者模式是使用一个中介者对象来封装对象之间的调用关系,使对象之间不需要显示的相互引用,从而降低了对象之间的耦合度,并且可以独立地改变它们之间的交互。

看了上面的简介,如果你是一个Java开发者,瞬间回想起一个技术词汇IOC

中介者模式其实就是将对象之间错综复杂的调用关系,揽在自己手里,通过中介者缕清,对象不需要考虑被调用对象,完全安安信息的做自己。

如果码农的饭碗中的一部分——主板,不工作了,会造成什么影响?电脑启动不起来,即使起来了可能无限蓝屏。所以主板在计算机中,属于非常重要的一环,它连通了显卡、显示器、CPU等等。

这就是一个中介者

中介者模式是迪米特法则的典型应用。

核心结构

  • Mediator。抽象中介者,声明交互方法,用于调停同事类之间的调用关系。
  • ConcreteMediator。具体中介者,实现了抽象中介者中的方法,并且维持了各个同事对象之间的引用。
  • Colleague。抽象同事类,声明具体同事类扩展的方法,并且定义了一些具体同事类公有的方法,并且维持了一个抽象中介者对象的引用,具体同事类可以根据这个引用完成相互调用。
  • ConcreteColleague,具体同事类,实现或重写抽象同事类的方法,并通过引用与其他具体同事类进行交互。

类图展示

中介者模式

代码分析

作为北漂,几乎每年都会经历一次痛不欲生的经历——找房子,各种真假难辨的中介信息。而租房,房东,中介者,三个角色就形成了典型的中介者模式。

我们就以此例来实现中介者模式。

首先我们需要定义抽象同事类——人:

/**

 * Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.

 * 中介者模式——抽象同事

 */

public abstract class Person {

    protected Mediator mediator;

    protected String name;

    protected String message;

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

    public String getName() {
        return name;
    }

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

    public String getMessage() {
        return message;
    }

    public abstract void lease(String request);

    public abstract void looking(String request);
}

接着我们实现两种具体同事类。

房东:

/**
 * Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
 */
public class Landlord extends Person {

    @Override
    public void lease(String request) {
        this.mediator.notification(request);
    }

    @Override
    public void looking(String request) {
        this.message = request;
    }
}

租客:

/**
 * Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
 */
public class Tenant extends Person {

    @Override
    public void lease(String request) {

    }

    @Override
    public void looking(String request) {
        this.message = request;
    }
}

接下来就是核心结构——中介者。

抽象中介者——代表所有的中介者的基本能力:

/**
 * Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
 * 中介者模式——抽象中介
 */
public abstract class Mediator {

    protected List<Person> personList = new ArrayList<Person>();

    public void register(Person person) {
        personList.add(person);
        person.setMediator(this);
    }

    public abstract void notification(String request);
}

接下来就是一个一个的中介者——具体中介者:

/**
 * Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
 */
public class HomeChain extends Mediator {

    @Override
    public void notification(String request) {
        System.out.println("Matching...");
        for (Person person : personList) {
            if ((null != person.getMessage()) && (person.getMessage().contains(request))) {
                System.out.println("Dear " + person.getName() + ", a quality housing is meeting your requirements, the address has already send to your telephone.");
            }
        }
    }
}

惯例,测试代码:

/**
 * Created by <sunshine> mysunshinedreams@163.com on 2017/6/22.
 * 中介者模式测试
 */
public class MediatorTest {

    public static void main(String[] args) {
        Mediator mediator = new HomeChain();
        Person landlord = new Landlord();
        Person tenantOne = new Tenant();
        Person tenantTwo = new Tenant();
        Person tenantThree = new Tenant();
        mediator.register(tenantOne);
        mediator.register(tenantTwo);
        mediator.register(tenantThree);
        tenantOne.setName("Tenant One");
        tenantOne.setMediator(mediator);
        tenantOne.looking("the Tomorrow Community");
        tenantTwo.setName("Tenant Two");
        tenantTwo.setMediator(mediator);
        tenantTwo.looking("the Century Cmmunity");
        tenantThree.setName("Tenant Three");
        tenantThree.setMediator(mediator);
        tenantThree.looking("the Country Garden");
        landlord.setName("Ghost");
        landlord.setMediator(mediator);
        landlord.lease("the");
    }
}

模式总结

优点

  • 简化了对象之间的交互。由之前的对象之间多对多关系,变为现在中介者对对象的一对多的关系。
  • 降低了对象之间的耦合度。对象之间不需要直接相互引用,而是统一到中介者进行操盘,对象的变更不会对间接的引用方造成影响。
  • 减少子类的产生。对象调用时无需产生过多的同事类,只需声明一个新的具体中介类即可。

缺点

  • 中介者角比较复杂,增加了系统设计的难度。

适用场景

  • 重构,对象之间的关系错综复杂,动一动就牵一发而动全身。
  • 想通过一个类来管理各个对象,去掉不必要的子类。
赞(2) 投币

评论 抢沙发

慕勋的实验室慕勋的研究院

码字不容易,路过请投币

支付宝扫一扫

微信扫一扫