天天看點

結構型設計模式: 代理模式(Proxy Pattern)結構型設計模式: 代理模式(Proxy Pattern)

結構型設計模式: 代理模式(Proxy Pattern)

CSDN專欄: 設計模式(UML/23種模式)

代理模式(Proxy Pattern)為通路對象提供一個代理對象來實作對被通路者的通路,其實就是在通路對象與被通路對象之間添加一個中介,用來隔離通路者與被通路者的具體實作細節。

代理模式(Proxy Pattern)屬于結構型模式。結構型模式涉及到如何組合類和對象以獲得更大的結構;結構型類模式采用繼承機制來組合接口或實作。結構型模式主要包括:Adapter模式、Bridge模式、Composite模式、Decorator模式、Facade模式、Flyweight模式和Proxy模式。結構型類模式在某種程度上具有相關性。

模式簡介

GOF的《設計模式》指出Proxy模式的意圖是:

為通路對象提供一個代理對象來實作對被通路者的間接通路。

對一個對象進行通路控制的一個原因是為了隻有在我們确實需要這個對象時才對它進行建立和初始化。在圖像處理應用中,我們操作的目标是圖像對象,該問題的解決方式是提供一個虛拟的圖像圖像,即圖像Proxy,替代那個真正的圖像。 Prox可以代替一個圖像對象,并且在需要時負責執行個體化這個圖像對象。

Proxy模式适用于以下場景:

  • 遠端代理(Remote Proxy)為一個對象在不同的位址空間提供局部代表。
  • 虛代理(Virtual Proxy)根據需要建立開銷很大的對象,諸如ImageProxy。
  • 保護代理(Protection Proxy)控制對原始對象的通路。保護代理用于對象應該有不同的通路權限的時候。
  • 智能指針(Smart Reference)取代了簡單的指針,它在通路對象時執行一些附加操作。

模式圖解

Proxy模式的UML示例如下:

結構型設計模式: 代理模式(Proxy Pattern)結構型設計模式: 代理模式(Proxy Pattern)

Proxy模式的工作過程如下:

  • 抽象對象(Subject):聲明了目标對象和代理對象的共同接口;
  • 目标對象(RealSubsuject):被代理或者被通路的對象;
  • 代理對象(Proxy):代理對象内部持有目标對象的引用,代理對象與目标對象實作相同的接口,Client 通路代理對象相當于間接通路目标對象。

Proxy模式的有益效果如下:

  • 降低通路者與被通路者之間的耦合度
  • 可以控制通路者對被通路者的通路權限
  • 虛拟代理通過使用一個小對象來代理一個大對象,可以減少系統開銷
  • 代理對象會增加邏輯的複雜度并且減慢對目标對象的通路速度

Abstract Factory 模式可以用來建立和配置一個特定的Proxy模式。Adapter模式用來幫助無關的類協同工作,它通常在系統設計完成後才會被使用。然而,Proxy模式則是在系統開始時就被使用,它使得抽象接口和實作部分可以獨立進行改變。

模式執行個體

Android Binder 類是實作程序間通信的媒介,由于程序間通信貫穿四大元件使用的始末,是以在 Android 開發過程中程序間通信随處可見,而 Android Binder IPC 模型是基于代理模式。Android Binder IPC 通信模型:

  • Client : 持有 Server 的本地 Binder 對象的代理對象;
  • Server : 持有本地 Binder 對象,為 Client 端提供功能性服務;
  • ServiceManager : 負責管理 Binder 服務,可以根據 Binder Name 擷取 Binder 引用,功能類似于 DNS 伺服器;
  • Binder 驅動 : Client 與 Server ,以及 Server 與 ServiceManager 之間的通信都會經過 Binder 驅動,維持 Binder - Proxy 與 Binder 實體引用之間的映射,根據 Client 端由 Binder Proxy 打包發送過來資料包,調用 Server 方法,再将傳回結果打包由 Binder Proxy 傳回 Client 端。

在Choices作業系統中KernelProxies為作業系統對象提供了通路保護,即采用了保護代理(Protection Proxy)。

在計算機科學領域中,提供垃圾收集(Garbage Collection)功能的系統架構,即提供對象托管功能的系統架構,例如Java應用程式架構,也是采用上述的引用計數技術方案來實作自動垃圾回收。Apple公司提出的Cocoa架構,當父對象要引用子對象時,就對子對象使用強引用計數技術,而當子對象要引用父對象時,就對父對象使用弱引用計數技術,而當垃圾收集系統執行對象回收工作時,隻要發現對象的強引用計數為0,而不管它的弱引用計數是否為0,都可以回收這個對象。

Android系統提供了強大的智能指針技術:輕量級指針(Light Pointer)、強指針(Strong Pointer)和弱指針(Weak Pointer)。它們的實作架構都是一緻的,即由對象本身來提供引用計數器,但是它不會去維護這個引用計數器的值,而是由智能指針來維護。

  • 輕量級指針(LightRefBase):請參考frameworks/base/include/utils/RefBase.h
  • 弱指針(RefBase-wp): 請參考frameworks/base/include/utils/RefBase.h
  • 強指針(RefBase-sp): 請參考frameworks/base/include/utils/RefBase.h

系列文章

  • CSDN專欄: 設計模式(UML/23種模式)
  • Github專欄: 設計模式(UML/23種模式)

參考文獻

  • GOF的設計模式:可複用面向對象軟體的基礎
  • 設計模式之禅
  • 圖說設計模式

繼續閱讀