一、定義
用一箇中介對象來封裝一系列的對象交互。中介者使得各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
定義的意思是:多個對象之間相互關聯,從而造成關係比較複雜,而中介者的使用降低了它們之間的耦合。我們可以用一對圖來說明:
4個對象的交互全部放在中介者當中。
二、舉例說明
舉個我們生活中的例子,就是房地產中介。其實就是個中介者模式,而購房者和房主則是對象。如果沒有房地產中介的話,購房者和房主是直接交互的。房主發佈賣房信息------購-------房者查看房子信息,如果喜歡房主的房子的話,聯繫房主-------約定看房的時間-------購房者交款------房主交房(這裏我們把關係說的簡單點)。期間如果買房者在約定看房的時間當天有其他事情,還得聯繫房主從新約定時間或者房主有其他的事情的話,還得告訴購房者從新約定時間。總之他們之間的關係耦合度很高。
如果有了房地產中介後,購房者和房主的關係就鬆散了。房主在中介那遞交了房子資料後,就不用管了,如果房子賣出後直接收錢就行。而購房者也不用和房主直接聯繫了,直接和房地產中介溝通。不會存在爽約的情況。
下面是Mediator的原型類圖:
三、代碼說明
房主:
public class FangZhu {
private Mediator mediator;
private String name = "房姐";
public FangZhu(Mediator mediator){
this.mediator = mediator;
}
public void giveHouseMaterial(){
System.out.println("房主交個房地產中介預售房子的資料");
mediator.houseMaterialChanged("三室兩廳120平米,房主姓名:"+name);
}
public void sellHouse(){
System.out.println(name+"移交房子");
mediator.getFangZhuHouse();
}
public void getMoney(int money){
System.out.println(name+"獲得了"+money+"萬");
sellHouse();
}
}
購房者:
public class GouFangZhe {
private Mediator mediator;
public GouFangZhe(Mediator mediator){
this.mediator = mediator;
}
public String lookHouseMaterial(){
ArrayList<String> materials = mediator.getHouseMaterials();
for(int i=0;i<materials.size();i++){
System.out.println("購房者瀏覽房子信息"+materials.get(i));
}
System.out.println("喜歡上了:"+materials.get(1));
return materials.get(1);
}
public void lookHouse(){
System.out.println("和中介約好看房子");
}
public void giveMoney(){
System.out.println("交給中介500萬");
mediator.getGouFangZheMoney(500);
}
public void getHouse(){
System.out.println("購房者獲得房子");
}
}
房地產中介者:
public class Mediator {
private ArrayList<String> houseMaterials = new ArrayList<String>();
public Mediator() {
houseMaterials.add("一室一廳36平米,房主姓名:房叔");
}
FangZhu fangZhu;
GouFangZhe gouFangZhe;
public FangZhu getFangZhu() {
return fangZhu;
}
public void setFangZhu(FangZhu fangZhu) {
this.fangZhu = fangZhu;
}
public GouFangZhe getGouFangZhe() {
return gouFangZhe;
}
public void setGouFangZhe(GouFangZhe gouFangZhe) {
this.gouFangZhe = gouFangZhe;
}
/**
* 有新房源的資料了
*
* @param houseMaterial
*/
public void houseMaterialChanged(String houseMaterial) {
houseMaterials.add(houseMaterial);
String likedHouse = gouFangZhe.lookHouseMaterial();
gouFangZhe.lookHouse();
gouFangZhe.giveMoney();
}
/**
* 獲得房主的錢
*
* @param money
*/
public void getGouFangZheMoney(int money) {
fangZhu.getMoney(money);
}
/**
* 獲得房主的房子
*/
public void getFangZhuHouse() {
gouFangZhe.getHouse();
houseMaterials.remove(1);
}
public ArrayList<String> getHouseMaterials() {
return houseMaterials;
}
public void setHouseMaterials(ArrayList<String> houseMaterials) {
this.houseMaterials = houseMaterials;
}
}
Client端:
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Mediator mediator = new Mediator();
FangZhu fangZhu = new FangZhu(mediator);
GouFangZhe gouFangZhe = new GouFangZhe(mediator);
mediator.setFangZhu(fangZhu);
mediator.setGouFangZhe(gouFangZhe);
fangZhu.giveHouseMaterial();
}
}
執行結果:
四、總結
功能:中介者的功能非常的簡單,就是封裝對象之間的交互。
優點:
1】鬆散耦合
2】集中控制交互
3】多對多變成了一對多
缺點:
過度的集中化。如果交互的對象過多的話,而且比較複雜,當這些複雜性全部集中到中介者的時候,會導致中介者對象變的十分的複雜,而且難於管理和維護。