开个玩笑,这里是一篇适配器模式讲解
定义: 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
使用场景:
1:不动原代码的基础上横向扩展功能
2:系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。
关于这个设计模式的本质:
1:写一个类(适配器类),
2:继承或者注入功能类,
3:实现要用的接口,
4:重写接口方法,并在内部调用功能类
后续调用:
new 适配器类 ,接口接收
接口对象调用方法(间接调了功能类的方法)
类适配器:
问:为什么叫类适配?
答:大概是因为适配器真正调用的是父类方法
📎Adaptee.java
📎ClassAdapter.java
📎ClassAdapterTest.java
📎Target.java
类适配器在三种适配器里的特征:适配器需要继承父类,实现目标接口
核心:
适配器类:继承 要调用的 功能类实现 要返回的 接口重写接口方法,并在接口方法内 调用 父类方法使用:1:new 适配器类,并以接口接收2:接口对象,调用方法(方法内部调用的父类(使用的他的功能))显著特征:1:new 适配器(); 返回的是目标接口2:适配器类:继承功能类,重写接口,最终重写的方法仍然调用了父类的方法意义:在不动接口与父类的基础上,给接口扩展了功能
/*** 这是客户所期待的接口,目标可以是具体的或抽象类,也可以是接口*/
public interface Target {void request();
}/*** 需要适配的类,被访问和适配的现存组件库中的组件接口*/
public class Adaptee {public void specificRequest(){System.out.println("适配者中的业务代码被调用!");}
}/*** 类适配器类*/
public class ClassAdapter extends Adaptee implements Target{@Overridepublic void request() {specificRequest();}
}//客户端代码
public class ClassAdapterTest
{public static void main(String[] args){System.out.println("类适配器模式测试:");Target target = new ClassAdapter();target.request();}
}
对象适配器:
备注:注入对象版的类适配器
/*** 对象适配器,通过在内部包装一个 Adaptee 对象,把源接口转换为目标接口*/
public class ObjectAdapter implements Target {// 建立一个私有的 Adaptee 对象private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {// 把表面上调用 request() 方法变成实际调用 specificRequest() adaptee.specificRequest();}
}//客户端代码
public class ObjectAdapterTest
{public static void main(String[] args){System.out.println("对象适配器模式测试:");// 对客户端来说,调用的就是 Target 的 request()Target target = new ObjectAdapter();target.request();}
}
📎Adaptee.java
📎ClassAdapterTest.java
📎ObjectAdapter.java
📎Target.java
📎TeeFather.java
网上的1.0版:相比于类适配器:对象适配器不再继承功能类,而是把功能类做为字段,使用时直接传入需要用的功能类,并用接口接收我改进的2.0版:适配器类,里面的字段是功能类的父类使用时,传入子类即可优点:有多种选择时,可使用这种
1.0
2.0
备注:
https://www.jianshu.com/p/c87265610d2a
当时我也不懂这个设计模式,所以就在网上翻了下
很多人都写了
但我觉得写的最好的是上边这个人的最好,最能理解
这里我也把他的地址贴出来
接口适配器:
场景:
假设一个接口有5个方法,但是我们只想使用其中的3个
1:先写个类(抽象的也行,普通的也行,网上很多时抽象的),实现接口,并实现其全部方法(空实现)
2:再写个类继承实现类,选择性的实现想要的就可以了
3:调用