Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 《Android源碼設計模式解析與實戰》讀書筆記(二十三)

《Android源碼設計模式解析與實戰》讀書筆記(二十三)

編輯:關於Android編程

第二十三章、外觀模式

外觀模式是結構型設計模式之一,它在開發中的運用頻率非常高,是我們封裝API的常用手段。我們經常使用的三方SDK基本都使用的外觀模式,這樣可以對用戶屏蔽很多實現細節,降低用戶使用成本。

1.定義

要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行。外觀模式提供一個高層次的接口,使得子系統更易於使用。

2.使用場景

(1)為復雜子系統提供一個簡單接口,對外隱藏子系統的具體實現、隔離變化。

(2)當你需要構建一個層次結構的子系統時,使用外觀模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過外觀接口進行通信,從而簡化了它們之間的依賴關系。

3.UML類圖

這裡寫圖片描述

(1)Facade:系統對外的統一接口,系統內部系統地工作。

(2)其他分支:子系統接口。

可以看出外觀模式結構很簡單,但是如果沒有封裝,那麼用戶就要操作幾個子系統的交互邏輯,容易出現錯誤。

4.簡單實例

手機集合了電話功能、短信功能、拍照和GPS等功能。那麼以手機為例,簡單的用外觀模式實現一下。

Phone接口與PhoneImpl:

public interface Phone {

    //撥電話
    public void dail();

    //掛斷
    public void hangup();
}
public class PhoneImpl implements Phone{

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

    @Override
    public void hangup() {
        System.out.println("掛斷");
    }

}

Camera接口與Camera的實現類:

public interface Camera {

    //打開相機
    public void open();

    //拍照
    public void takePicture();

    //關閉相機
    public void close();
}
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("關閉相機");
    }

}

外觀類MobilePhone:

public class MobilePhone {

    private Phone mPhone = new PhoneImpl();
    private Camera mCamera = new SamsungCamera();

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

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

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

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

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

調用:

public class Client {

    public static void main(String[] args) {
        MobilePhone mobilePhone = new MobilePhone();

        //拍照
        mobilePhone.takePicture();
        //視頻聊天
        mobilePhone.videoChat();
    }

}

結果:

打開相機
拍照
--> 視頻聊天接通中
打開相機
打電話

5.Android源碼中的外觀模式

1.Context

Context 是一個抽象類,它的真正實現是ContextImpl 類,通過查看ContextImpl 源碼我們可以看到ContextImpl內部封裝了很多不同子系統的操作。例如:Activity的跳轉、發送廣播、啟動服務和設置壁紙等,這些工作不是在ContextImpl 中實現,而是交給了具體的子系統進行處理。通過Context 這個抽象類定義了一組接口,ContextImpl實現。這樣用戶通常情況下就不需要對每個子系統進行了解。這樣對用戶屏蔽了具體的實現細節,降低了使用成本。

6.總結

1.優點

(1)對客戶程序隱藏子系統的細節,因而減少了客戶對於子系統的耦合,能夠擁抱變化。

(2)外觀類對子系統的接口封裝,使得系統更易於使用。

2.缺點

(1)外觀類接口膨脹。由於子系統的接口都有外觀類統一對外暴露,使得外觀類的API接口較多,在一定程度上增加了用戶使用成本。

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved