设计模式整理(12) 中介者模式

学习《Android 源码设计模式解析与实践》系列笔记

介绍

生活中经常能听到或接触到各种“中介者”,比如买房子或者租房,可能会通过房屋中介;买二手车会有二手车中介;找工作也可以通过中介。

中介者模式属于行为型模式

定义

中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。

使用场景

当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,涉及修改很多其他对象的行为。

该模式主要是将对象之间的多对多的关系变成一对多的关系,即将关系网从网状结构简化为星形结构,降低系统的复杂性,提高可扩展的作用。

设计模式整理(12) 中介者模式_第1张图片
中介者模式结构优化图

结构

设计模式整理(12) 中介者模式_第2张图片
中介者模式 UML 图
  • Mediator : 抽象中介者,会持有同事对象的引用
  • ConcreteMediator :中介者的具体实现
  • Colleague :抽象同事类,会持有中介者引用
  • ConcreteColleague : 同事类的具体实现

实现

下面就以买房为例,买方和卖方通过房屋中介进行信息交流。

/**
 * 抽象中介者,会持有同事对象的引用
 */
public abstract class Mediator {

    protected Colleague mPurchaser; //买家
    protected Colleague mVendor; //卖家

    public abstract void exchangeMessage(Colleague colleague, String msg);

    public void setPurchaser(Colleague mPurchaser) {
        this.mPurchaser = mPurchaser;
    }

    public void setVendor(Colleague mVendor) {
        this.mVendor = mVendor;
    }
}
/**
 * 同事抽象类,会持有中介者的引用
 */
public abstract class Colleague {

    protected Mediator mMediator;

    public Colleague(Mediator mediator) {
        mMediator = mediator;
    }

    public abstract void getMessage(String msg);

    public abstract void say(String msg);

}
/**
 * 卖家
 */
public class Vendor extends Colleague {

    public Vendor(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void getMessage(String msg) {
        System.out.println("卖家收到消息:" + msg);
    }

    @Override
    public void say(String msg) {
        mMediator.exchangeMessage(this, msg);
    }
}
/**
 * 买家
 */
public class Purchaser extends Colleague {

    public Purchaser(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void getMessage(String msg) {
        System.out.println("买家收到消息:" + msg);
    }

    @Override
    public void say(String msg) {
        mMediator.exchangeMessage(this, msg);
    }
}
/**
 * 房屋中介实现类
 */
public class LettingAgency extends Mediator {
    @Override
    public void exchangeMessage(Colleague colleague, String msg) {
        if (colleague == mPurchaser) {
            mVendor.getMessage(msg);
        } else {
            mPurchaser.getMessage(msg);
        }
    }
}
public class Client {

    public static void main(String[] args) {
        // 生产一个中介
        Mediator mediator = new LettingAgency();
        // 买家
        Colleague purchaser = new Purchaser(mediator);
        // 卖家
        Colleague vendor = new Vendor(mediator);
        // 买家、卖家和中介者建立关系
        mediator.setPurchaser(purchaser);
        mediator.setVendor(vendor);

        // 卖家和买家通过中介者进行信息交流
        purchaser.say("房主,房子我只能给50万,肯不肯卖?");
        vendor.say("不好意思,暂时不能接受!");
    }

}
卖家收到消息:房主,房子我只能给50万,肯不肯卖?
买家收到消息:不好意思,暂时不能接受!

总结

中介者模式的运用简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,使各个同事类解耦,系统成为松耦合系统。它简化了系统的结构,将同事间相互依赖的网状结构转变成简单的星形结构,中介者对象在这里起到中转和协调作用。

但是如果几个同事类之间的依赖关系并不复杂的话,中介者的加入可能会使结构变得复杂,系统维护起来较为困难,所以在运用前需要多考虑。



相关文章:

设计模式整理(1) 代理模式
设计模式整理(2) 单例模式
设计模式整理(3) Builder 模式
设计模式整理(4) 原型模式
设计模式整理(5) 工厂模式
设计模式整理(6) 策略模式
设计模式整理(7) 状态模式
设计模式整理(8) 责任链模式
设计模式整理(9) 观察者模式
设计模式整理(10) 适配器模式
设计模式整理(11) 装饰模式
设计模式整理(12) 中介者模式

你可能感兴趣的:(设计模式整理(12) 中介者模式)