程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c++-請問大神們指點一下關於C++代理(委托)設計模式的問題

c++-請問大神們指點一下關於C++代理(委托)設計模式的問題

編輯:編程綜合問答
請問大神們指點一下關於C++代理(委托)設計模式的問題

static void function()
{
printf("this is a function\n");
}

class Fun
{
public:
virtual void func() = 0;
};

class RealFun : public Fun
{
public:
void func()
{
function();
}
};

class DelegateFun :public Fun
{
public:
RealFun *realFun;
DelegateFun()
{
realFun = new RealFun;
}
void func()
{
realFun->func();
printf("this is a delegate\n");
}
};

int _tmain(int argc, _TCHAR* argv[])
{
DelegateFun delegateFun;
delegateFun.func();
getchar();
return 0;
}
我想問一下我這個簡單的例子算不算代理設計模式,這樣是不是綁定了全局函數

最佳回答:


可以算代理模式,但是你要知道什麼情況下用代理模式。

代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。

你的程序中一個全局函數,寫一個代理模式,這個叫做畫蛇添足。我可以給你一個實際的場景,你體會下。

比如你有一個函數,fun();
你原先直接調用它就好了。

現在我們需要改一改,這個函數我們放在服務器上,而你的調用放在另一個客戶計算機上。
現在的問題來了,都不是一個計算機,你怎麼調用服務器上的這個函數呢?
你想到了一個辦法,服務器上用socket監聽一個端口,如果有別的計算機和它通訊,告訴它應該調用fun,並且傳什麼參數,這個網路通訊的程序就去調用fun(),傳入參數,並且把fun()的結果通過網絡返回客戶端。

客戶端怎麼做?因為問題轉化為網絡通訊了,而不是調用函數了,當然,你可以直接寫死,怎麼發數據,怎麼收數據。這樣就完成了功能。

但是你也可以用代理模式封裝一下,做法和服務器的socket類似,你也寫一個函數,叫fun(),表面上看它和服務器上的那個一樣,但是它不實際實現fun()真正的功能,而是接受傳入的參數,開一個網絡連接,發送函數調用的請求,服務器返回的數據作為它的返回再返回。

這樣你的客戶端調用這個客戶端上的fun()感覺好像是這個fun()就是一個實際有功能的函數一樣,這就是代理模式的用處。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved