中介者設計模式

一、用一箇中介者對象封裝一系列的對象交互java

  • 中介者使各對象不須要顯示地相互做用,從而使耦合鬆散,並且能夠獨立地改變它們之間的交互
  • 中介者模式又稱爲調停者模式

二、爲何要使用中介者模式ide

  • 如圖,若是對象1變化會引發周邊4個對象變化(網狀結構)
  • 下圖,引入中介者(星狀結構)
  • 任何一個類的變更,只會影響的類自己,以及中介者,這樣就減少了系統的耦合

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());  
          
    }  
}
  • 把原來處理對象關係的代碼從新封裝到一箇中介類中,經過這個中介類來處理對象間的關係

中介者模式的優勢this

  • 適當地使用中介者模式能夠避免同事類之間的過分耦合,使得各同事類之間能夠相對獨立地使用
  • 使用中介者模式能夠將對象間一對多的關聯轉變爲一對一的關聯,使對象間的關係易於理解和維護
  • 使用中介者模式能夠將對象的行爲和協做進行抽象,可以比較靈活的處理對象間的相互做用

適用場景code

  • 通常來講,只有對於那種同事類之間是網狀結構的關係,纔會考慮使用中介者模式
  • 能夠將網狀結構變爲星狀結構,使同事類之間的關係變的清晰一些
  • 適當的使用中介者模式可使本來凌亂的對象關係清晰,可是若是濫用,則可能會帶來反的效果

中介者模式是一種比較經常使用的模式,也是一種比較容易被濫用的模式對象

  • 大多數狀況下,將對象間的依賴關係封裝的同事類內部就能夠的,沒有必要非引入中介者模式
  • 濫用中介者模式,只會讓事情變的更復雜
相關文章
相關標籤/搜索