设计模式之适配器模式
1.什么是适配器模式?
适配器估计大家都听说过,我们常见的比如说转接头,拓展坞,读卡器等等,都是适配器的一种体现,适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
2.为什么用适配器模式?
适配器大家总是停留在自己项目代码的层面去思考这个,最后导致全都是疑问,就想常说的,我A服务需要去调B服务的方法,那直接把B注入到A直接调不就好了,干嘛还要整个C出来碍事,其实这种就属于硬套设计模式了,也不是这么用的,这个设计模式为啥要用呢,主要是在无法修改调用方或非调用方内容或者都是黑盒状态的时候,为了能够灵活控制调用方式实现可控才去用的模式,我是这么理解的,比如说,内存卡,读卡器和笔记本,我们没有办法去让笔记本直接读取内存卡中的数据,这个时候内存卡的数据我们可以灵活控制或者也不能控制,笔记本我们肯定不能灵活控制它去主动去内存卡,这个时候我们就需要在两者之间做一个桥梁,让数据可以流通,并且读卡器我们可以随意更换品牌,也就是适配器我们可以灵活控制,来达到最终的目的。再比如JDK 1.1 提供的 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
3.适配器模式怎么用?
先来看一下对象适配器模式的UML图,如下:
适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。在实际开发中,对象适配器的使用频率更高,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系,因为java是单继承的模式,因此类适配器的使用受到很多限制,例如如果目标抽象类Target不是接口,而是一个类,就无法使用类适配器;此外,如果适配者Adapter为最终(Final)类,也无法使用类适配器。
- Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
- Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
- Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
//对象适配
class Apadter extends Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee=adaptee;//关联适配者
}
public void 适配器方法() {
adaptee.适配者方法(); //适配操作
}
}
//类适配
class Apadter extends Adaptee implements Target{
public void 适配器方法() {
适配者方法(); //适配操作
}
}
4.总结
优点:
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
5、满足开闭原则
缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。
2、由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
注意事项:适配器不是在详细设计时添加的,而是为了解决正常服役的项目出现的不兼容问题。