《設(shè)計模式》外觀模式

基本介紹

定義

要求一個子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個統(tǒng)一的對象進(jìn)行。外觀模式提供一個高層次的接口,使得子系統(tǒng)更易于使用。

介紹

  • 外觀模式屬于結(jié)構(gòu)型模式。
  • 外觀模式也叫門面模式。
  • 通常我們對API進(jìn)行封裝,都會用到外觀模式,只是我們可能不知道而已。外觀模式通過一個外觀類使得整個系統(tǒng)的結(jié)構(gòu)只有一個統(tǒng)一的高層接口,這樣能降低用戶的使用成本。

UML類圖

外觀模式UML類圖

角色說明:

  • Facade(外觀角色):對外的統(tǒng)一入口。
  • Complex System(復(fù)雜系統(tǒng)):一般由多個子系統(tǒng)構(gòu)成,負(fù)責(zé)具體功能的實現(xiàn)。

具體實現(xiàn)

我們玩游戲時一般都有登錄和充值等操作,這些一般都是第三方SDK來完成。游戲研發(fā)一般只需進(jìn)行簡單的接入就可以使用登錄充值功能了。我們來實現(xiàn)一個簡單的游戲SDK:

1、創(chuàng)建外觀角色。這里只要是封裝游戲SDK對外的接口,供游戲去研發(fā)去調(diào)用。這里只有兩個接口:登錄和充值。

public class GameSdk {
  // 登錄接口
  public void login() {
    // 調(diào)用登錄子系統(tǒng)的接口
    LoginManager loginManager = new LoginManager();
    loginManager.login();
  }

  // 支付接口
  public void pay(int momey) {
    // 調(diào)用支付子系統(tǒng)的接口
    PayManager payManager = new PayManager();
    payManager.pay(momey);
  }
}

2、子系統(tǒng)

// 登錄系統(tǒng)
public class LoginManager {
  public void login() {
    System.out.println("打開登錄界面");
    System.out.println("進(jìn)行登錄操作");
    System.out.println("登錄成功");
  }
}

// 支付系統(tǒng)
public class PayManager {
  public void pay(int momey) {
    System.out.println("生成訂單信息");
    System.out.println("選擇支付方式");
    System.out.println("支付成功:" + momey + "元");
  }
}

3、客戶端測試:

private void test() {
  // 這里是游戲研發(fā),通過調(diào)用login()和pay()就能調(diào)起登錄和支付,無需關(guān)心支付是使用支付寶還是威信等,這是游戲SDK里面去做的事。
  GameSdk gameSdk = new GameSdk();
  gameSdk.login();
  gameSdk.pay(6);
}

輸出結(jié)果:

打開登錄界面
進(jìn)行登錄操作
登錄成功
生成訂單信息
選擇支付方式
支付成功:6元

模式總結(jié)

應(yīng)用場景

  • 為一個復(fù)雜的子系統(tǒng)提供一個簡單接口,對外隱藏子系統(tǒng)的具體實現(xiàn)、隔離變化。
  • 使用外觀模式可以將一個子系統(tǒng)和使用它的客戶端以及其它的子系統(tǒng)分離開來,這就提高了子系統(tǒng)的獨立性和可移植性。
  • 在構(gòu)建一個層次化結(jié)構(gòu)的時候,可以使用外觀模式定義每一個層次對外交互的接口。這樣,層與層之間只需要通過外觀進(jìn)行通信,從而簡化層與層之間的依賴關(guān)系。

優(yōu)點

  • 降低了客戶端與子系統(tǒng)類的耦合度,實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系。
  • 外觀類對子系統(tǒng)的接口封裝,使得系統(tǒng)更易于使用。
  • 提高靈活性,不管子系統(tǒng)如何變化,只要不影響門面對象,就可以自由修改。

缺點

  • 增加新的子系統(tǒng)可能需要修改外觀類的源代碼,違背了“開閉原則”。
  • 所有子系統(tǒng)的功能都通過一個接口來提供,這個接口可能會變得很復(fù)雜。

Android中的源碼分析

外觀模式在Android中應(yīng)用也非常廣泛,比如Context類,里面封裝了很多方法,還是以startActivity()方法為例。實際上startActivity()是通過ActivityManagerService來實現(xiàn)的,ActivityManagerService我們應(yīng)該都有耳聞,但是實際開發(fā)中一般都用不到,通過封裝的方式,Context類隱藏了這些細(xì)節(jié),我們只要簡單調(diào)個方法就可以啟動一個新的Activity。
這就是外觀模式在Android應(yīng)用的例子了。當(dāng)然這種應(yīng)用比比皆是,我們平時開發(fā)也經(jīng)常用的到。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 Android的設(shè)計模式系列文章介紹,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計模式-設(shè)計模式的六大原則一...
    四月葡萄閱讀 5,137評論 2 16
  • 1.外觀模式簡介 外觀模式(Facade)在開發(fā)過程中的運用頻率非常高,尤其是在現(xiàn)階段各種第三方SDK充斥在我們的...
    道道明明白白閱讀 1,044評論 1 3
  • 1.定義 要求一個子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個統(tǒng)一的對象進(jìn)行。外觀模式提供一個高層次的接口,使得子系統(tǒng)更...
    dongbingliu閱讀 308評論 0 1
  • 目錄 本文的結(jié)構(gòu)如下: 什么是外觀模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應(yīng)用 模式擴展 補充 一、...
    w1992wishes閱讀 698評論 0 1
  • 文摘一:有些地方外觀模式也被叫做門面模式,英文即Facade Pattern,提前說明一下。 試想這種情況,用戶添...
    _淺墨_閱讀 590評論 0 1

友情鏈接更多精彩內(nèi)容