淘寶網(wǎng)站建設(shè)哪個(gè)類目/seo公司
中介者模式
中介者模式主要是將關(guān)聯(lián)關(guān)系由一個(gè)中介者類統(tǒng)一管理維護(hù),一般來(lái)說(shuō),同事類之間的關(guān)系是比較復(fù)雜的,多個(gè)同事類之間互相關(guān)聯(lián)時(shí),他們之間的關(guān)系會(huì)呈現(xiàn)為復(fù)雜的網(wǎng)狀結(jié)構(gòu),這是一種過(guò)度耦合的架構(gòu),即不利于類的復(fù)用,也不穩(wěn)定。例如在下左圖中,有六個(gè)同事類對(duì)象,假如對(duì)象1發(fā)生變化,那么將會(huì)有4個(gè)對(duì)象受到影響。如果對(duì)象2發(fā)生變化,那么將會(huì)有5個(gè)對(duì)象受到影響。也就是說(shuō),同事類之間直接關(guān)聯(lián)的設(shè)計(jì)是不好的。如果引入中介者模式,那么同事類之間的關(guān)系將變?yōu)樾切徒Y(jié)構(gòu),從下右圖中可以看到,任何一個(gè)類的變動(dòng),只會(huì)影響的類本身,以及中介者,這樣就減小了系統(tǒng)的耦合。一個(gè)好的設(shè)計(jì),必定不會(huì)把所有的對(duì)象關(guān)系處理邏輯封裝在本類中,而是使用一個(gè)專門的類來(lái)管理那些不屬于自己的行為。
定義: 又叫調(diào)停模式,定義一個(gè)中介角色來(lái)封裝一系列對(duì)象之間的交互,使原有對(duì)象之間的耦合松散,且可以獨(dú)立地改變它們之間的交互。中介者模式包含以下主要角色:
-
抽象中介者(Mediator)角色:它是中介者的接口,提供了同事對(duì)象注冊(cè)與轉(zhuǎn)發(fā)同事對(duì)象信息的抽象方法。
-
具體中介者(ConcreteMediator)角色:實(shí)現(xiàn)中介者接口,定義一個(gè) List 來(lái)管理同事對(duì)象,協(xié)調(diào)各個(gè)同事角色之間的交互關(guān)系,因此它依賴于同事角色。
-
抽象同事類(Colleague)角色:定義同事類的接口,保存中介者對(duì)象,提供同事對(duì)象交互的抽象方法,實(shí)現(xiàn)所有相互影響的同事類的公共功能。
-
具體同事類(Concrete Colleague)角色:是抽象同事類的實(shí)現(xiàn)者,當(dāng)需要與其他同事對(duì)象交互時(shí),由中介者對(duì)象負(fù)責(zé)后續(xù)的交互。
案例實(shí)現(xiàn)
【例】租房
現(xiàn)在租房基本都是通過(guò)房屋中介,房主將房屋托管給房屋中介,而租房者從房屋中介獲取房屋信息。房屋中介充當(dāng)租房者與房屋所有者之間的中介者。
類圖如下:
代碼如下:
首先租客和房東都是人,我們先定義Person抽象類,然后具體實(shí)現(xiàn)租客Tenant
和房東HouseOwner
類,代碼如下:
// 抽象類
public abstract class Person {protected String name;protected Mediator mediator; // 持有一個(gè)中介者對(duì)象public Person(String name,Mediator mediator){this.name = name;this.mediator = mediator;}public abstract String getMessage(String msg);
}// 租客具體實(shí)現(xiàn)
public class Tenant extends Person{private String lease; // 租客租期public Tenant(String name,String lease, Mediator mediator) {super(name, mediator);this.lease = lease;}public String getMessage(String msg){System.out.println("我是租客,收到了中介發(fā)來(lái)的信息為:"+msg);return "我叫" + name +",我的想租"+lease;}
}// 房東具體實(shí)現(xiàn)
public class HouseOwner extends Person{private String address; // 房東房子地址public HouseOwner(String name,String address, Mediator mediator) {super(name, mediator);this.address = address;}//獲取信息public String getMessage(String msg){System.out.println("我是房東,收到中介發(fā)來(lái)的信息:"+msg);return "我叫" + name +",房子的位置是"+address;}
}
注意,上面的HouseOwner
和Tenant
(都是同事類)都持有中介者對(duì)象,目的是讓亂七八糟的同事類都和中介者類進(jìn)行關(guān)聯(lián),而不是讓同事類相互關(guān)聯(lián),后面進(jìn)行調(diào)用只需要通過(guò)中介者類即可,下面定義中介者類:
// 抽象中介類
public abstract class Mediator {private String name;public Mediator(String name){this.name = name;}public abstract String constact(String msg,Person person);
}// 中介類具體實(shí)現(xiàn)
public class MediatorCompany extends Mediator{private HouseOwner houseOwner;private Tenant tenant;public MediatorCompany(String name) {super(name);}@Overridepublic String constact(String msg,Person person) {if(person instanceof HouseOwner){// 如果是房東return houseOwner.getMessage(msg);}if(person instanceof Tenant){// 如果是租客return tenant.getMessage(msg);}return null;}public HouseOwner getHouseOwner() {return houseOwner;}public void setHouseOwner(HouseOwner houseOwner) {this.houseOwner = houseOwner;}public Tenant getTenant() {return tenant;}public void setTenant(Tenant tenant) {this.tenant = tenant;}
}
上面的代碼只是維護(hù)了租客和房東兩個(gè)同事類,如果還有其他的同事類例如開發(fā)商、政府、A公司、B公司等,那么constact
的邏輯就比較復(fù)雜了。但是優(yōu)點(diǎn)是將所有同事類都關(guān)聯(lián)到一個(gè)中介者類中,減少了同事類之間的復(fù)雜關(guān)聯(lián)關(guān)系。下面要實(shí)現(xiàn)房東和組合的通信或者調(diào)用,只需要通過(guò)中介者實(shí)現(xiàn)類即可,測(cè)試代碼如下:
public class Main {public static void main(String[] args) {// 中介公司MediatorCompany mediatorCompany = new MediatorCompany("王牌中介公司");// 實(shí)例化同事類HouseOwner houseOwner = new HouseOwner("馬云", "杭州西溪阿里園區(qū)",mediatorCompany);Tenant tenant = new Tenant("馬化騰", "99年", mediatorCompany);mediatorCompany.setTenant(tenant);mediatorCompany.setHouseOwner(houseOwner);String msg1 = mediatorCompany.constact("你的房子什么情況呀?",houseOwner);System.out.println("房東回復(fù):"+msg1);String msg2 = mediatorCompany.constact("你想租多久呀?",tenant);System.out.println("租客回復(fù):"+msg2);}
}
結(jié)果輸出:
我是房東,收到中介發(fā)來(lái)的信息:你的房子什么情況呀?
房東回復(fù):我叫馬云,房子的位置是杭州西溪阿里園區(qū)
我是租客,收到了中介發(fā)來(lái)的信息為:你想租多久呀?
租客回復(fù):我叫馬化騰,我的想租99年
優(yōu)點(diǎn)
-
松散耦合
中介者模式通過(guò)把多個(gè)同事對(duì)象之間的交互封裝到中介者對(duì)象里面,從而使得同事對(duì)象之間松散耦合,基本上可以做到互補(bǔ)依賴。這樣一來(lái),同事對(duì)象就可以獨(dú)立地變化和復(fù)用,而不再像以前那樣“牽一處而動(dòng)全身”了。
-
集中控制交互
多個(gè)同事對(duì)象的交互,被封裝在中介者對(duì)象里面集中管理,使得這些交互行為發(fā)生變化的時(shí)候,只需要修改中介者對(duì)象就可以了,當(dāng)然如果是已經(jīng)做好的系統(tǒng),那么就擴(kuò)展中介者對(duì)象,而各個(gè)同事類不需要做修改。
-
一對(duì)多關(guān)聯(lián)轉(zhuǎn)變?yōu)橐粚?duì)一的關(guān)聯(lián)
沒有使用中介者模式的時(shí)候,同事對(duì)象之間的關(guān)系通常是一對(duì)多的,引入中介者對(duì)象以后,中介者對(duì)象和同事對(duì)象的關(guān)系通常變成雙向的一對(duì)一,這會(huì)讓對(duì)象的關(guān)系更容易理解和實(shí)現(xiàn)。
缺點(diǎn)
當(dāng)同事類太多時(shí),中介者的職責(zé)將很大,它會(huì)變得復(fù)雜而龐大,以至于系統(tǒng)難以維護(hù)。
使用場(chǎng)景
- 系統(tǒng)中對(duì)象之間存在復(fù)雜的引用關(guān)系,系統(tǒng)結(jié)構(gòu)混亂且難以理解。
- 當(dāng)想創(chuàng)建一個(gè)運(yùn)行于多個(gè)類之間的對(duì)象,又不想生成新的子類時(shí)。
參考內(nèi)容:
傳智播客設(shè)計(jì)模式相關(guān)筆記(主要)