設計模式—中介者模式

定義

中介者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而可以使他們可以鬆散耦合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。從而保證這些作用可以彼此獨立變化。中介者模式將多對多的相互作用轉化爲一對多的相互作用。中介者模式將對象的行爲和協作抽象化,把對象在小尺度的行爲上與其他對象的相互作用分開處理。

使用場景

當對象之間的交互操作很多且每個對象的行爲操作都彼此依賴時,爲防止在修改一個對象的行爲時,同時涉及修改很多其他對象的行爲,可採用中介者模式來解決緊耦合問題。該模式將對象之間的多對多關係變成一對多關係,中介者對象將系統從網狀結構變成以調停者爲中心的星形結構,達到降低系統的複雜性,提高可擴展性的作用。

關鍵點

抽象中介者角色,定義一個抽象接口方法,具體的事物類通過該方法來通知中介者自身的狀態改變

具體中介者角色,繼承於抽象中介者,從具體事物對象接受消息,向具體的事物發出命令

抽象事物角色,定義了中介者對象的接口,只知道中介者,不知道其他的事物對象

具體事物角色,繼承於抽象事物角色,每個具體的事物類都知道本身在小範圍內的行爲,但不知道它在大範圍內的角色

實現

/**
 * 抽象中介者
 */
public abstract class AbsMediator {

    public abstract void change(AbsRole role);

}
/**
 * 抽象事物角色_持有抽象中介者引用
 */
public abstract class AbsRole {

    protected AbsMediator mediator;

    public AbsRole(AbsMediator absMediator) {
        this.mediator = absMediator;
    }
}
/**
 * 具體中介者_持有互相關聯的具體事物對象
 */
public class ConcreteMediaor extends AbsMediator {

    private RoleA roleA;
    private RoleB roleB;

    @Override
    public void change(AbsRole role) {
        if (role == roleA) {
            //在這裏進行roleA改變時其他數據的改變操作
        } else if (role == roleB) {
            //在這裏進行roleB改變時其他數據的改變操作
        }
    }

    /**
     * 注入具體事物A
     */
    public void setRoleA(RoleA roleA) {
        this.roleA = roleA;
    }

    /**
     * 注入具體事物B
     */
    public void setRoleB(RoleB roleB) {
        this.roleB = roleB;
    }
}
/**
 * 具體事物A
 */
public class RoleA extends AbsRole {

    public RoleA(AbsMediator absMediator) {
        super(absMediator);
    }

    /**
     * 具體事物A變化_通知中介者改變其他相關事物
     */
    public void changeRoleA() {
        mediator.change(this);
    }
}
/**
 * 具體事物B
 */
public class RoleB extends AbsRole {

    public RoleB(AbsMediator absMediator) {
        super(absMediator);
    }

    /**
     * 具體事物B變化_通知中介者改變其他相關事物
     */
    public void changeRoleA() {
        mediator.change(this);
    }
}

使用

ConcreteMediator mediator = new ConcreteMediator();

//創建具體事物,並與中介者關聯
RoleA roleA = new RoleA(mediator);
RoleB roleB = new RoleB(mediator);

//將事物注入到中介者
mediator.setRoleA(roleA);
mediator.setRoleB(roleB);

//假設事物B改變
roleB.changeRoleB();

小結

優點

對複雜的依賴關係進行解耦,從而邏輯結構變得清晰,維護性和擴展性極高

缺點

類數量增多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章