美文网首页
设计模式《中介者模式》

设计模式《中介者模式》

作者: 天道__ | 来源:发表于2018-07-31 14:20 被阅读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. 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

    相关文章

      网友评论

          本文标题:设计模式《中介者模式》

          本文链接:https://www.haomeiwen.com/subject/ryixvftx.html