標籤:情況 複雜 uml 開啟 視頻 cad comm 設計模式 相機
第二十三章、面板模式
面板模式是結構型設計模式之中的一個。它在開發中的運用頻率非常高。是我們封裝API的經常使用手段。我們經常使用的三方SDK基本都使用的面板模式,這樣能夠對使用者屏蔽非常多實現細節。減少使用者使用成本。
1.定義
要求一個子系統的外部與其內部的通訊必須通過一個統一的對象進行。面板模式提供一個高層次的介面,使得子系統更便於使用。
2.使用情境
(1)為複雜子系統提供一個簡單介面。對外隱藏子系統的詳細實現、隔離變化。
(2)當你須要構建一個階層的子系統時。使用面板模式定義子系統中每層的進入點。假設子系統之間是相互依賴的,你能夠讓它們僅通過外觀介面進行通訊,從而簡化了它們之間的依賴關係。
3.UML類圖
(1)Facade:系統對外的統一介面,系統內部系統地工作。
(2)其它分支:子系統介面。
能夠看出面板模式結構非常easy,可是假設沒有封裝,那麼使用者就要操作幾個子系統的互動邏輯。easy出現錯誤。
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)外觀類沒有遵循開閉原則,當業務出現變更時。可能須要直接改動外觀類。
《Android原始碼設計模式解析與實戰》讀書筆記(二十三)