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