中介者模式(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方法,咱們能夠採用狀態模式來解決這個問題,關於狀態模式的介紹將會在下一篇進行介紹。
優勢:
缺點:
如下狀況下能夠考慮使用中介者模式: