設計模式之---中介者模式(Mediator Design Pattern)
場景
買房租房找中介,男女相親找中介。
用一箇中介物件來封裝一系列的物件互動。
中介者使各物件不需要顯式地相互引用,從而使其韌合鬆散,而且可以獨立地改變它們之間的互動。
簡單點來說,將原來兩個直接引用或者依賴的物件拆開,在中間加人一個‘中介’物件,使得兩頭的物件分別和‘中介’,物件引用或者依賴。
意圖
1、使用一箇中介的物件,封裝一組物件之間的互動,這樣這些物件就可以不用彼此耦合。
2、這個中介者常常起著中間橋樑的作用,使其他的物件可以利用中介者完成某些行為活動,因此它必須對所有的參與活動的物件瞭如指掌!
組成部分
1、抽象中介者角色:抽象中介者角色定義統一的介面用於各同事角色之間的通訊。
2、具體中介者角色:具體中介者角色通過協調各同事角色實現協作行為。為此它要知道並引用各個同事角色。
3、同事角色:每一個同事角色都知道對應的具體中介者角色.而且與其他的同事角色通訊的時候,一定要通過中介者角色協作。
應用場景
1、一組物件以定義良好但是複雜的方式進行通訊,產生了混亂的依賴關係,也導致物件難以複用。
2、中介者模式很容易在系統中應用,也很容易在系統中誤用。
3、當系統出現了‘多對多’互動複雜的物件群,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理。
應用例項
1.男女相親約會:
1.明確,男人和女人如果約會,假設男方提出約會(女方提出過程類似).如果沒有媒人,該過程如下:
a)男方如果想和女方約會,男方
b)首先請示自己的父母(^_^,假設是封建家庭哦…),
c)然後通知女方
d)女方需要請示女方父母.是否同意約會.
弊端:
需要男方交換的物件太多,
且關係複雜,
當隨著男女之間的交往的複雜,
會涉及到更多複雜的交換,
雙方父母的交換也很更復雜,
使得四個物件(男,女,男方家長,女方家長)關係複雜.
難以控制.
2.模式改進:
採取媒人做“中介者“模式,將變得簡單:
其中無論那一個人有什麼要求,請求,
只需要告訴“媒人“,
至於該請求需要告訴誰,
和誰交換,
只有媒人知道。
1. 男方類
public class Man {
private Matchmaker mat; // 媒人
public Man(Matchmaker mat) {
this.mat = mat;
mat.registeMan(this);//把自己在媒人那裡註冊(宣告)
}
public static void main(String[] args) {
}
/**
* 考慮是否同意
*
* @return
*/
public boolean thinking(String says) {
System.out.println("男人考慮:我該不該同意呢???");
if (says.length() > 5) {
System.out.println("我同意了");
return true;
} else {
System.out.println("我不同意.");
return false;
}
}
/**
* 提出約會
* 男人提出約會,只需要告訴媒人,由媒人負責跟其他人互動.
*
* @param says
*/
public void tryst(String says) {
System.out.println("男人提出約會請求,說:" + says);
mat.doManTryst(says);
}
}
2. 男方家長類
public class ManParent {
private Matchmaker mat; //媒人類
public ManParent(Matchmaker mat) {
this.mat = mat;
mat.registeManParent(this); //把自己在媒人那裡註冊(宣告)
}
public static void main(String[] args) {
//ManParent manParent1 = new ManParent();
}
/**
* 考慮是否同意
*
* @return
*/
public boolean thinking(String says) {
System.out.println("男方父母考慮:我們做父母的該不該同意呢???");
if (says.length() > 5) {
System.out.println("我們做父母的同意了");
return true;
} else {
System.out.println("我們做父母的不同意.");
return false;
}
}
}
3.女方類
public class Woman {
private Matchmaker mat; // 媒人
public Woman(Matchmaker mat) {
this.mat = mat;
mat.registeWoman(this); //把自己在媒人那裡註冊(宣告)
}
public static void main(String[] args) {
}
/**
* 考慮是否同意
*
* @return
*/
public boolean thinking(String says) {
System.out.println("女人考慮:我該不該同意呢???");
if (says.length() > 5) {
System.out.println("我同意了");
return true;
} else {
System.out.println("我不同意.");
return false;
}
}
/**
* 提出約會
* 女人提出約會,只需要告訴媒人,由媒人負責跟其他人互動.
*
* @param says
*/
public void tryst(String says) {
System.out.println("女人提出約會請求,說:" + says);
mat.doWomanTryst(says);
}
}
4.女方家長類
public class WomanParent {
private Matchmaker mat; //媒人類
public WomanParent(Matchmaker mat) {
this.mat=mat;
mat.registerWomanParent(this); //把自己在媒人那裡註冊(宣告)
}
public static void main(String[] args) {
//WomanParent womanParent1 = new WomanParent();
}
/**
*考慮是否同意
* @return
*/
public boolean thinking(String says) {
System.out.println("女方父母考慮:我們做父母的該不該同意呢???");
if (says.length() > 5){
System.out.println("我們做父母的同意了");
return true;
}
else{
System.out.println("我們做父母的不同意.");
return false;
}
}
}
5.測試類
public class MatchmakerDemo {
public MatchmakerDemo() {
}
public static void main(String[] args) {
MatchmakerDemo matchmakerDemo1 = new MatchmakerDemo();
Matchmaker mat = new Matchmaker(); //媒人出現
Man man = new Man(mat);//男人,以媒人為建立構造引數
Woman woman=new Woman(mat);
ManParent manp=new ManParent(mat);
WomanParent womanp=new WomanParent(mat);
System.out.println("===========================");
man.tryst("我想和你約會,可以嗎?");
System.out.println("===========================");
woman.tryst("想和你約會");
}
}
輸出結果如下:
===========================
男人提出約會請求,說:我想和你約會,可以嗎?
媒人開始處理約會問題開始
女人考慮:我該不該同意呢???
我同意了
男方父母考慮:我們做父母的該不該同意呢???
我們做父母的同意了
女方父母考慮:我們做父母的該不該同意呢???
我們做父母的同意了
媒人處理約會問題結束,根據同意的結果做其他處理
===========================
女人提出約會請求,說:想和你約會
媒人開始處理約會問題開始
男人考慮:我該不該同意呢???
我不同意.
男方父母考慮:我們做父母的該不該同意呢???
我們做父母的不同意.
女方父母考慮:我們做父母的該不該同意呢???
我們做父母的不同意.
媒人處理約會問題結束,根據同意的結果做其他處理