源码均以JDK1.8作为参考
1.定义:
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2.解析:
Adapter Pattern又称为Wrapper Pattern,提到Adapter Pattern,最先会想到的可能就是电源适配器,例如一台12V的电脑需要改到家用220V交流电源上使用,就需要使用交流电适配器,对电源进行转换。
在Java语言中,就是为了将现有类进行包装或适配来完成既有功能。
通用类图:
类图解析:
2.1.Client角色
具体应用的角色,是经过适配器包装之后的使用者。
2.2.Target目标角色
该角色定义了把其他类转换为何种接口,即我们期望的接口。
2.3.Adaptee源角色
通常是已经存在、运行良好、经过严格测试的类,经过适配器角色的包装后,会成为一个新的类,附加一些新的功能。
2.4.Adapter适配器角色
适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建的,它的职责非常简单:把源角色转换为目标角色。
适配器模式的实现方式:
1) 面向类的适配器模式
适配器角色以继承的方式增加源角色具有目标角色约定的功能
2) 面向对象的适配器模式
适配器以持有对象引用的方式,使得目标角色具有源角色的同时具有其他功能
这两种方式都可以完成对源角色的封装,但是面向类的实现方式有一定的局限性,因为Java中是不允许多继承的,所以此适配器角色只可以完成对于一种源角色的包装。
但是面向对象的实现方式,由于适配器角色持有的是源角色引用,所以适配器角色可以对多个源角色进行包装,以达到目标角色要求的目的。
3.具体应用:
3.1.Client角色
public class Client {
public static void main(String[] args) {
// .. 原有的业务逻辑
Target target = new ConcreteTarget();
target.request();
// .. 现在增加了适配器角色后的业务逻辑
Target target2 = new Adapter();
target2.request();
}
}
3.2.Target目标角色
public interface Target {
// .. 目标角色有自己的方法
public void request();
}
public class ConcreteTarget implements Target {
public void request() {
System.out.println("if you need any help,pls call me!");
}
}
3.3.Adaptee源角色
此处的源角色可以已经在运行状态,所以修改源角色以达到目标角色的目的,是不明智的。
public class Adaptee {
// .. 原有的业务逻辑
public void doSomething(){
System.out.println("I‘m kind of busy,leave me alone,pls!");
}
}
4.Adapter适配器角色
面向类适配模式
public class Adapter extends Adaptee implements Target {
public void request() {
super.doSomething();
}
}
面向对象适配模式
public class Adapter implements Target {
// .. 此处可以同时定义多个源角色的引用,以达到Adapter包装多个源角色的目的
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
public void request() {
adaptee.doSomething();
}
}
可以看到通过Adapter类可以实现由Adaptee到Target的转换,同时如果Target要求新的实现时,也可以在Adapter中增加具体的实现。而面向类和面向对象的两种适配模式,使得适配器模式在使用时更加灵活,如果需要复杂的适配,则需要像面向对象的实现方式一样,可以完成对多个源目标的适配。
4.应用场景:
适配器模式,一般情况下,是不会在设计初期被考虑的,其存在的目的就是为了在系统运行后期,由于设计缺陷或者需求更新导致的问题,通过适配器达到兼容之前版本,并且能使当前版本能正常运转的手段。
适配器模式可以让两个没有任何关系的类在一起运行,同时由于未对原有的实现做出更改,在设计时提高了类的复用度,同时使类与类之间松散耦合,降低类与类之间的依赖度。当系统不需要新增的功能时,只需删除此适配器,并不会对原有的设计造成任何影响。
注:本人是参照《设计模式之禅》和《设计模式》两本书学习所得,其中加入了自己对于Iterator设计模式的理解,以及对于JDK中源码的理解。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/securitit/article/details/47271717