1. 程式人生 > >協調多個物件之間的互動——中介者模式(三)

協調多個物件之間的互動——中介者模式(三)

20.3 完整解決方案

      為了協調介面元件物件之間的複雜互動關係,Sunny公司開發人員使用中介者模式來設計客戶資訊管理視窗,其結構示意圖如圖20-7所示:

20-7 引入了中介者類的“客戶資訊管理視窗”結構示意圖

20-7只是一個重構之後的結構示意圖,在具體實現時,為了確保系統具有更好的靈活性和可擴充套件性,我們需要定義抽象中介者和抽象元件類,其中抽象元件類是所有具體元件類的公共父類,完整類圖如圖20-8所示:

20-8 重構後的“客戶資訊管理視窗”結構圖

      在圖20-8中,Component充當抽象同事類,ButtonListComboBoxTextBox充當具體同事類,Mediator

充當抽象中介者類,ConcreteMediator充當具體中介者類,ConcreteMediator維持了對具體同事類的引用,為了簡化ConcreteMediator類的程式碼,我們在其中只定義了一個Button物件和一個TextBox物件。完整程式碼如下所示:

//抽象中介者
abstract class Mediator {
	public abstract void componentChanged(Component c);
}

//具體中介者
class ConcreteMediator extends Mediator {
	//維持對各個同事物件的引用
	public Button addButton;
	public List list;
	public TextBox userNameTextBox;
	public ComboBox cb;

    //封裝同事物件之間的互動
	public void componentChanged(Component c) {
		//單擊按鈕
if(c == addButton) {
			System.out.println("--單擊增加按鈕--");
			list.update();
			cb.update();
			userNameTextBox.update();
		}
        //從列表框選擇客戶
		else if(c == list) {
			System.out.println("--從列表框選擇客戶--");
			cb.select();
			userNameTextBox.setText();
		}
        //從組合框選擇客戶
		else if(c == cb) {
			System.out.println("--從組合框選擇客戶--");
			cb.select();
			userNameTextBox.setText();
		}
	}
}

//抽象元件類:抽象同事類
abstract class Component {
	protected Mediator mediator;
	
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}

	//轉發呼叫
	public void changed() {
		mediator.componentChanged(this);
	}
	
	public abstract void update();	
}

//按鈕類:具體同事類
class Button extends Component {
	public void update() {
		//按鈕不產生互動
	}
}

//列表框類:具體同事類
class List extends Component {
	public void update() {
		System.out.println("列表框增加一項:張無忌。");
	}
	
	public void select() {
		System.out.println("列表框選中項:小龍女。");
	}
}

//組合框類:具體同事類
class ComboBox extends Component {
	public void update() {
		System.out.println("組合框增加一項:張無忌。");
	}
	
	public void select() {
		System.out.println("組合框選中項:小龍女。");
	}
}

//文字框類:具體同事類
class TextBox extends Component {
	public void update() {
		System.out.println("客戶資訊增加成功後文本框清空。");
	}
	
	public void setText() {
		System.out.println("文字框顯示:小龍女。");
	}
}

      編寫如下客戶端測試程式碼:

class Client {
	public static void main(String args[]) {
        //定義中介者物件
		ConcreteMediator mediator;
		mediator = new ConcreteMediator();
		
        //定義同事物件
		Button addBT = new Button();
		List list = new List();
	    ComboBox cb = new ComboBox();
	    TextBox userNameTB = new TextBox();

		addBT.setMediator(mediator);
		list.setMediator(mediator);
		cb.setMediator(mediator);
		userNameTB.setMediator(mediator);

		mediator.addButton = addBT;
		mediator.list = list;
		mediator.cb = cb;
		mediator.userNameTextBox = userNameTB;
		
		addBT.changed();
		System.out.println("-----------------------------");
		list.changed();
	}
}

      編譯並執行程式,輸出結果如下:

--單擊增加按鈕--

列表框增加一項:張無忌。

組合框增加一項:張無忌。

客戶資訊增加成功後文本框清空。

-----------------------------

--從列表框選擇客戶--

組合框選中項:小龍女。

文字框顯示:小龍女。