設計模式-中介者模式

來源:《設計模式之禪》設計模式

定義:用一箇中介者對象封裝一系列對象的交互,中介者使各個對象不須要顯示的相互做用,從而使其耦合鬆散,並且能夠獨立的改變他們之間的交互。中介者也叫調停者模式。ide

組成部分:this

  1. 抽象中介者角色(mediator):定義角色統一接口,用戶各個同事之間的交互。設計

  2. 具體中介者角色(concrete mediator):實現抽象中介者角色接口,協調各個同事角色之間的交互,以來於各個同事角色。code

  3. 同事角色(colleague):每一個同時類都知道中介者角色,與其餘同事類角色的交互,必定須要經過中介者協做。對象

類圖:接口

通用代碼:get

抽象中介者:io

/**
 * 
 */
package cc.rico.pattern.mediator;

/**
 * @author rico 
 * 抽象中介者
 */
public abstract class AbstractMediator {
	protected ConcreteColleague1 colleague1;
	protected ConcreteColleague2 colleague2;
	
	public abstract void doColleague1Action();
	public abstract void doColleague2Action();

	public ConcreteColleague1 getColleague1() {
		return colleague1;
	}

	public void setColleague1(ConcreteColleague1 colleague1) {
		this.colleague1 = colleague1;
	}

	public ConcreteColleague2 getColleague2() {
		return colleague2;
	}

	public void setColleague2(ConcreteColleague2 colleague2) {
		this.colleague2 = colleague2;
	}

}

    具體中介者:class

/**
 * 
 */
package cc.rico.pattern.mediator;

/**
 * @author rico
 * 具體中介者
 */
public class Mediator extends AbstractMediator {

	@Override
	public void doColleague1Action() {
		super.colleague1.doAction();
	}

	@Override
	public void doColleague2Action() {
		super.colleague2.doAction();
	}
	
}

抽象同事類:

/**
 * 
 */
package cc.rico.pattern.mediator;

/**
 * @author rico
 * 抽象同事類
 */
public abstract class Colleague {
	protected AbstractMediator mediator;
	
	public Colleague(AbstractMediator mediator) {
		this.mediator = mediator;
	}
	
}

具體同事類1:

/**
 * 
 */
package cc.rico.pattern.mediator;

/**
 * @author rico
 * 具體同事類1
 */
public class ConcreteColleague1 extends Colleague {

	public ConcreteColleague1(AbstractMediator mediator) {
		super(mediator);
	}
	
	public void doAction() {
		System.out.println("ConcreteColleague1.doAction......");
		
	}
	
	public void doDepend() {
		System.out.println("ConcreteColleague1.doDepend......");
		super.mediator.doColleague2Action();
	}

}

具體同事類2:

/**
 * 
 */
package cc.rico.pattern.mediator;

/**
 * @author rico
 * 具體同事類2
 */
public class ConcreteColleague2 extends Colleague {

	public ConcreteColleague2(AbstractMediator mediator) {
		super(mediator);
	}
	
	public void doAction() {
		System.out.println("ConcreteColleague2.doAction......");
	}
	
	public void doDepend() {
		System.out.println("ConcreteColleague2.doDepend......");
		super.mediator.doColleague1Action();
	}

}
/**
 * 
 */
package cc.rico.pattern.mediator;

/**
 * @author rico
 *
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 中介者
		AbstractMediator mediator = new Mediator();
		
		// 同事類
		ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
		ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
		
		mediator.setColleague1(colleague1);
		mediator.setColleague2(colleague2);
		
		System.out.println("####Colleague1.doDepend...");
		colleague1.doDepend();
		
		System.out.println("###Colleague2.doDepend...");
		colleague2.doDepend();
	}

}

中介者模式優勢:

     減小類之間的依賴關係,把原有一對多的依賴變成一對一的依賴,同事類只依賴中介者,下降了類間的耦合。

中介者模式缺點:

     中介者類膨脹,邏輯複雜,把本來類間的依賴關係轉換爲中介者與同事類間的依賴關係,同事類越多,中介者的邏輯越複雜。

使用場景:

     適用於多個對象之間緊密耦合的狀況,即類圖中出現了蜘蛛網結構。 

相關文章
相關標籤/搜索