结构型模式:描述如何组合类和对象以获得更大的结构。
适配器模式:Adapter Pattern
是指将一个类的接口转换成用户期望的另一个接口,使原本接口不兼容的类可以一起工作,属于结构型设计模式。
使用以下几种业务场景:
1.已经存在类的方法和需求不匹配的情况
2.适配器模式不是软件初始阶段考虑的设计模式,是随着软件发展,由于不同产品,不同厂家造成功能类似而接口不同的问题的解决方案,有点亡羊补牢的感觉。
在Spring中的应用:MethodBeforeAdviceAdapter AfterReturningAdviceAdapter ThrowsAdviceAdapter
Spring会根据不同的Aop配置来使用对应得Advice
适配器模式优缺点:
优点:
1.能提高类得透明性和复用性,现有的类会被复用但不需要改变。
2.目标类和适配器类解耦,可以提高程序得扩展性。
3.在很多业务场景中符合开闭原则。
缺点:
1.在配饰器代码编写过程中需要进行全面考虑,可能会增加系统得复杂性。
2.增加了代码阅读难度,降低了代码得可读性,过多使用适配器会使系统代码变得凌乱。
实例
创建一个任务实现的是Callable接口
/**
* @author QiTian
* @date 2023/11/11
* @Description 用一个Adapter,把这个Callable接口“变成”Runnable接口
*/
public class Task implements Callable {
private long num;
public Task(long num) {
this.num = num;
}
@Override
public Long call() throws Exception {
long r = 0;
for (long n = 1; n <= this.num; n++) {
r += n;
}
System.out.println("result: "+r);
return r;
}
}
定义一个适配器类,接收Callable,输出Runnable
/**
* @author QiTian
* @date 2023/11/11
* @Description RunnableAdapter类就是Adapter,它接收一个Callable,输出一个Runnable。
*/
public class RunnableAdapter implements Runnable {
// 引用待转换接口:
private Callable<?> callable;
public RunnableAdapter(Callable<?> callable) {
this.callable = callable;
}
// 实现指定接口:
@Override
public void run() {
// 将指定接口调用委托给转换接口调用:
try {
callable.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
编写测试类,使用一个Thread,以构造器的方式传入参数,但是由于Thread只能接收Runnable类型的数据,因此我们需要编写一个RunnableAdapter 来将Callable类型的数据进行转换,方可完成线程调用。
public class Test {
public static void main(String[] args) {
Callable<Long> callable = new Task(111000L);
Thread t = new Thread(new RunnableAdapter(callable));
t.start();
}
}
测试输出结果 result: 6160555500