关于代理模式(强制代理)的问题

看了好多网上的例子,大致都是下面这样:

客户端:

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?就算需要读者自己实现也得说明呀,这样要误导多少人?