适配器模式
适配器模式,客户端通过适配器返回客户端期望的接口。其中适配器将被适配者转化为客户端期望的接口。
比如充电,插座的电压为 220V(被适配者),手机(客户端)通过充电器(适配器)将插座的电压降到 5 V(目标接口)传输电压给手机(客户端)。
种类:类适配器,接口适配器,对象适配器。
适配器模式的角色
- 客户端:通过适配器访问目标接口
- 适配器
- 被适配器
- 目标接口
类适配器
适配器 adapter 必须继承被适配者,实现目标接口。
案例
代码
被适配者
/**
* 被适配者
*
* @author: Hui
**/
public class Adaptee {
public String method(){
System.out.println("调用被适配者方法");
return "被适配者方法";
}
}
目标接口
/**
* 目标对象
*
* @author: Hui
**/
public interface ITarget {
public String method1();
}
适配器
/**
* 适配器
*
* @author: Hui
**/
public class Adapter extends Adaptee implements ITarget{
@Override
public String method1() {
//适配器方法,将原有的方法进行适配
System.out.println("调用适配器方法");
String adapteeMenthod = method();
System.out.println("将被适配器方法进行调整");
adapteeMenthod = adapteeMenthod.replaceAll("被适配者方法","适配器方法");
System.out.println("调整成功");
return adapteeMenthod;
}
}
客户端使用
/**
* 客户端
*
* @author: Hui
**/
public class Client {
public static void main(String[] args) {
Adapter adapter = new Adapter();
String s = adapter.method1();
System.out.println(s);
}
}
对象适配器
因为类适配器需要适配器去继承被适配者,不符合合成复用原则,使用对象适配器可以解决这一问题,将被适配者聚合到适配器中。
案例
代码
因为只在上述的类加载器的基础上修改了适配器,所以只贴出适配器的与客户端的代码,其余与类加载器一致。
适配器
/**
* 适配器
*
* @author: Hui
**/
public class Adapter implements ITarget {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public String method1() {
//适配器方法,将原有的方法进行适配
System.out.println("调用对象适配器方法");
String adapteeMenthod = null;
if (adaptee != null) {
adapteeMenthod = adaptee.method();
System.out.println("将被适配器方法进行调整");
adapteeMenthod = adapteeMenthod.replaceAll("被适配者方法", "适配器方法");
System.out.println("调整成功");
}
return adapteeMenthod;
}
}
客户端
/**
* 客户端
*
* @author: Hui
**/
public class Client {
public static void main(String[] args) {
Adapter adapter = new Adapter(new Adaptee());
String s = adapter.method1();
System.out.println(s);
}
}
接口适配器
定义一个多个方法的接口,使用抽象父类来实现该接口并实现接口中的所有方法,子类要使用的话使用覆盖其中的一个方法就可以了。
案例
代码
接口
package adaper.interfaceAdapter;
/**
* 作者:灰爪哇
* 时间:2024-07-18
* 接口:提供多个方法
*
*/
public interface ITarget {
void method1();
void method2();
void method3();
}
抽象适配器
/**
*
*
* @author: Hui
**/
public abstract class AbsAdapter implements ITarget{
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
客户端
/**
*
*
* @author: Hui
**/
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
@Override
public void method1() {
System.out.println("method1 开始执行~~~~ ");
}
};
absAdapter.method1();
}
}