中介者模式
定義: 用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變他們之間的交互。
結(jié)構(gòu):
抽象中介者角色:是中介者的接口,提供了同事對(duì)象注冊(cè)與轉(zhuǎn)發(fā)同事對(duì)象信息的抽象方法。
具體中介者角色:實(shí)現(xiàn)中介者接口,定義一個(gè)list來管理同事對(duì)象,協(xié)調(diào)各個(gè)同事角色之間的交互關(guān)系,因此它依賴于同事角色。
抽象同事角色:定義同事類的接口,保存中介者對(duì)象,提供同事對(duì)象交互的抽象方法,實(shí)現(xiàn)所有相互影響的同事類的公共功能。
具體同事類:是抽象同事類的實(shí)現(xiàn)者,當(dāng)需要與其他同事對(duì)象交互時(shí),由中介者對(duì)象負(fù)責(zé)后續(xù)的交互。
優(yōu)點(diǎn):
1、松散耦合
中介者模式通過把多個(gè)同時(shí)對(duì)象之間的交互封裝到中介者對(duì)象里邊,從而使得同事對(duì)象之間松散耦合,基本上上可以做到互補(bǔ)依賴。這樣,同事對(duì)象就可以獨(dú)立的變化和復(fù)用,而不再像以前那樣牽一處而動(dòng)全身。
2、集中控制交互
多個(gè)同事對(duì)象的交互,被封裝在中介者對(duì)象里面集中管理,使得這些交互行為發(fā)生變化的時(shí)候,只需要修改中介者對(duì)象就可以了,如果是已經(jīng)做好的系統(tǒng),那么擴(kuò)展中介者對(duì)象,而各個(gè)同事類不需要做修改。
3、一對(duì)多關(guān)聯(lián)變?yōu)橐粚?duì)一的關(guān)聯(lián)
沒有使用中介者模式的時(shí)候,同事之間的關(guān)系通常是一對(duì)多的,引入中介者模式以后,中介者對(duì)象和同事對(duì)象的關(guān)系通常變成雙向的一對(duì)一,這會(huì)讓對(duì)象的關(guān)系更容易理解和實(shí)現(xiàn)。
缺點(diǎn):
當(dāng)同事類太多,中介者的職責(zé)將很大,它會(huì)變得復(fù)雜而龐大,以至于系統(tǒng)難以維護(hù)。
使用場景:
系統(tǒng)對(duì)象之間存在復(fù)雜的引用關(guān)系,系統(tǒng)結(jié)構(gòu)混亂且難以理解。
當(dāng)想創(chuàng)建一個(gè)運(yùn)行于多個(gè)類之間的對(duì)象,又不想生成新的子類時(shí)。文章來源地址http://www.zghlxwxcb.cn/news/detail-485118.html
package 中介者模式;
public abstract class Mediator {
public abstract void send(String message, Colleague colleague);
}
package 中介者模式;
public class ConcreteMediator extends Mediator {
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
@Override
public void send(String message, Colleague colleague) {
if (colleague == colleague1) {
colleague1.notifyy(message);
} else {
colleague2.notifyy(message);
}
}
public void setColleague1(ConcreteColleague1 colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(ConcreteColleague2 colleague2) {
this.colleague2 = colleague2;
}
}
package 中介者模式;
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
package 中介者模式;
public class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void send(String message) {
mediator.send(message, this);
}
public void notifyy(String message) {
System.out.println("同事1得到消息:" + message);
}
}
package 中介者模式;
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void send(String message) {
mediator.send(message, this);
}
public void notifyy(String message) {
System.out.println("同事2得到消息:" + message);
}
}
package 中介者模式;
public class Client {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
ConcreteColleague1 c1 = new ConcreteColleague1(concreteMediator);
ConcreteColleague2 c2 = new ConcreteColleague2(concreteMediator);
concreteMediator.setColleague1(c1);
concreteMediator.setColleague2(c2);
c1.send("吃飯了么");
c2.send("沒有呢,正準(zhǔn)備去");
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-485118.html
到了這里,關(guān)于經(jīng)典的設(shè)計(jì)模式17——中介者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!