一.定义
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
二.介绍
说道适配器模式,让我想起了小时候看的VCD,后面出了一个叫DVD的可以兼容VCD,我想这应该是适配器模式的一种体现吧。说的比较抽象,你们可以脑补一下。
2.1 主要作用
适配器模式在保留现有服务的前提下,并向客户提供新的接口满足客户目前的期望。简单点说就是不改变接口,但加入责任
按类别可划分为 对象适配器模式 和 类适配器模式
2.2 解决问题
使那些不能在一起使用的类和对象通过适配器模式能够在一起使用
2.3 类适配器UML类图
Target: 该角色为目标角色,也就是我们期望的接口
Adaptee:为源角色,需要去适配的的角色,换句话就是说,需要被适配器转换包装的角色,注意源角色是已经存在的角色,不是新new出来的
Adapter:为适配器角色,把源角色包装转换成目标角色,
2.4 代码讲解类适配器
1.创建目标角色
public interface Target {
void request();
}
2.目标角色的实现类
public class ConcreteTarget implements Target {
//实现目标角色接口方法
public void request() {
System.out.println("request");
}
}
3.创建源角色
public class Adaptee {
//源角色的业务逻辑
public void specificRequest() {
System.out.println("specificRequest");
}
}
4.适配器登场。继承源角色,也可以通过构造函数,把源角色传递进来
public class Adapter extends Adaptee implements Target {
//调用源角色的业务逻辑
@Override
public void request() {
super.specificRequest();
}
}
业务场景如下
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target target2 = new Adapter();
target2.request();
}
源角色Adaptee 通过类适配和目标角色关联在一起使用,实现了新的业务逻辑
2.5 对象适配器UML类图
根据对象适配器模式结构图,在对象适配器中,客户端需要调用 multiplication 方法,而适配者类 Adaptee1 没有该方法,但是它所提供的add方法也是客户端所需要的。为了使客户端达到目的,通过适配器与适配者类关联(也可称之为委派),这种方式适配称之为对象适配器模式。
2.6 代码讲解类适配器
步骤1.还是创建目标角色,我们所期望的角色
public interface Target {
void add(int a ,int b);
void multiplication(int a);
}
步骤2.定义需要被适配的类Adaptee1和Adaptee2
public class Adaptee1 {
public void add(int a ,int b){
System.out.println(a+b);
}
}
public class Adaptee2 {
public void multiplication(int a){
System.out.println(a*a);
}
}
步骤3.创建适配器实现目标接口
public class Adapter implements Target {
private Adaptee1 adaptee1;
private Adaptee2 adaptee2;
public Adapter() {
adaptee1 = new Adaptee1();
adaptee2 = new Adaptee2();
}
@Override
public void add(int a, int b) {
adaptee1.add(a,b);
}
@Override
public void multiplication(int a) {
adaptee2.multiplication(a);
}
}
应用场景
public static void main(String[] args) {
//创建适配器
Adapter adapter = new Adapter();
adapter.add(10,10);
adapter.multiplication(10);
}
在本实例中使用对象适配器模式,增加一个新的适配器类,来适配支持客户端的要求,原有代码无须修改。可以在不修改客户端代码的情况下使用新的适配器,无须修改源代码,符合“开闭原则”。
三.总结
优点
- 使原本不相关联的类,可以结合在一起使用
- 利于维护,假使那天要使用原来的版本,直接删掉适配器用原来的版本就行
缺点
- 适配器模式是作为一种补救模式存在的,只能适当的使用,使用过多的话会让内部混乱
使用场景
- 比如在扩展业务的时候,有一个类的设计与业务相符合,但是不符合现有的接口设计可以使用适配器模式做兼容让该类能够被使用