1. 程式人生 > >外觀模式(注意區別於中介者模式)

外觀模式(注意區別於中介者模式)

一.外觀模式(有點像中介者模式)

通過一個外觀類使得整個系統的介面只有一個統一的高層介面,這樣就能降低使用者的使用成本,也就對使用者遮蔽了很多實現細節,當然在我們的開發過程中,外觀模式也是我們封裝API的常用手段

二.外觀模式定義

要求一個子系統的外部與其內部的通訊必須通過一個統一的物件進行,門面模式(Facade模式)提供一個高層次的介面,使得子系統更易於使用(就是一個大系統裡面有很多小系統,就跟開電腦一樣,只要按一下,然後不用關心其他部件)。

三.外觀模式的使用場景

1.為一個複雜子系統提供一個簡單介面。子系統往往因為不斷演化而變得越來越複雜,甚至可能被替換(就像換CPU,顯示卡一樣

),大多數模式使用時,都會產生更多更小的類,在這使子系統更具重用性的同時也更容易對子系統進行定製,修改,這種易變性使得隱藏子系統的具體實現變得尤為重要。Facade可以提供一個簡單統一的介面,對外影藏子系統的實現,隔離變化其實就是依賴抽象)。

2.如果子系統之間是相互依賴的,你可以讓它們僅通過Facade介面進行通訊,從而簡化它們之間的依賴關係(這個地方更像中介者模式,看看兩者的區別??????在最下面

四.外觀模式的簡單示例

在手機上,可以打電話,上網,拍照

 //Phone.java

public interface Phone {
    //打電話
    public void dail();
    //結束通話
    public void hangup();

}
//Camera.java
public interface Camera {
    public void open();
    public void takePicture();
    public void close();
}

//PhoneImpl.java

public class phoneImpl implements Phone {
    @Override
    public void dail() {
        System.out.println("打電話");
    }

    @Override
    public void hangup() {
        System.out.println("結束通話");
    }
}


//MobilePhone.java
public class MobilePhone {
    private Phone mPhone = new phoneImpl();
    private Camera mCamera = new SamsungCamera();


    public void dail(){
        mPhone.dail();
    }

    public void videoChat(){
        System.out.println("--->視訊聊天接通中");
        mCamera.open();
        mPhone.dail();
    }

    public void hangup(){
        mPhone.hangup();
    }

    public void takePicture(){
        mCamera.open();
        mCamera.takePicture();
    }

    public void closeCamera(){
        mCamera.close();
    }
}


//SamsungCamera.java

public class SamsungCamera implements Camera {
    @Override
    public void open() {
        System.out.println("開啟相機");
    }

    @Override
    public void takePicture() {
        System.out.println("拍照");
    }

    @Override
    public void close() {
        System.out.println("關閉相機");
    }
}

//MainActivity.java
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MobilePhone nexus6 = new MobilePhone();
        //拍照
        nexus6.takePicture();
        //視訊聊天
        nexus6.videoChat();
    }
}


外觀模式就是統一介面封裝,將子系統的邏輯,互動影藏起來(TM這不就是中介者模式嗎???不是的,兩者是有差別的)為使用者提供了一個高層次的介面,使得系統更加易用,同時也對外隱藏了具體的實現,這樣即使具體的子系統發生了變化,使用者也不會感知到,這樣就將變化隔離開來,使得系統更加更為靈活

五.Android原始碼中的外觀模式

這個沒看太懂待新增???

總結:

優點

1.對客戶程式影藏了子系統細節,因為減少了客戶對於子系統的耦合,能夠擁抱變化

2.外觀類對子系統的介面封裝,使得系統更易於使用

缺點

1.外觀類介面膨脹。由於子系統的介面都有外觀類統一暴露,使得外觀類的API介面叫多

2.外觀類沒有遵循開閉原則,當業務出現變更時,可能需要直接修改外觀類

六.與中介者模式的差別

1.首先中介者模式將多對多的相互作用轉化為一對多的相互作用(也就是各個系統可以互相作用,注意這裡強調的是各個系統之間的作用,為了簡化這些子系統間的作用,就採用中介者模式)

然而外觀模式模式Facade模式)提供一個高層次的介面,使得子系統更易於使用(注意這裡強調的是為了讓外部更容易使用這些子系統,所以統一放在一個物件中)

2.外觀模式是結構型模式,中介者模式是行為型模式。
3.外觀模式是對子系統提供統一的介面,中介者模式是用一箇中介物件來封裝一系列同事物件的互動行為。
4.外觀模式協議是單向,中介者模式協議是雙向。
5.外觀模式所有的請求處理都委託給子系統完成,而中介者模式則由中心協調同事類和中心本身共同完成業務

具體的可以參照兩者的簡單實現具體體會。中介者模式