Design patterns 为什么代理模式需要继承?

Design patterns 为什么代理模式需要继承?,design-patterns,proxy-pattern,Design Patterns,Proxy Pattern,查看,代理类和主题类都实现了相同的接口 据我所知,代理类的目的是委托。这可以通过合成来实现;委托类不必实现相同的接口 subject类必须实现与proxy类相同的接口,这有什么原因吗?proxy和subject应该提供相同的操作集。客户端无法识别请求的实例、代理或主题。它是隐藏的。正因为如此,这两个类实现了相同的接口。这更像是一个适配器(和对象适配器,使用四人组书籍中的术语)。当您稍后在项目中发现需要进行接口调整时,通常会使用适配器。我相信你会提前设计代理 一个原因可能是代理应该对您的客户透明。

查看,代理类和主题类都实现了相同的接口

据我所知,代理类的目的是委托。这可以通过合成来实现;委托类不必实现相同的接口


subject类必须实现与proxy类相同的接口,这有什么原因吗?

proxy和subject应该提供相同的操作集。客户端无法识别请求的实例、代理或主题。它是隐藏的。正因为如此,这两个类实现了相同的接口。

这更像是一个适配器(和对象适配器,使用四人组书籍中的术语)。当您稍后在项目中发现需要进行接口调整时,通常会使用适配器。我相信你会提前设计代理


一个原因可能是代理应该对您的客户透明。如果代理具有不同于主体的界面,那么这种透明度将被打破。试想一个并非所有主题都需要代理的用例,例如并非所有对象都是“远程”的。

主题类必须实现与代理类相同的接口有什么原因吗?

是的,但另一种方法是代理必须实现与主题相同的接口


客户端没有意识到它正在使用的实例是代理!客户认为这是一个
主题

这是否只有在涉及工厂时才有价值?如果客户机正在使用该主题,而后来我希望它使用代理,我如何才能这样做?(反之亦然)。为了让
客户机
不知道它是哪个实现,您必须向客户机提供
主题
实例(代理或真实主题),这是正确的。这可以通过工厂模式完成,但也可以通过构造函数或方法调用注入依赖项。如果客户端在该模式之前使用主题,则必须修改客户端,使其使用代理模式的主题抽象(看起来几乎像旧主题)。然后,客户不知道自己是在与某个主体还是其代理人交谈。我认为这个问题帮助我理解了两者的区别: