Java中“装饰模式”和“代理模式”有啥区别( 四 )


EDIT:-
Relationship between a Proxy and the real subject is typically set at compile time, Proxy instantiates it in some way, whereas Decorator is assigned to the subject at runtime, knowing only subject\u0026#39;s interface.
http://stackoverflow.com/questions/18618779/differences-between-proxy-and-decorator-pattern

■网友
装饰可以 装了又装,层层包裹;代理通常不会代了又代。
■网友
设计模式看到这俩的时候,也是有点模糊,感觉两货不就是同一个东西吗? 都是实现同一个抽象接口,通过关联的方式来给一个对象增强功能。
仔细了解一下,两者还是有一些不同的地方的,而且我感觉设计模式这东西,都是满足了一些原则(开闭、依赖倒置、合成复用等等)来保证整个系统的扩展性、维护性,所以“模糊”其实是因为它们都遵循了这些原则,还是要结合实际的场景来看它们。
有没有感觉适配器模式跟代理模式乍一看也有点像?适配器关联了适配者,代理关联了被代理者,它们都满足了合成复用原则(使用关联而不是继承)。但是他们确实也有很大的不同,比如适配器的作用是为了协调新旧接口,代理的作用是在客户端和被代理者之间帮忙做一些额外的事。

回到问题本身,个人感觉装饰模式和代理模式差异在:
1、应用场景上,代理模式是为了帮助目标类增强一些自己不关心的事,比如日志代理,在目标类前后加一些日志。而装饰模式则是用来增强自身的功能,比如Java的InputStream那些的子类装饰类,提供了一些更方便的接口给我们调用。
2、使用方式上,代理模式一般在代理类中确定了要被代理的目标对象,客户端根本不知道被代理类的存在。而装饰模式中被装饰者对象需要客户端创建提供,并且可以层层嵌套,层层装饰。
这点从UML图就可以看出来,代理类关联的是具体的被代理类,而装饰者关联的是上层接口。
代理模式
Java中“装饰模式”和“代理模式”有啥区别

装饰模式

Java中“装饰模式”和“代理模式”有啥区别



■网友
代理模式就像VPN,你无法直接访问facebook,而是通过了一个你可以访问它且它可以访问facebook的服务器代理你去访问,并把数据给你。装饰模式正如其名,就好像你买了一个手机套,但这个手机套不能完全满足你的要求,于是你在手机套上刻上了你的大名,这样就满足了你的要求了。但这个手机套从核心上来说,还是你之前的手机套。
■网友
突发奇想,不要喷==
拿健身的例子来说,
装饰器模式相当于自己吃蛋白粉,健身,自己身体变的强壮了,自己能保护自己,还是一个人独闯天下;
代理模式详单于自己请了个保镖保护自己,自己的体格还是那个体格,但是出去闯荡社会不可能有人欺负咱了;


推荐阅读