作者atst2 (atst2)
看板Soft_Job
标题Re: [请益] 请问学哪个比较实用
时间Sat Feb 20 00:29:13 2010
直接回应比较快.
以下都是单纯技术上说明.
※ 引述《remmurds (雷穆尔德‧小一)》之铭言:
: 没错,但是「delegate是从observer pattern演变而来」这种说法绝对会让人笑掉大
: 牙。delegate确实可以拿来实作这玩意儿,但不表示delegate是因它而诞生的。
^^^^^^^^
这里不清楚你指的是Pattern还是Delegate Class.
如果指的是Pattern, Delegate和Observer两种的用途并不一致,可以比较,
但不应混为一谈.
: → atst2:delegate就是delegate,跟observer,或function point无关. 02/19 16:25
: → atst2:真要说的话,delegate比较类似一种Template method的变型 02/19 16:25
上面是我所说的,完全是以Pattern的角度来看.
我後来又查了一下,目前以Delegate为名的Pattern还不少(其中Java有所谓的
Business Delegate, 其实应该算是Proxy的变化,) 而我所提的Delegate,
指的是Template Delegate Pattern.(这边可能大家认知上不太一样,还望其他网友补充)
这个Template Delegate会用在什麽地方呢? 就个人所接触到的例子来说,
Apple的Cocoa Framework算是用的最凶的.
通常他的使用模式如下:
A物件可能有一个method a, 在a里面, 可能有步骤 1, 2, 3....n
有些时候, 开发者会希望动态替换掉其中的步骤 x, 或步骤 y,
或是能在某几个步骤自行实作, 这时候Template Delegate就有用了.
他的型式会像下面(以C++为例)
//example.h
class DelegateOfA {
public:
virtual int StepX() = 0;
virtual int StepY() = 0;
};
class A {
public:
int SetDelegate(DelegateOfA*);
DelegateOfA* GetDelegate();
int a();
private:
DelegateOfA* _delegate;
};
class B : public DelegateOfA {
....
};
而在 a method里, 原本的步骤会被替换为下:
int A::a () {
1;
2;
3;
...
//x
_delegate->StepX();
...
_delegate->StepY();
...
n;
}
这个pattern所想要达成的目标, 很接近Template所要达成的,
但比起Template来说, 这个pattern允许使用者在run-time更换不同的模组,
同时并不需要语言上有特别的支援.(这也是为什麽Cocoa大量使用的原因, 因为Obj-C
并没有template的支援)
: http://msdn.microsoft.com/zh-tw/library/system.delegate.aspx
:
: 注意事项下方的第一段:「当委派表示在其第一个引数上关闭的执行个体方法时(最
: 常见的案例),委派会储存方法进入点(Entry Point)的参考和物件的参考」
:
: 事实上在我眼中无论是function point、method reference、callback还是delegate
: 其实都是大同小异的碗糕,差别只在於安不安全与便不便利罢了。delegate是我认为C#做
: 得比Java还要好的地方之一,只不过了解它好用的地方的人似乎并不多。
:
: 当然这只是我个人使用经验的心得,有什麽不足之处欢迎补充说明了。
个人认为,我们现在在讨论的是不同的东西,看能不能请您贡献一下所学,
让小弟了解一下不同的pattern.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.43.70
1F:→ remmurds:没错 确实是在讲不同的东西哩 02/20 08:00