複製鏈接
請複製以下鏈接發送給好友

代理模式

鎖定
代理模式(英語:Proxy Pattern)是程序設計中的一種設計模式
所謂的代理者是指一個類別可以作為其它東西的接口。代理者可以作任何東西的接口:網上連接、存儲器中的大對象、文件或其它昂貴或無法複製的資源。
中文名
代理模式
外文名
Proxy Pattern
性    質
一種設計模式
適用範圍
程序設計
示    例
引用計數
組成角色
抽象角色、代理角色、真實角色

代理模式簡介

代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客户端和目標對象之間起到中介的作用。
著名的代理模式例子為引用計數(英語:reference counting)指針對象。
當一個複雜對象的多份副本須存在時,代理模式可以結合享元模式以減少存儲器用量。典型作法是創建一個複雜對象及多個代理者,每個代理者會引用到原本的複雜對象。而作用在代理者的運算會轉送到原本對象。一旦所有的代理者都不存在時,複雜對象會被移除。 [1] 

代理模式組成

抽象角色:通過接口或抽象類聲明真實角色實現的業務方法。
代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。
真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。 [2] 

代理模式優點

(1).職責清晰
真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。
(2).代理對象可以在客户端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。
(3).高擴展性 [1] 

代理模式模式結構

一個是真正的你要訪問的對象(目標類),一個是代理對象,真正對象與代理
對象實現同一個接口,先訪問代理類再訪問真正要訪問的對象。
代理模式分為靜態代理、動態代理。
靜態代理是由程序員創建或工具生成代理類的源碼,再編譯代理類。所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委託類的關係在運行前就確定了。
動態代理是在實現階段不用關心代理類,而在運行階段才指定哪一個對象。 [2] 

代理模式代碼示例

#include <iostream>
using namespace std;
class RealImage {
 int m_id;
 public:
 RealImage(int i) {
   m_id = i;
    cout << "   $$ ctor: " << m_id << '\n';
 }
 ~RealImage() {
   cout << "   dtor: " << m_id << '\n';
 }
 void draw() {
   cout << "   drawing image " << m_id << '\n';
 }
};
// 1. Design an "extra level of indirection" wrapper class
class Image
{
// 2. The wrapper class holds a pointer to the real class
 RealImage *m_the_real_thing;
 int m_id;
 static int s_next;
 public:
 Image() {
   m_id = s_next++;
    // 3. Initialized to null
   m_the_real_thing = 0;
 }
 ~Image() {
   delete m_the_real_thing;
 }
 void draw() {
   // 4. When a request comes in, the real object is
    //    created "on first use"
   if (!m_the_real_thing)
   m_the_real_thing = new RealImage(m_id);
   // 5. The request is always delegated
   m_the_real_thing->draw();
 }
};
 int Image::s_next = 1;
 int main() {
   Image images[5];
    for (int i; true;) {
   cout << "Exit[0], Image[1-5]: ";
    cin >> i;
   if (i == 0)
   break;
   images[i - 1].draw();
 }
 system("Pause");
};
參考資料
  • 1.    Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley. pp. 207ff. ISBN 0-201-63361-2.
  • 2.    "The Proxy design pattern - Structure and Collaboration". w3sDesign.com. Retrieved 2017-08-12.