问题描述
- 关于代理模式(强制代理)的问题
-
看了好多网上的例子,大致都是下面这样:客户端:
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?就算需要读者自己实现也得说明呀,这样要误导多少人?
解决方案四:
强制代理
代理模式(python)
代理模式
时间: 2025-01-24 15:29:40