看了好多网上的例子,大致都是下面这样:
客户端:
IProxy proxy = subject.GetProxy();
proxy.DoSomething();
Subject 对外暴露的方法:
public void DoSomething()
{
if (null == proxy) {
throw new Exception("...");
}
// TO DO
}
public ISubject GetProxy()
{
if (null == proxy) {
proxy = new Proxy(this);
}
return proxy;
}
问题是:
如果客户端如下操作一样能跳过代理:
IProxy proxy = subject.GetProxy();
subject.DoSomething();
因为只要GetProxy调用过,
DoSomething就可以跳过强制代理直接调用了。
请问该如何解决?
代理模式不是用来密封原有对象成员的。要做到你的要求,如果是C#,需要用codedom或者emit等动态生成类。
没有研究过CodeDom和Emit,不明觉厉,但还是谢谢你!
我在看《设计模式之禅(第2版)》时也发现这个问题,难道要读者自己实现IsProxy?就算需要读者自己实现也得说明呀,这样要误导多少人?