适配器模式
定义
将一个类的接口变换客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
适配器模式又称为变压器模式,也叫做包装模式,装饰模式也是包装模式的一种
简单来说,适配器模式就是把一个接口或类转换成其他的接口或类
适配器模式有三个角色
1.Target目标角色
该角色定义把其他类转换为何种接口,也就是我们的期望接口
2.Adaptee源角色
你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的,运行良好的类或对象,经过适配器角色的包装,它会变成一个崭新,靓丽的角色
3.Adapter适配器角色
适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,他的职责非常简单:把源对象转换为目标角色
目标角色
public interface ITarget {
//目标角色有自己的方法
public String request1();
public String request2();
public String request3();
}
目标角色的实现
public class ConcreteTarget implements ITarget {
public String request1(){
System.out.println(“目标角色的初始信息1”);
}
public String request2(){
System.out.println(“目标角色的初始信息2”);
}
public String request3(){
System.out.println(“目标角色的初始信息3”);
}
}
源角色的实现
public class Adaptee {
//原有的业务逻辑
public void doSomething1(){
System.out.println(“源角色的初始信息1”);
}
public void doSomething2(){
System.out.println(“源角色的初始信息2”);
}
public void doSomething3(){
System.out.println(“源角色的初始信息3”);
}
}
注意 :源角色可以是在服役状态,也可以新建一个源角色然后套用适配模式
核心角色是适配器角色
适配器角色(也就是转换器角色) 继承源角色 实现目标角色
public Class Adapter extends Adaptee implements Target {
public void request1() {
super.doSomething1();
}
public void request2() {
super.doSomething2();
}
public void request3() {
super.doSomething3();
}
}
场景类
public class Client {
public static void main (String[] args) {
//原有的业务逻辑
ITarget target = new ConcreteTarget();
target.request1();
target.request2();
target.request3();
//增加了适配器角色后的业务逻辑
ITarget target2 = new Adapter();
target2.request1();
target2.request2();
target2.request3();
}
}
优点
1.适配器模式可以让两个没有任何关系的类在一起运行,只有适配器能够搞定他们之间的关系就行
2.增加了类的透明性
我们访问的是Target目标角色,但是具体的实现都委托了给源角色,而这些对高层次模块是透明的,也是它不需要关心的
3.提高了类的复用性
源角色在原有的系统中还是可以正常使用,而在目标角色中也可以充当新的角色
4.灵活性非常好
如果有一天不想要适配器,只要删除了适配器就可以了,其他的代码都不用修改,基本上就是类似一个灵活的构件,想用就用,不想就卸载
使用场景
你有动机修改一个已经投产的接口时,适配器模式可能是最适合你的模式,比如系统扩展,需要使用一个已有或新建立的类,但是这个类有不符合系统的接口时
注意事项
适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,适配器模式是为了减少代码修改带来的风险。
项目一定要遵守依赖倒置原则和里斯替换原则,否则即使在适合使用适配器的场合下,也会带来非常大的改造。