JAVA設計模式之 中介者模式【Mediator Pattern】

小呂-ICE發表於2014-12-02

一、概述

    用一箇中介物件(中介者)來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式又稱為調停者模式,它是一種物件行為型模式。


二、適用場景

    協調多個物件之間的互動。


三、UML類圖


四、參與者

1、Mediator(抽象中介者):它定義一個介面,該介面用於與各同事物件之間進行通訊。

2、ConcreteMediator(具體中介者):它是抽象中介者的子類,通過協調各個同事物件來實現協作行為,它維持了對各個同事物件的引用。

3、Colleague(抽象同事類):它定義各個同事類公有的方法,並宣告瞭一些抽象方法來供子類實現,同時它維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通訊。

4、ConcreteColleague(具體同事類):它是抽象同事類的子類;每一個同事物件在需要和其他同事物件通訊時,先與中介者通訊,通過中介者來間接完成與其他同事類的通訊;在具體同事類中實現了在抽象同事類中宣告的抽象方法。


五、用例學習[用例背景:求租者 - 房屋出租中介 - 房東 的故事]

1、抽象同事類:Person.java

/**
 * 抽象同事類:
 * @author  lvzb.software@qq.com
 *
 */
public abstract class Person {
	// 維持一個抽象中介者的引用
	protected Mediator mediator;
	
	protected String name;
	
	public Person(String name, Mediator mediator){
		this.mediator = mediator;
		this.name = name;
	}
	
	/**
	 * 設定中介者物件
	 * @param mediator
	 */
	public void setMediator(Mediator mediator){
		this.mediator = mediator;
	}

	/**
	 * 向中介 傳送訊息
	 */
	protected abstract void sendMessage(String msg);
	
	/**
	 * 從中介 獲取訊息
	 */
	protected abstract void getMessage(String msg);
}
2、房屋求租者 Renter.java

/**
 * 具體同事類:這裡的角色是 租房者
 * @author  lvzb.software@qq.com
 *
 */
public class Renter extends Person {

	public Renter(String name, Mediator mediator) {
		super(name, mediator);
	}
	

	@Override
	protected void sendMessage(String msg) {
		mediator.operation(this, msg);
	}

	@Override
	protected void getMessage(String msg) {
		System.out.println("求租者[" + name + "]收到中介發來的訊息: " + msg);
	}

}
3、具體同事類 房屋出租者[房東] Landlord.java

/**
 * 具體同事類:這裡的角色是 房東
 * @author  lvzb.software@qq.com
 *
 */
public class Landlord extends Person {

	public Landlord(String name, Mediator mediator) {
		super(name,mediator);
	}
	
	@Override
	protected void sendMessage(String msg) {
		mediator.operation(this, msg);
	}

	@Override
	protected void getMessage(String msg) {
		System.out.println("房東["+ name +"]收到中介發來的訊息:" + msg);
	}

}
4、抽象中介者類:Mediator.java

/**
 * 抽象中介者類
 * @author  lvzb.software@qq.com
 *
 */
public abstract class Mediator {
	// 用於新增儲存 "房東"角色
	protected List<Person> landlordList = new ArrayList<Person>();
	
	// 用於新增儲存 "求租者"角色
	protected List<Person> renterList = new ArrayList<Person>();
	
	/**
	 * 中介者註冊房東資訊
	 * @param landlord 房東實體
	 */
	public void registerLandlord(Person landlord){
		landlordList.add(landlord);
	}
	
	/**
	 * 中介者註冊 求租者資訊
	 * @param landlord 房東實體
	 */
	public void registerRenter(Person landlord){
		renterList.add(landlord);
	}
	
	
	/**
	 * 宣告抽象方法 由具體中介者子類實現 訊息的中轉和協調
	 */
	public abstract void operation(Person person, String message);

}
5、具體中介者類:房屋中介 HouseMediator.java

/**
 * 具體中介者類:這裡的角色是 房屋出租中介
 * @author  lvzb.software@qq.com
 *
 */
public class HouseMediator extends Mediator {

	@Override
	public void operation(Person person, String message) {
		if(person instanceof Renter){
			// 將租屋的需求訊息傳遞給 註冊了的房東們
			for(Person landlord: landlordList){
				landlord.getMessage(message);
			}
		} else if(person instanceof Landlord){
			// 將房東的出租房訊息傳遞給 註冊了的 房屋求租者們
			for(Person renter : renterList){
				renter.getMessage(message);
			}
		}
		
	}

}
6、客戶端測試類 Client.java

/**
 * 客戶端測試類
 * @author  lvzb.software@qq.com
 *
 */
public class Client {

	public static void main(String[] args) {
		// 例項化房屋中介
		Mediator mediator = new HouseMediator();
		
		Person landlordA, landlordB, renter;
		landlordA = new Landlord("房東李", mediator);
		landlordB = new Landlord("房東黎", mediator);
				
		renter = new Renter("小呂",mediator);
		
		// 房東註冊中介
		mediator.registerLandlord(landlordA);
		mediator.registerLandlord(landlordB);
		// 求租者註冊中介
		mediator.registerRenter(renter);
		
		// 求租者 傳送求租訊息
		renter.sendMessage("在天河公園附近租套房子,價格1000元左右一個月");
		System.out.println("--------------------------");
		// 房東A 傳送房屋出租訊息
		landlordA.sendMessage("天河公園學院站三巷27號四樓有一房一廳出租  1200/月  光線好 近公交站");
	}

}
7、執行結果:

房東[房東李]收到中介發來的訊息:在天河公園附近租套房子,價格1000元左右一個月
房東[房東黎]收到中介發來的訊息:在天河公園附近租套房子,價格1000元左右一個月
--------------------------
求租者[小呂]收到中介發來的訊息: 天河公園學院站三巷27號四樓有一房一廳出租  1200/月  光線好 近公交站





相關文章