中介者模式-吵架和好得找宿舍老大

如果兩個類會互相影響,那麼就可以通過中介者模式來使兩個類之間耦合鬆散

代碼

abstract class AbstractColleague {
    protected int number;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number){
        this.number = number;
    }
    //注意這裏的參數不再是同事類,而是一箇中介者
    public abstract void setNumber(int number, AbstractMediator am);
}

class ColleagueA extends AbstractColleague{

    public void setNumber(int number, AbstractMediator am) {
        this.number = number;
        am.AaffectB();
    }
}

class ColleagueB extends AbstractColleague{

    @Override
    public void setNumber(int number, AbstractMediator am) {
        this.number = number;
        am.BaffectA();
    }
}

abstract class AbstractMediator {
    protected AbstractColleague A;
    protected AbstractColleague B;

    public AbstractMediator(AbstractColleague a, AbstractColleague b) {
        A = a;
        B = b;
    }

    public abstract void AaffectB();

    public abstract void BaffectA();

}
class Mediator extends AbstractMediator {

    public Mediator(AbstractColleague a, AbstractColleague b) {
        super(a, b);
    }

    //處理A對B的影響
    public void AaffectB() {
        int number = A.getNumber();
        B.setNumber(number*100);
    }

    //處理B對A的影響
    public void BaffectA() {
        int number = B.getNumber();
        A.setNumber(number/100);
    }
}

public class Client {
    public static void main(String[] args){
        AbstractColleague collA = new ColleagueA();
        AbstractColleague collB = new ColleagueB();

        AbstractMediator am = new Mediator(collA, collB);

        System.out.println("==========通過設置A影響B==========");
        collA.setNumber(1000, am);
        System.out.println("collA的number值爲:"+collA.getNumber());
        System.out.println("collB的number值爲A的10倍:"+collB.getNumber());

        System.out.println("==========通過設置B影響A==========");
        collB.setNumber(1000, am);
        System.out.println("collB的number值爲:"+collB.getNumber());
        System.out.println("collA的number值爲B的0.1倍:"+collA.getNumber());

    }
}

類圖

結構

  • 抽象中介者:定義好同事類對象到中介者對象的接口,用於各個同事類之間的通信。一般包括一個或幾個抽象的事件方法,並由子類去實現。
  • 中介者實現類:從抽象中介者繼承而來,實現抽象中介者中定義的事件方法。從一個同事類接收消息,然後通過消息影響其他同時類。
  • 同事類:如果一個對象會影響其他的對象,同時也會被其他對象影響,那麼這兩個對象稱爲同事類。在類圖中,同事類只有一個,這其實是現實的省略,在實際應用中,同事類一般由多個組成,他們之間相互影響,相互依賴。同事類越多,關係越複雜。並且,同事類也可以表現爲繼承了同一個抽象類的一組實現組成。在中介者模式中,同事類之間必須通過中介者才能進行消息傳遞。

優點

  • 避免過度耦合
  • 一對多變一對一易於理解和維護。
  • 將對象的行爲和協作進行抽象,靈活處理對象間的相互作用

適用場景

在面向對象編程中,一個類必然會與其他的類發生依賴關係,完全獨立的類是沒有意義的。一個類同時依賴多個類的情況也相當普遍,既然存在這樣的情況,說明,一對多的依賴關係有它的合理性,適當的使用中介者模式可以使原本凌亂的對象關係清晰,但是如果濫用,則可能會帶來反的效果。一般來說,只有對於那種同事類之間是網狀結構的關係,纔會考慮使用中介者模式。可以將網狀結構變爲星狀結構,使同事類之間的關係變的清晰一些。
中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對於大多數的情況,同事類之間的關係不會複雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關係封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。

學習資料: 卡奴達摩的專欄

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