什么是适配器模式
考虑这么一个场景,系统有接口A、A含有D函数,类B继承了A并实现了D,现在我们想用类C来替换类B,类C中的E方法和类B实现的D函数功能类似,效率更高,但是类C的该方法名称和D不一样,此时我们怎么做呢?
1、更改D函数的名称,但是系统中继承A的其他类就会出现问题
2、更改E方法的名称,但是系统中引用E方法的地方又会出错
此时便可以使用适配器模式
适配器模式的角色
Target:目标抽象类,即例子中的接口A
Adapter:适配器类
Adaptee:适配者类,即例子中的类C
Client:客户类
适配器实现有两种方式:
1、类适配器:
适配器类继承了适配者类和接口:
public interface Target {
void request();
}
public class Adaptee {
void SpecificRequest(){
System.out.println("适配者的方法");
}
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
this.SpecificRequest();
}
这种写法缺点很明显,一个适配器类只能服务于一个适配者,当系统中适配者类比较多时,这种写法就不太合适,但是这种写法也有一定的灵活性,适配器可以覆盖适配者类的方法
当系统中一个接口的适配者类比较多时,可以考虑使用对象适配器:
public class Adapter2 implements Target{
Adaptee adaptee;
Adapter2(Adaptee adaptee){
this.adaptee=adaptee;
}
@Override
public void request() {
this.adaptee.SpecificRequest();
}
}
将适配者的装配交给客户端决定,可以让一个适配器类适配多个适配者类(前提条件是适配者类都具有相同的方法名),对象适配模式将适配器与适配者解耦,提高了系统的灵活性,
适配器模式的一点思考
适配器模式很好的体现了开闭原则,我们可以通过替换现有类来升级系统,同时不更改现有系统的代码,适配器模式在模式设计与实现上没有给我太多惊艳的感觉