2013-03-11 27 views
3

我已阅读,装饰适配器更透明的客户端,这是该透明度这使得嵌​​套的装饰成为可能。在这种情况下,透明度究竟意味着什么?装饰器比适配器更透明是什么意思?

P.S:我知道这些设计模式。所以你可以基于你的答案在这个前提下。

回答

5

装饰器接受给定类型A的对象,并将其包装到相同类型A的对象中。客户端可以使用装饰对象,因为它们具有相同类型,因为它使用实际对象。

的适配器采用给定类型A的对象,并将其包装成另一种类型B.其中所用的原始型A A客户端然后必须适于使用其他类型B.

的目的即说,如果我们使用适配器模式,正是因为客户需要一个B类型的对象,而我们只有一个A类型的对象。所以我们把它包装到一个适配器中,使它成为B类型的一个对象。

这两种模式使用相同的原理(包装),但用于不同的目的。修饰器来改变原始对象的行为。一个适配器来改变它的类型。

+0

透明度部分呢? – Geek 2013-03-11 19:49:02

+1

这就是我在第一部分中解释的:客户端使用装饰器的方式与使用装饰对象的方式相同,因为它们具有相同的类型。它对客户是透明的。您可以像写入FileOutputStream一样将字节写入BufferedOutputStream,因为它们都是OutputStream。 – 2013-03-11 19:50:57

3

使用装饰器和装饰对象(都具有相同的接口)之间的客户端没有区别。因此装饰器是透明的(即客户端不可见)。装饰者也可以被其他装饰者装饰 - 这不会影响客户端。客户端仍然可以认为他正在装饰对象。

尼斯样品是Streams。你可以传递任何数量的装饰器(压缩,加密,缓冲)装饰的流,但这些装饰器将保持不可见的任何客户端使用流。

其实我不明白为什么适配器可以被认为是透明的。客户端不应该知道适配器的类型,并且客户端不能将适配器视为适配器,因为它们具有不同的接口。

0

回答装饰者是如何透明的,比为什么适配器是偷偷摸摸或混乱的。装饰者往往更容易嵌套到大规模功能(这通常是正交的,例如,BufferedFileWriter增加了缓冲,这并没有真正改变其包装类的基本操作:它将这些操作委托给原始的)。通常,您可以很容易地看到装饰器正在做什么,因为它在自己的原始界面中隐藏自身。

适配器可以同样透明。我猜想嵌套适配器更困难的原因是你正在谈论改变一些状态对象。然后你很快就会陷入所有的丑陋(这是在MVC中发生的事情之一)。举例来说,我有一个老的应用程序,给了我一个输入一堆风险评级。有一个新的Web界面想要使用它,但它需要另一种格式的数据。我们无法更改原始代码,因此我们引入了可翻译的适配器。什么是翻译?一般是一些状态表示。因此,如果界面不同,它将采取输入并转换并重新调整它们,如果输出需要进一步的按摩,那么。如果您将多个适配器分层,那么您很快就会发现自己很难弄清谁对提交的最终对象(服务或服务返回给用户)做出了什么贡献。

修饰器通常不用于这种翻译工作,而是用于补充我们要么没有代码的东西的功能,要么补充新功能正交的东西的功能,因此我们允许用户可以使用或不使用一个或多个装饰器。