設計模式的學習(13)中介者模式

中介者模式

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

中介者模式的優缺點

優勢:

  • 簡化了對象之間的關係,將系統的各個對象之間的相互關係進行封裝,將各個同事類解耦,使得系統變爲鬆耦合。
  • 提供系統的靈活性,使得各個同事對象獨立而易於複用。

缺點:

  • 中介者模式中,中介者角色承擔了較多的責任,因此一旦這個中介者對象出現了問題,整個系統將會受到重大的影響。
  • 新增長一個同事類時,不得不去修改抽象中介者類和具體中介者類,此時可使用觀察者模式和狀態模式來解決這個問題。

中介者模式的適用場景

如下狀況下能夠考慮使用中介者模式:

  • 一組定義良好的對象,如今要進行復雜的相互通訊。
  • 想經過一箇中間類來封裝多個類中的行爲,而又不想生成太多的子類。
相關文章
相關標籤/搜索