设计模式-中介者模式
设计模式-中介者模式
概念
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
优点
1、降低了类的复杂度,将一对多转化成了一对一。
2、各个类之间的解耦。
3、符合迪米特原则。
缺点
随着管理对象之间的关系越来越复杂时,中介者会庞大,变得复杂难以维护。
角色
Mediator: 中介者
AbstractClass: 需要认识中介对象的父类
ConreteClass: 认识中介对象的具体类
使用场景
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
案例描述
刘老板委托张涛兜售商品,有一天,张老板恰好需要这款商品就像张涛打听价格。在谈价过程中,张涛看做是中介,刘老板看做是一个对象,张老板看做是一个对象,那么使用中介者模式来实现会是下面这样子
UML类图
代码解析UML类图
/** * 设计模式-中介者模式-抽象商人 * * Created by laizhiyuan on 2017/6/14. */ public abstract class AbstractMerchant { /** * 商人如果需要通过中介兜售商品,就认识中介张涛 */ protected ZhangTaoMediator mediator; public AbstractMerchant(ZhangTaoMediator mediator) { this.mediator = mediator; } /** * 转达 * * @param message */ public abstract void vonvey(String message); /** * 接收 * @param message */ public abstract void receive(String message); }
/** * 设计模式-中介者模式-具体商人(刘老板) * * Created by laizhiyuan on 2017/6/14. */ public class LiuBoss extends AbstractMerchant{ public LiuBoss(ZhangTaoMediator mediator) { super(mediator); } @Override public void vonvey(String message) { mediator.convey(message, this); } @Override public void receive(String message) { System.out.println("刘老板接收到消息:" + message); } }
/** * 设计模式-中介者模式-具体商人(张老板) * * Created by laizhiyuan on 2017/6/14. */ public class ZhangBoss extends AbstractMerchant{ public ZhangBoss(ZhangTaoMediator mediator) { super(mediator); } @Override public void vonvey(String message) { mediator.convey(message, this); } @Override public void receive(String message) { System.out.println("张老板接收到消息:" + message); } }
/** * 设计模式-中介者模式-中介张涛 * * Created by laizhiyuan on 2017/6/14. */ public class ZhangTaoMediator { /** * 刘老板 */ private LiuBoss liuBoss; /** * 张老板 */ private ZhangBoss zhangBoss; public LiuBoss getLiuBoss() { return liuBoss; } public void setLiuBoss(LiuBoss liuBoss) { this.liuBoss = liuBoss; } public ZhangBoss getZhangBoss() { return zhangBoss; } public void setZhangBoss(ZhangBoss zhangBoss) { this.zhangBoss = zhangBoss; } public void convey(String message, AbstractMerchant merchant){ if (merchant == liuBoss){ zhangBoss.receive(message); } if (merchant == zhangBoss){ liuBoss.receive(message); } } }
测试
/** * * 测试 * * * Created by laige on 2017/6/14. */ public class Client { public static void main(String[] args) { /** * 中介 */ ZhangTaoMediator mediator = new ZhangTaoMediator(); /** * 认识中介 */ LiuBoss liuBoss = new LiuBoss(mediator); ZhangBoss zhangBoss = new ZhangBoss(mediator); mediator.setLiuBoss(liuBoss); mediator.setZhangBoss(zhangBoss); liuBoss.vonvey("xxxx省xxxx市xxxx县xxx区xxxx号有套房子,出价100万。"); zhangBoss.vonvey("这房子能便宜点吗? 90万如何?"); liuBoss.vonvey("精装修的,100万不算贵了,有房产证的"); zhangBoss.vonvey("那边交通不怎么方便,95万"); liuBoss.vonvey("98万,要就卖,不要就算了"); zhangBoss.vonvey("好,成交"); } }