设计模式(09) 适配器模式(简单入门 结构模式)

来源:互联网 发布:js pop 编辑:程序博客网 时间:2024/05/22 06:48

From Now On,Let us begin Design Patterns。

适配器模式

定义

  • 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.

通用类图:
这里写图片描述

角色说明:
1. Target目标角色:定义期望的接口

2. Adaptee源角色:待转换的源角色

3. Adapter适配器角色:通过继承或是类关联的方式,将源角色转换为目标角色

关键点:适配器类继承原有的类,获得父类中需要被适配的方法,实现目标接口,实现的时候调用原有类中的方法。仅此而已,没什么。还有一种就是两者都是接口,我们可以使用关联关系。

目的:不修改原有的代码,解耦

适配器通用代码:
这里写图片描述

适配器模式优点:[补救模式]

  • 让两个没有任何关系的类在一起运行

  • 增加了类的透明性,高层模式并不知道源角色的实现

  • 提高了类的复用性,源角色在新旧两个系统都可以使用

  • 灵活性好,若某天不需要了,拆掉适配器即可

  • 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码

  • 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口

适配器模式的缺点:

  • 对于对象适配器来说,更换适配器的实现过程比较复杂。

适配器模式的使用场景:

需要修改一个已经投产中的接口时,适配器模式可能是最适合的模式。比如:系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口。

想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作

两个类所做的事情相同或相似,但是具有不同接口的时候

旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候

使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能

注意事项:

最好不要在“详细设计阶段”考虑它,它不是为解决还处在“开发阶段的问题”,而是解决“正在服役的问题”。其主要场景是扩展应用

还要遵守依赖倒置原则和里氏替换原则,否则也会带来大面积的修改

适配器模式的例子:源自head frist of 设计模式

我们举一个火鸡变凤凰的例子:

类图:
这里写图片描述

凤凰接口和火凤凰的实现:期望的目标类
这里写图片描述

火鸡接口和野火鸡的实现:需要被适配的类
这里写图片描述

我们将火鸡变成凤凰:适配器
这里写图片描述

火鸡要变凤凰啦:
这里写图片描述

运行结果:
这里写图片描述
testPhoenix方法只认凤凰,但是它没想到一只冒充凤凰的火鸡混入其中,也装模作样地像凤凰一样叫和飞。

适配器模式充满着良好的OO设计原则:使用对象组合,已修改的接口包装被适配者。另外的优点是被适配者的子类,都可以搭配适配器使用。
当我们维护别人写的代码的时候:最后的办法不是去修改别人的方法名或者方法体,而是使用这个模式将其适配成我们需要的方法名或者体,这里返回的实体是改变的,而装饰者模式返回的实体是不变的。
适配器模式在实践中的使用场合:想使用一个已存在的类,但是如果它的方法和你的要求不同时,而你又不想更改客户端的代码时,可以考虑使用适配器。比如:公司在设计一个系统考虑使用第三方开发组件,而这个组件的接口和我们自己的系统接口不同,而我们也没必要为了迎合它而改变自己的接口,就可以考虑使用适配器模式来解决问题。

阅读全文
0 0