代理模式在执行一些额外的处理(如应用检查)之后将请求委托给真实的主体,如果请求需要处理或不需要处理,则可能基于一些凭证检查。
它的类图如下
代理类直接引用具体的主题。
decorator模式丰富了组件的行为[像代理一样,它还做一些额外的处理,并将操作委托给真正的组件]。这个模式的类图类似于代理模式,唯一的区别是它引用了组件的接口。
在代理类中有具体的真实主题使得单元测试变得困难,因为类应该只依赖于接口而不是实现。我的问题是,如果代理模式也引用了真实主体公开的接口,那么它是否等同于decorator模式。在这种情况下,代理模式的类图也将变为如下所示
2条答案
按热度按时间vi4fp9gy1#
一切都是为了意图。在功能上,它们是等价的,但是decorator的重点是动态地向对象添加特性,而proxy只控制对目标对象的访问,而不向其添加任何附加特性。
因此,代理的客户机期望的结果与处理真实对象的结果相同,而decorator的客户机则让decorator在将调用委托给目标之前和/或之后执行任何附加逻辑。
所以,从概念上讲,在您的示例中,您仍然在处理代理。
hujrc8aj2#
对。如果看一下结构,decorator和proxy都是一样的。只有目的不同。
装饰师:
在运行时向对象添加行为。继承是实现此功能的关键,这是此模式的优点和缺点。
它改变了界面的行为。
e、 g.(带链接):与
InputStream
&OutputStream
接口后果
装饰对于在运行时向对象而不是整个类添加功能更为方便。通过装饰,还可以动态删除添加的功能。
装饰在运行时向对象添加功能,这将使调试系统功能变得更加困难。
代理:
使用它进行延迟初始化,通过缓存对象和控制对客户机/调用者的访问来提高性能。它可以提供另一种行为或称为真实对象。在此过程中,它可能会创建新对象。
与允许对象链接的decorator不同,proxy不允许链接。
e、 g.:java.rmi包类
关键要点:
代理提供相同的接口。decorator提供了一个增强的接口。
decorator和proxy有不同的用途,但结构相似。两者都描述了如何为另一个对象提供一个间接级别,并且实现保留了对转发请求的对象的引用。
有用的链接:
wikiepdia的decorator\u模式
来自sourcemaking的decorator
oodesign的装饰图案
维基百科的代理模式
sourcemaking代理
oodesign中的代理模式