在我們的日常生活中經(jīng)常需要購買各種各樣的東西匆瓜,房子奔则、車子蛮寂、生活用品等等。那么我們并不會(huì)對(duì)各個(gè)產(chǎn)品都了解易茬,所以銷售人員應(yīng)運(yùn)而生酬蹋,他們了解產(chǎn)品,然后他們根據(jù)你的需求在向你們推薦符合你們要求的產(chǎn)品抽莱。這些銷售人員就相當(dāng)于中介范抓,處于客戶和產(chǎn)品之間,為你們搭橋牽線食铐。這就是這篇需要講述的一個(gè)設(shè)計(jì)模式-中介者模式匕垫。
介紹
從程序方面來講,中介者模式就是各個(gè)對(duì)象封裝虐呻,使他們不需要相互直接引用象泵,而是通過中介者來通信寞秃。對(duì)于一個(gè)模塊,可能由很多對(duì)象構(gòu)成单芜,而且這些對(duì)象之間可能存在相互的引用蜕该,為了減少對(duì)象兩兩之間復(fù)雜的引用關(guān)系犁柜,使之成為一個(gè)松耦合的系統(tǒng)洲鸠,我們需要使用中介者模式,這就是中介者模式的模式動(dòng)機(jī)馋缅。
如下圖(圖片來自大話設(shè)計(jì)模式)
聯(lián)合國就相當(dāng)于中介者模式中的中介者
結(jié)構(gòu)圖
案例
中介抽象類
public abstract class Mediator {
public abstract void handleMsg(String msg,Colleague colleague);
}
抽象同事類
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void getMsg(String msg);
public abstract void sendMsg(String msg);
}
房東類(具體同事類)
public class Landlord extends Colleague {
public Landlord(Mediator mediator) {
super(mediator);
}
@Override
public void getMsg(String msg) {
System.out.println("我是一名房東,今天我收到一條消息:"+msg);
}
@Override
public void sendMsg(String msg) {
mediator.handleMsg(msg, this);
}
}
租客類(具體同事類)
public class Renter extends Colleague {
public Renter(Mediator mediator) {
super(mediator);
}
@Override
public void getMsg(String msg) {
System.out.println("我是一名租客,今天我收到一條消息:"+msg);
}
@Override
public void sendMsg(String msg) {
mediator.handleMsg(msg, this);
}
}
房地產(chǎn)經(jīng)紀(jì)人中介類
public class Realtor extends Mediator {
private Landlord landlord;
private Renter renter;
public void setLandlord(Landlord landlord) {
this.landlord = landlord;
}
public void setRenter(Renter renter) {
this.renter = renter;
}
@Override
public void handleMsg(String msg, Colleague colleague) {
//如果消息是房東發(fā)過來的扒腕,那就轉(zhuǎn)給租客,讓租客知道有人出租房屋
if (colleague.equals(landlord)) {
renter.getMsg(msg);
}
//如果消息是租客發(fā)過來的萤悴,說明租客已經(jīng)決定是否租賃房屋瘾腰,把消息給房東(現(xiàn)實(shí)中沒這必要。覆履。蹋盆。)
if (colleague.equals(renter)) {
landlord.getMsg(msg);
}
}
}
測(cè)試類
public class Client {
public static void main(String[] args) {
//中介
Realtor realtor = new Realtor();
//房東和租客同時(shí)找上了中介
Landlord landlord = new Landlord(realtor);
Renter renter = new Renter(realtor);
realtor.setLandlord(landlord);
realtor.setRenter(renter);
landlord.sendMsg("有一套海景別墅要出租!!!");
renter.sendMsg("太貴,租不起!");
}
}
代碼見Github地址
總結(jié)
如果在一個(gè)系統(tǒng)中對(duì)象之間的聯(lián)系呈現(xiàn)為網(wǎng)狀結(jié)構(gòu)硝全,也就是存在大量的多對(duì)多聯(lián)系時(shí)就可以用中介者模式栖雾。通過使用中介者模式可以把原來的網(wǎng)狀結(jié)構(gòu)變成星形結(jié)構(gòu),最上面那兩張圖伟众,聯(lián)合國來作為中介析藕,處理各國的事務(wù)。
中介者模式可以使對(duì)象之間的關(guān)系數(shù)量急劇減少凳厢,而且還承擔(dān)這兩方面的作用账胧,一是中轉(zhuǎn)作用,而是協(xié)調(diào)作用先紫。通過中介者提供的中轉(zhuǎn)作用治泥,各個(gè)同事對(duì)象就不再需要顯式引用其他同事,當(dāng)需要和其他同事進(jìn)行通信時(shí)遮精,通過中介者即可居夹。中介者可以更進(jìn)一步的對(duì)同事之間的關(guān)系進(jìn)行封裝,同事可以一致地和中介者進(jìn)行交互仑鸥,而不需要指明中介者需要具體怎么做吮播,中介者根據(jù)封裝在自身內(nèi)部的協(xié)調(diào)邏輯,對(duì)同事的請(qǐng)求進(jìn)行進(jìn)一步處理眼俊,將同事成員之間的關(guān)系行為進(jìn)行分離和封裝意狠。
通過使用中介者模式可以降低了類的復(fù)雜度,將一對(duì)多轉(zhuǎn)化成了一對(duì)一疮胖,降低系統(tǒng)的耦合性环戈。