将一个类的接口转换成客户希望的另外一个接口。A d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用对象组合,以修改的接口包装被适配者,被适配者的任何子类,都可以搭配着适配器使用。
把客户和接口绑定起来,而不是和实现绑定起来。
我们可以使用数个适配器,每一个都负责转换不同的后台类。
类适配器,你需要多重继承才能实现它,这在Java和C#中是不可能的。但是当你使用多重继承语言的时候,还是可能遇到这样的需求。
类适配器的类图:
PS:对象适配器和类适配器使用两种不同的适配方法,分别是组合与继承。
(1)我们在使用第三方的类库,或者说第三方的API的时候,我们通过适配器转换来满足现有系统的使用需求。
(2)我们的旧系统与新系统进行集成的时候,我们发现旧系统的数据无法满足新系统的需求,那么这个时候,我们可能需要适配器,完成调用需求。
(3)我们在使用不同数据库之间进行数据同步。(我这里只是分析的是通过程序来说实现的时候的情况。还有其他的很多种方式[数据库同步])。
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。
(1)关于新职责
适配器也可以在转换时增加新的职责,但主要目的不在此。装饰者模式主要是给被装饰者增加新职责的。
(2)关于原接口
适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)
(3)关于其包裹的对象
适配器是知道被适配者的详细情况的(就是那个类或那个接口)。装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道
PS:装饰者模式用来添加一些新的功能,而维持接口不变。适配器模式关注于接口的转换
为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
外观没有封装子系统的类,外观只是提供简化的接口
外观只是提供你更直接的操作,并未将原来的子系统阻隔起来,如果你需要子系统类的更高层功能,还是可以使用原来的子系统。
可以为一个子系统创建许多个外观。
外观模式不只是简化了接口,也将客户从组件的子系统中解耦
比如,你想升级你的子系统(你的家庭影院),如果当初你的客户代码是针对外观而不是针对子系统编写的,现在你就不需要改变客户代码,只需要修改外观代码。
适配器模式,主要是对适配对象进行调整,以便适合消费者的需求。从而达到消费者和被适配者解耦的目的。
外观模式的特点主要是简化接口,以及减少客户端对外观组件的耦合。因为如果客户端变化来,组件的子系统变化了,不用影响客户端。除此之外,在封装组件时,适当的在外观类中添加一些自己想要的规则。
总结:本篇文章介绍了适配器模式,装饰模式和外观模式的基本知识,并根据各自的特点进行比较。适配器模式利用组合实现,将一个对象包装起来以改变其接口;装饰模式利用开放封闭原理,将一个对象包装起来以增加新的行为和责任;外观模式利用最少知识原则,将一群对象包装起来以简化其接口。这三个各有特点,我们在使用时要注意。
原文地址:http://blog.csdn.net/u010168160/article/details/45273765