如果在代理模式中我们有接口而不是代理中的实际具体主题 class 是否等同于装饰器模式
If In Proxy Pattern we have interface instead of actual concrete Subject in Proxy class is it equivalent to Decorator Pattern
代理模式在执行一些额外的处理后将请求委托给真实主体,例如应用检查是否需要处理请求基于可能是一些凭据检查。
有class图如下
Proxy class 直接引用了具体的 Subject。
装饰器模式丰富了组件的行为[和proxy一样它也做了一些额外的处理,将操作委托给真正的组件]。此模式的class图类似于代理模式,唯一不同的是它具有对组件接口的引用。
在 Proxy class 中有具体的真实主题使得单元测试变得困难,因为 类 应该只依赖于接口而不是实现。我的问题是,如果 Proxy 模式也有对 Real subject 暴露的接口的引用,那么它是否等同于 Decorator 模式。在这种情况下,代理模式的class图也会变成如下
一切都与意图有关。从功能上讲,它们是等价的,但装饰器的目的是动态地为对象添加功能,而代理只是控制对目标对象的访问,而不向其添加任何额外的功能。
因此,代理的客户端期望得到与使用真实对象相同的结果,而装饰器的客户端将其留给装饰器,以便在委派调用之后 and/or 之前执行任何附加逻辑到目标。
因此,从概念上讲,在您的示例中您似乎仍在处理代理。
是的。如果你看一下结构,Decorator 和 Proxy 都是一样的。只是意图不同。
装饰者:
- 在 运行 时间 向对象添加行为。继承是实现这一功能的关键,这既是这种模式的优点也是缺点。
- 它修改了界面的行为。
例如(带链接):java.io 与 InputStream
& OutputStream
接口相关的包 类
FileOutputStream fos1 = new FileOutputStream("data1.txt");
ObjectOutputStream out1 = new ObjectOutputStream(fos1);
后果
- 在 运行 时,装饰更便于为对象添加功能而不是整个 类。通过装饰,还可以动态删除添加的功能。
- 修饰在 运行 时向对象添加功能,这会使调试系统功能变得更加困难。
代理:
- 将其用于惰性初始化,通过缓存对象和控制对 client/caller 的访问来提高性能。它可以提供替代行为或调用真实对象。在此过程中,它可能会创建新的对象。
- 与允许链接对象的 Decorator 不同,Proxy 不允许链接。
例如:java.rmi包类
要点:
- Proxy 提供相同的接口。 Decorator 提供增强的接口。
- Decorator和Proxy目的不同但结构相似。两者都描述了如何提供对另一个对象的间接级别,并且实现保留对它们将请求转发到的对象的引用。
有用的链接:
Decorator_pattern 来自维基百科
decorator 来自 sourcemaking
decorator-pattern 来自 oodesign
Proxy_pattern 来自维基百科
proxy 来自 sourcemaking
proxy-pattern 来自 oodesign
代理模式在执行一些额外的处理后将请求委托给真实主体,例如应用检查是否需要处理请求基于可能是一些凭据检查。
有class图如下
Proxy class 直接引用了具体的 Subject。
装饰器模式丰富了组件的行为[和proxy一样它也做了一些额外的处理,将操作委托给真正的组件]。此模式的class图类似于代理模式,唯一不同的是它具有对组件接口的引用。
在 Proxy class 中有具体的真实主题使得单元测试变得困难,因为 类 应该只依赖于接口而不是实现。我的问题是,如果 Proxy 模式也有对 Real subject 暴露的接口的引用,那么它是否等同于 Decorator 模式。在这种情况下,代理模式的class图也会变成如下
一切都与意图有关。从功能上讲,它们是等价的,但装饰器的目的是动态地为对象添加功能,而代理只是控制对目标对象的访问,而不向其添加任何额外的功能。
因此,代理的客户端期望得到与使用真实对象相同的结果,而装饰器的客户端将其留给装饰器,以便在委派调用之后 and/or 之前执行任何附加逻辑到目标。
因此,从概念上讲,在您的示例中您似乎仍在处理代理。
是的。如果你看一下结构,Decorator 和 Proxy 都是一样的。只是意图不同。
装饰者:
- 在 运行 时间 向对象添加行为。继承是实现这一功能的关键,这既是这种模式的优点也是缺点。
- 它修改了界面的行为。
例如(带链接):java.io 与 InputStream
& OutputStream
接口相关的包 类
FileOutputStream fos1 = new FileOutputStream("data1.txt");
ObjectOutputStream out1 = new ObjectOutputStream(fos1);
后果
- 在 运行 时,装饰更便于为对象添加功能而不是整个 类。通过装饰,还可以动态删除添加的功能。
- 修饰在 运行 时向对象添加功能,这会使调试系统功能变得更加困难。
代理:
- 将其用于惰性初始化,通过缓存对象和控制对 client/caller 的访问来提高性能。它可以提供替代行为或调用真实对象。在此过程中,它可能会创建新的对象。
- 与允许链接对象的 Decorator 不同,Proxy 不允许链接。
例如:java.rmi包类
要点:
- Proxy 提供相同的接口。 Decorator 提供增强的接口。
- Decorator和Proxy目的不同但结构相似。两者都描述了如何提供对另一个对象的间接级别,并且实现保留对它们将请求转发到的对象的引用。
有用的链接:
Decorator_pattern 来自维基百科
decorator 来自 sourcemaking
decorator-pattern 来自 oodesign
Proxy_pattern 来自维基百科
proxy 来自 sourcemaking
proxy-pattern 来自 oodesign