今天學習中介者模式,話說都快學完了,很快啊,還有最後幾個,加油啊!!
所謂中介者模式,一看名字就明白了,我們在外生活,免不了與各種中介打交道,比如在外工作需要租房子,我們人生地不熟的,不可能一下子就找到合適的房子,那麼這個時候我們就需要中介來幫忙了,我只需要告訴中介我們需要什麼樣的房子,剩下的就不用我們管了,中介會按照我們的標準去聯繫在他這裏註冊過的房東,如果有符合要求的,那麼用戶與房東籤協議,交錢,然後就ok了。在整個過程中,租戶不需要與房東直接發生正面聯繫,我們的一切信息都是在中介那裏獲得的。把這個概念帶入到代碼裏,就可以在很大程度上對兩個對象解耦。
通過迪米特法則我們可以知道,我們的類要儘量不要直接和其他類進行通信,必要的時候,我們可以藉助第三方來實現這個通信。這個時候,中介就是這個第三方。
取用網上的一段話: 通過中介者模式,我們可以將複雜關係的網狀結構變成結構簡單的以中介者爲核心的星形結構,每個對象不再和它與之關聯的對象直接發生相互作用,而是通過中介者對象來另一個對象發生相互作用。
好,現在我們來點乾貨,當然就是你如何實現了,我們就用上邊的例子。先看包結構
首先是中介者的抽象類
package com.mediator.abs.mediator;
import com.mediator.abs.colleague.Person;
/**
* 抽象中介者
* @author ZHENGWEI
* @date 2015-8-12
*/
public abstract class Mediator {
/**
* 中介者傳話的方法
* @param message
* @param person
*/
public abstract void passMessage(String message, Person person);
}
之後是租戶和房東共同的抽象方法
package com.mediator.abs.colleague;
import com.mediator.abs.mediator.Mediator;
/**
* 租房者或者房東的抽象類
* @author ZHENGWEI
* @date 2015-8-12
*/
public abstract class Person {
protected Mediator mediator;
public Person(Mediator mediator){
this.mediator = mediator;
}
}
然後就是房東和租戶的具體實現
package com.mediator.concrete.colleague;
import com.mediator.abs.colleague.Person;
import com.mediator.abs.mediator.Mediator;
/**
* 房東的具體實現類
* @author ZHENGWEI
* @date 2015-8-12
*/
public class FangDong extends Person {
public FangDong(Mediator mediator) {
super(mediator);
}
/**
* 房東只需要把信息告訴中介即可,其他的不需要管
* @param message
*/
public void sendMessageToMediator(String message){
this.mediator.passMessage(message, this);
}
/**
* 房東只從中介那裏接收消息,具體消息來源他不需要關心
* @param message
*/
public void getMessageForMediator(String message){
System.out.println("房東收到消息:"+message);
}
}
package com.mediator.concrete.colleague;
import com.mediator.abs.colleague.Person;
import com.mediator.abs.mediator.Mediator;
/**
* 租戶的具體實現類
* @author ZHENGWEI
* @date 2015-8-12
*/
public class ZuHu extends Person {
public ZuHu(Mediator mediator) {
super(mediator);
}
/**
* 租戶只需要把信息告訴中介即可,其他的不需要管
* @param message
*/
public void sendMessageToMediator(String message){
this.mediator.passMessage(message, this);
}
/**
* 租戶只從中介那裏接收消息,具體消息來源他不需要關心
* @param message
*/
public void getMessageForMediator(String message){
System.out.println("租戶收到消息:"+message);
}
}
然後是中介的具體實現
package com.mediator.concrete.mediator;
import com.mediator.abs.colleague.Person;
import com.mediator.abs.mediator.Mediator;
import com.mediator.concrete.colleague.FangDong;
import com.mediator.concrete.colleague.ZuHu;
/**
* 具體的租房機構,這裏可以理解爲“XXXX中介”
*
* @author ZHENGWEI
* @date 2015-8-12
*/
public class ZuFangJiGou extends Mediator {
// 作爲中介,肯定要實現知道租戶和房東的信息
private FangDong fangDong;
private ZuHu zuHu;
public FangDong getFangDong() {
return fangDong;
}
public void setFangDong(FangDong fangDong) {
this.fangDong = fangDong;
}
public ZuHu getZuHu() {
return zuHu;
}
public void setZuHu(ZuHu zuHu) {
this.zuHu = zuHu;
}
@Override
public void passMessage(String message, Person person) {
if(person.getClass().equals(FangDong.class)){
this.zuHu.getMessageForMediator(message);
} else if(person.getClass().equals(ZuHu.class)){
this.fangDong.getMessageForMediator(message);
}
}
}
上邊判斷的時候是根據不同的對象做出不同的反應
最後是測試類
package com.mediator.main;
import com.mediator.concrete.colleague.FangDong;
import com.mediator.concrete.colleague.ZuHu;
import com.mediator.concrete.mediator.ZuFangJiGou;
public class MediatorMain {
public static void main(String[] args) {
// 先聲明中介機構
ZuFangJiGou mediator = new ZuFangJiGou();
// 然後是房東和租戶兩個角色,這兩個角色不必互相知道對方,他們只要知道中介即可
FangDong fangDong = new FangDong(mediator);
ZuHu zuHu = new ZuHu(mediator);
// 同樣的,中介也需要知道他們的信息
mediator.setFangDong(fangDong);
mediator.setZuHu(zuHu);
zuHu.sendMessageToMediator("你那裏有多出來的房間麼?");
fangDong.sendMessageToMediator("我這裏有空餘的房間");
}
}
最後來看看結果
再次引用網上的一段話:
所謂中介者模式就是用一箇中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
通過定義我們可以看出中介者主要是通過中介對象來封裝對象之間的關係,使之各個對象在不需要知道其他對象的具體信息情況下通過中介者對象來與之通信。同時通過引用中介者對象來減少系統對象之間關係,提高了對象的可複用和系統的可擴展性。
但是就是因爲中介者對象封裝了對象之間的關聯關係,導致中介者對象變得比較龐大,所承擔的責任也比較多。它需要知道每個對象和他們之間的交互細節,如果它出問題,將會導致整個系統都會出問題。所以它比較容易應用也很容易誤用。故當系統中出現了“多對多”交互複雜的關係羣時,千萬別急着使用中介者模式,你首先需要做的就是反思你的系統在設計上是不是合理。