中介者模式(Mediator Pattern)又称为调停者模式,是用来下降多个对象和类之间的通讯复杂性。这种模式提供了一个中介类,中介者一般处理不一样对象之间的通讯,使各对象不须要显式地相互引用,从而耦合松散,使代码易于维护。中介者模式属于行为型模式。java
什么是中介者模式?ide
顾名思义,和中介有关。在咱们平常生活中,也和中介有着各类各样的联系。好比买房,买车,出国留学,旅游等等。经过直接和中介接触,省去了咱们不少麻烦,也提升了办事的效率。spa
以现实生活中打牌的例子来实现下中介者模式。打牌总有输赢,对应的则是货币的变化,若是不用中介者模式的话,实现以下:设计
建立对象抽象类:code
package com.cn.design_pattern.mediator_pattern; /** * * 抽象对象 这里指抽象的打牌牌友 * */ public abstract class AbstractCardPartner { public int Money; public abstract void ChangeMoney(int money, AbstractMediator mediator); }
建立具体角色实现类:对象
package com.cn.design_pattern.mediator_pattern; /** * * 具体的牌友A * */ public class PartnerA extends AbstractCardPartner { @Override public void ChangeMoney(int money, AbstractMediator mediator) { mediator.AWin(money); } }
package com.cn.design_pattern.mediator_pattern; public class PartnerB extends AbstractCardPartner { @Override public void ChangeMoney(int money, AbstractMediator mediator) { mediator.BWin(money); } }
建立中介者抽象类:blog
package com.cn.design_pattern.mediator_pattern; /** * * 抽象中介者类 * */ public abstract class AbstractMediator { protected AbstractCardPartner A; protected AbstractCardPartner B; public AbstractMediator(AbstractCardPartner a, AbstractCardPartner b) { A = a; B = b; } public abstract void AWin(int money); public abstract void BWin(int money); }
建立中介者具体实现类class
package com.cn.design_pattern.mediator_pattern; /** * 具体中介者 * */ public class MediatorPater extends AbstractMediator { public MediatorPater(AbstractCardPartner a, AbstractCardPartner b) { super(a, b); } @Override public void AWin(int money) { A.Money += money; B.Money -= money; } @Override public void BWin(int money) { B.Money += money; A.Money -= money; } }
建立使用者:效率
package com.cn.design_pattern.mediator_pattern; public class Main { public static void main(String[] args) { AbstractCardPartner A = new PartnerA(); AbstractCardPartner B = new PartnerB(); A.Money = 20; B.Money = 20; AbstractMediator mediator = new MediatorPater(A, B); // A赢了 A.ChangeMoney(5, mediator); System.out.println("A赢了5元---" + A.Money + ": " + B.Money); // B赢了 B.ChangeMoney(10, mediator); System.out.println("B赢了10元---" + A.Money + ": " + B.Money); } }
输出结果:遍历
A赢了5元---25: 15
B赢了10元---15: 25
从上面的例子能够看出,中介者类,持有全部须要互相通讯的对象。而且须要互相通讯的对象,在彼此进行交互,更改彼此状态的时候,没有直接互相调用,而是都持有一个中介者类对象,调用了中介者的方法,由中介者执行对象状态的变动。
在上面的实现代码中,抽象中介者类保存了两个抽象牌友类,若是新添加一个牌友相似时,此时就不得不去更改这个抽象中介者类。能够结合观察者模式来解决这个问题,即抽象中介者对象保存抽象牌友的类别,而后添加Register和UnRegister方法来对该列表进行管理,而后在具体中介者类中修改AWin和BWin方法,遍历列表,改变本身和其余牌友的钱数。这样的设计仍是存在一个问题——即增长一个新牌友时,此时虽然解决了抽象中介者类不须要修改的问题,但此时仍是不得不去修改具体中介者类,即添加CWin方法,咱们能够采用状态模式来解决这个问题,关于状态模式的介绍将会在下一篇进行介绍。
优势:
缺点:
如下状况下能够考虑使用中介者模式: