适配模式的定义如下:
将一个类的接口转换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一个工作
适配器模式在生活中还是很常见的,比如你的笔记本上的电源适配器,可以使用在110-220V之间变化的电源,而笔记本还能正常工作
适配器模式的通用类图:
从类图中可以得知适配模式主要设计到三个角色:
1.Target目标角色
该角色定义把其他类转换为何种接口,也就是我们期望的接口
2.Adaptee源角色
需要转换成目标接口的角色,他已经存在、运行良好的类或者对象,经过适配器角色的包装会成为一个新的角色
3.Adapter适配器角色
适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建的,它的职责非常简单就是把源角色转换为目标角色
适配模式通用代码如下:
/** * 目标角色 * */ public interface Target { public void request(); }
/** *源角色 */ public class Adaptee { public void dosomething(){ System.out.println("do some thing"); } }
/** * 适配器角色 * */ public class Adapter extends Adaptee implements Target { /** * * @see com.huashao.chapter.chapter19.ch01.Target#request() */ @Override public void request() { super.dosomething(); } }
public class Client { public static void main(String[] args) { Target target=new Adapter(); target.request(); } }
从通用类图以及代码中可以看出适配有如下特点:
1.适配器模式可以让两个没有任何关系的类在一起工作
2.增加了类的透明性
我们访问的target目标角色,但是具体的实现都委托给了源角色,而这些对高层模块是透明的,它们不需要关心
3.提高了类的复用性
源角色在原有系统中还是可以使用的,而在目标角色中可以充当新的成员
4.灵活性高
某一天,需求变了,不想使用这个适配器了,ok,删掉这个适配器就行了,其他代码不需要修改,就类似于可插拔
适配器模式的使用场景:
你有动机修改一个已经投产中的接口时,适配器模式就派上用场了
需求是多变的,可能需求并不是将一个类转换为目标角色,而是将多个类转换为目标角色,但是java规范中类只能单集成,那么如何使用适配器模式呢?
既然不能集成,那就只能使用组合方式了,我们把这种适配器模式称为对象适配器模式,上一种模式称为类适配器模式
对象适配器模式类图如下: