适配器模式的本质
将一个接口类转换成客户希望的另一个接口,Adapter模式使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作。它的核心作用是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。
使用场景
1、已经存在的类的接口不符合我们的需求
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作。
3、后续系统的版本升级,扩展等起到很大作用。
实现方式
1、类适配器模式(采用继承的方式完成)
2、对象适配器(采用对象组合的方式)
类适配器
Target: 客户所期待的接口,目标可以是具体或抽象的类,也可以是接口。
Adaptee : 需要被适配的类
Adapter : 适配器类,把原接口转化为目标接口
Client: 客户端通过适配器获取到目标接口
具体代码
被适配的类
public class Adpatee {
public void request() {
System.out.println("可以完成客户的需求");
}
}
目标接口
public interface Target {
void hanldRequest();
}
适配器
public class Adpater extends Adpatee implements Target{
@Override
public void hanldRequest() {
super.request();
}
}
客户端
public class Client {
public void test(Target t) {
t.hanldRequest();
}
public static void main(String[] args) {
//适配器
Target adpater = new Adpater();
Client client = new Client();
client.test(adpater);
}
}
上述这种方式是类适配器,但是这种方式有一个最大的问题就是一旦这个适配器类继承了被适配类,就不能再集成其他的类,这样会不利于后续的拓展,所以下面推荐另一种方式,对象组合的方式进行适配。
适配器类
public class Adpater1 implements Target {
private Adpatee adpatee;
@Override
public void hanldRequest() {
adpatee.request();
}
public Adpater1(Adpatee adpatee) {
this.adpatee = adpatee;
}
}
客户端
public class Client2 {
public void test(Target t) {
t.hanldRequest();
}
public static void main(String[] args) {
//被适配对象
Adpatee adpatee = new Adpatee();
//适配器
Target adpater = new Adpater1(adpatee);
Client client = new Client();
client.test(adpater);
}
}
工作中的场景
1、经常用来做旧系统的改造和升级
2、如果我们的系统开发之后再也不需要维护,那么很多模式都是没有必要的,但是不幸的是,事实上维护一个系统的代价往往是开发一个系统的数倍。