设计模式《中介者模式》

2018-07-31  本文已影响0人  天道__

引言

  先回顾一下上一节的桥接模式,我们这节来看看中介者模式。见问识意,就类似中介,在帝都租房,房产中介到处都是,随去可见。

示例地址

  Demo

类图

image

定义

  中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象字小尺度的行为上与其他对象的相互作用分开处理。

使用场景

  当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可采用中介者模式,来解决紧耦合问题。该模式将对象之间的多对多关系变成一对多关系,中介者对象将系统从网状结构变成以调用者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。

中介者模式示例

  小明毕业来到帝都,首先肯定有找房子,人生地不熟的,只能依靠中介找房子。像什么我爱我家、链家等等。王大爷,帝都的本地人,各个手上几套房子,都是土豪级别,没事就爱出去旅个游什么的。自己的房子也不管理,直接脱手给中介,图个省事,反正不差钱。这就是很常规的中介者模式。
  突然又想到一个例子,农村相亲时,男女双方都不认识,靠的就是中间的媒婆,这也是典型的中介者模式。

1. 先定义一个小明和王大爷公有的类
/**
 * 交易的接口
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午3:40.
 */
public abstract class Deal {
    protected IMediator mMediator;

    public Deal(IMediator mediator) {
        mMediator = mediator;
    }

    protected abstract void sendMessage(String message);

    protected abstract void receiveMessage(String message);

}
2. 小明(买家,租户)
/**
 * 小明想租房子
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午5:05.
 */
public class XiaoMing extends Deal {

    public XiaoMing(IMediator mediator) {
        super(mediator);
    }

    @Override
    protected void sendMessage(String message) {
        System.out.println("小明:告诉房产中介" + message);
        mMediator.notice(this, message);
    }

    @Override
    protected void receiveMessage(String message) {
        System.out.println("小明收到房产中介一条消息:" + message);
    }
}
3. 王大爷(出租户,房东)
/**
 * 王大爷想出租自己的房子
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午5:05.
 */
public class WangDaYe extends Deal {
    public WangDaYe(IMediator mediator) {
        super(mediator);
    }

    @Override
    protected void sendMessage(String message) {
        System.out.println("王大爷:告诉房产中介" + message);
        mMediator.notice(this, message);
    }

    @Override
    protected void receiveMessage(String message) {
        System.out.println("王大爷收到房产中介一条信息:" + message);
    }
}
4. 中介接口
/**
 * 中介的接口
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午3:42.
 */
public interface IMediator {

    void notice(Deal deal, String message);

}
5. 房产中介(链家 我爱我家)
/**
 * 房产中介
 *
 * @author 512573717@qq.com
 * @created 2018/7/31  上午10:20.
 */
public class FangChanMediator implements IMediator {

    private XiaoMing mXiaoMing;

    private WangDaYe mWangDaYe;

    public void setBuyer(XiaoMing buyer) {
        mXiaoMing = buyer;
    }

    public void setSeller(WangDaYe seller) {
        mWangDaYe = seller;
    }

    @Override
    public void notice(Deal deal, String message) {
        System.out.println("中介收到消息 开始匹配");
        if (deal == mXiaoMing) {
            mWangDaYe.receiveMessage(message);
        } else {
            mXiaoMing.receiveMessage(message);
        }
    }
}
6. Client
 // 房产中介
 FangChanMediator fangChanMediator = new FangChanMediator();
 //小明想租房
 XiaoMing xiaoMing = new XiaoMing(fangChanMediator);
 //王大爷想出租自己的房子
 WangDaYe wangDaYe = new WangDaYe(fangChanMediator);


 fangChanMediator.setBuyer(xiaoMing);
 fangChanMediator.setSeller(wangDaYe);

 xiaoMing.sendMessage("我要租一个一室一厅的房子");
 System.out.println("======================");
 wangDaYe.sendMessage("我要出租我这个一室一厅的房子");

总结

  优点
  1. 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
  2. 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。
  3. 使用中介者模式可以将对象间多对多的关联转变为一对多的关联,使对象间的关系易于理解和维护。
  缺点
  1. 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
  2. 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
上一篇下一篇

猜你喜欢

热点阅读