Design Pattern

Chapter 9 外觀模式(Facade Pattern)

定義

為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

組成

  1. 外觀角色(Facade):被客戶client角色調用,知道各個子系統的功能
  2. 子系统角色(Subsystem classes):實現子系統的功能,並處理由Facade對象指派的任務
  3. 客戶角色(client):調用facade角色獲得完成相應的功能

程式碼

Step1

public interface Shape {
    public void draw();
}

Step2

public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("畫一個圓形");
    }
}


public class Square implements Shape{
    @Override
    public void draw() {
        System.out.println("畫一個方形");        
    }
}

public class Triangle implements Shape{
    @Override
    public void draw() {
        System.out.println("畫一個三角形");        
    }
}

Step3

public class ShapeMaker {

    private Circle circle;
    private Square square;
    private Triangle triangle;

    public ShapeMaker(){
        circle = new Circle();
        square = new Square();
        triangle = new Triangle();
    }

    public void drawCircle(){
        circle.draw();
    }
    public void drawSquare(){
        square.draw();
    }
    public void drawTriangle(){
        triangle.draw();
    }
}

Step4

public class FacadePatternDemo {
    public static void main(String[] args) {
        ShapeMaker shapeMaker = new ShapeMaker();
        shapeMaker.drawCircle();
        shapeMaker.drawSquare();
        shapeMaker.drawTriangle();
    }
}

Step5(Output)

畫一個圓形
畫一個方形
畫一個三角形

優點

  1. 對客戶屏蔽子系統組件,減少了客戶處理的對像數目並使得子系統使用起來更加容易。
  2. 實現了子系統與客戶之間的松耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只需要調整外觀類即可。
  3. 降低了大型軟件系統中的編譯依賴性,並簡化了系統在不同平台之間的移植過程。
  4. 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。

缺點

  1. 不能很好地限制客戶使用子系統類,如果對客戶訪問子系統類做太多的限制則減少了可變性和靈活性。
  2. 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。