中介者模式(Mediator)

中介者模式(Mediator)

1.意圖

用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
在下列情況下使用中介者模式 :
• 一組對象以定義良好但是複雜的方式進行通信。產生的相互依賴關係結構混亂且難以理解。
• 一個對象引用其他很多對象並且直接與這些對象通信 ,導致難以複用該對象。
• 想定製一個分佈在多個類中的行爲,而又不想生成太多的子類。

2.特點

• Mediator(中介者 )
— 中介者定義一個接口用於與各同事(Colleague)對象通信。
• ConcreteMediator(具體中介者)
— 具體中介者通過協調各同事對象實現協作行爲。
— 瞭解並維護它的各個同事。
• Colleague class(同事類)
— 每一個同事類都知道它的中介者對象。
— 每一個同事對象在需與其他的同事通信的時候,與它的中介者通信。

同事向一箇中介者對象發送和接收請求。中介者在各同事間適當地轉發請求以實現協作行爲。

3.UML類圖

中介者模式

4.代碼

/**
 * Mediator(中介者 )
 — 中介者定義一個接口用於與各同事(Colleague)對象通信。
 */
public interface Mediator {
    void contact(String message,Colleague coll);
}
/**
 * ConcreteMediator(具體中介者)
 — 具體中介者通過協調各同事對象實現協作行爲。
 — 瞭解並維護它的各個同事。
 */
public class ConcreteMediator implements Mediator {
    private List<Colleague> list = new ArrayList<Colleague>();

    public void addColleague(Colleague colleague){
        list.add(colleague);
    }

    /**
     * 中介者聯繫具體的同事類.將消息發送給同事類
     * @param message
     * @param coll
     */
    @Override
    public void contact(String message, Colleague coll) {

        for(Colleague colleague:list){
            if(colleague!=coll)
                colleague.getMessage(message);
        }
    }
}

/**
 * 抽象同事類
 * 每個同事類必須持有自己的中介者.
 */
public abstract class Colleague {
    protected String name;
    protected Mediator mediator;

    public Colleague(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void getMessage(String message);

    public abstract void contact(String message);
}
/**
 * Colleague class(同事類)
 — 每一個同事類都知道它的中介者對象。
 — 每一個同事對象在需與其他的同事通信的時候,與它的中介者通信。
 */
public class ColleagueA extends Colleague {
    public ColleagueA(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 得到中介者的消息
     * @param message
     */
    public void getMessage(String message){
        System.out.println("同事-"+name+"收到消息:"+message);
    }

    /**
     * 通過中介者發佈消息
     * @param message
     */
    public void contact(String message){
        mediator.contact(message,this);
    }
}
public class MediatorTest {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        Colleague colleaguea = new ColleagueA("A",mediator);
        Colleague colleagueb = new ColleagueA("B",mediator);
        Colleague colleaguec = new ColleagueA("C",mediator);
        mediator.addColleague(colleaguea);
        mediator.addColleague(colleagueb);
        mediator.addColleague(colleaguec);

        colleaguea.contact("吃飯了");
        colleagueb.contact("今天吃什麼?");
        colleaguec.contact("肯德基吧.");
        colleaguea.contact("好啊.");
        colleagueb.contact("行");
    }
}
發佈了81 篇原創文章 · 獲贊 16 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章