前言
中介者模式,顧名思義魏蔗,和中介有關(guān)砍的。在我們?nèi)粘I钪校埠椭薪橛兄鞣N各樣的聯(lián)系莺治。比如買房廓鞠,買車,出國留學(xué)谣旁,旅游等等床佳。通過直接和中介接觸,省去了我們很多麻煩榄审,也提高了辦事的效率砌们。那么今天正好學(xué)習(xí)一下中介者模式。
是什么——什么是中介者模式
中介者模式(Mediator Pattern):用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用浪感,從而使其耦合松散昔头,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式影兽,它是一種對(duì)象行為型模式揭斧。
中介者模式種包括如上圖幾種角色:
- Mediator:抽象中介者類
- ConcreteMediator:具體中介者類
- Colleague:抽象同事類
- ConCreteColleague:具體同事類
為什么——為什么要用中介者模式
對(duì)象之間存在很強(qiáng)的關(guān)聯(lián)性,會(huì)導(dǎo)致系統(tǒng)結(jié)構(gòu)復(fù)雜赢笨,拓展性差未蝌,對(duì)象的可重用性差。為了減少對(duì)象之間的關(guān)聯(lián)性茧妒,使系統(tǒng)變成一個(gè)松耦合的系統(tǒng)萧吠,于是就有了中介者模式。
怎么用——怎么實(shí)現(xiàn)中介者模式
首先是一個(gè)抽象中介者類:
/**
* 抽象中介者類
*/
public interface Mediator {
/**
* 讓某同事類做相關(guān)操作
* @param name
*/
void operation(String name);
/**
* 注冊(cè)同事類
* @param name
* @param colleague
*/
void register(String name,Colleague colleague);
}
然后就是抽象同事類:
/**
* 抽象同事類
*/
public abstract class Colleague {
/**
* 持有的中介類對(duì)象
*/
protected Mediator mediator;
public void setMediator(Mediator mediator){
this.mediator = mediator;
mediator.register(getName(),this);
}
/**
* 自身的相關(guān)操作
*/
public abstract void selfAction();
/**
* 請(qǐng)求其他同事類的操作
*/
public abstract void outerAction();
/**
* 獲得同事類的名字
* @return
*/
public String getName(){
return getClass().getName();
}
}
有了抽象中介類和同事類桐筏,那么我們就要去實(shí)現(xiàn)它們纸型,下面就是具體中介類以及具體同事類:
/**
* 具體中介者類
*/
public class ConcreteMediator implements Mediator{
private Map<String,Colleague> map = new HashMap<>();
@Override
public void operation(String name) {
Colleague colleague = map.get(name);
if(colleague==null){
System.out.println("Colleague "+name+" not found!");
}else{
colleague.selfAction();
}
}
@Override
public void register(String name, Colleague colleague) {
map.put(name,colleague);
}
}
public class ConcreteColleagueA extends Colleague {
@Override
public void selfAction() {
System.out.println("A's self action");
}
@Override
public void outerAction() {
System.out.println("A's outer Action");
System.out.println("A request B's self Action");
//請(qǐng)求同事類B的操作
mediator.operation(ConcreteColleagueB.class.getName());
}
@Override
public String getName() {
return super.getName();
}
}
public class ConcreteColleagueB extends Colleague{
@Override
public void selfAction() {
System.out.println("B's self Action");
}
@Override
public void outerAction() {
System.out.println("B's outer Action");
}
@Override
public String getName() {
return super.getName();
}
}
最后讓我們模擬一下同事類A通過中介者對(duì)象請(qǐng)求同事類B的操作。
public class Client {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA();
concreteColleagueA.setMediator(mediator);
ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB();
concreteColleagueB.setMediator(mediator);
//同事類A請(qǐng)求同事類B的操作
concreteColleagueA.outerAction();
}
}
運(yùn)行結(jié)果:
比如同事A請(qǐng)求同事B的操作梅忌,就是在A的outerAction
方法中向中介者M(jìn)請(qǐng)求B的操作狰腌,調(diào)用了Mediator類的operation
方法,在其中牧氮,中介者通過查找之前注冊(cè)的同事類琼腔,若能找到B,則讓B執(zhí)行操作踱葛,否則丹莲,則告知沒有相關(guān)同事類。