适配器模式
适配器模式将两个无法一起工作的类或者接口可以一起工作。
适用场景:
当我们新增一个功能,需要引入第三方接口又不能改变原有功能时,这时可以采用适配器模式。
下图形象生动描述了适配器作用:
图片上的转接头,将原本不适配的耳机、手机适配在一起,尚可认为转接头==适配器。
适配器三要素:
1、目标(Target):我们原有的类、接口
2、被适配类(Adaptee):第三方提供的类、接口
3、适配器(Adapter):适配逻辑类
代码举例:
目标接口:
/**
* Target目标接口
*/
public interface Target {
/**原有的接口方法*/
public void target();
}
目标接口原有实现类:
/**
* 原有的Target业务方法
*/
public class TargetService implements Target {
@Override
public void target() {
System.out.println("已经被使用的TargetService");
}
}
第三方提供的类:
/**
* 第三方提供、被适配类
*/
public class Adaptee {
public String service(){
System.out.println("2021-10-29");
return "第三方提供的方法";
}
}
适配类(方式一):
/**
* 通过继承方式进行适配操作
*/
public class Adapter extends Adaptee implements Target {
@Override
public void target() {
String service = super.service();
System.out.println(service+" ----> 适配完成");
}
}
适配类(方式二):
/**
* 通过对象形式进行适配操作
*
*/
public class Adapter2 implements Target {
private Adaptee adaptee;
public Adapter2(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void target() {
String service = adaptee.service();
System.out.println(service+" ----> 适配完成2");
}
}
注入SpirngIOC容器:
/**
* 加载到SpringIOC容器中去
*/
@Configuration
public class AdapterConfigure {
@Bean
public Adaptee adaptee(){
return new Adaptee();
}
@Bean(name = "adapter")
public Adapter adapter(){
return new Adapter();
}
@Bean(name = "adapter2")
public Adapter2 adapter2(@Qualifier("adaptee") Adaptee adaptee){
return new Adapter2(adaptee);
}
}
单元测试:
@SpringBootTest(classes = DesignerModeApplication.class)
@RunWith(SpringRunner.class)
public class AdapterTest {
@Resource
private Target adapter2;
@Resource
private Target adapter;
@Test
public void test(){
adapter.target();
}
@Test
public void test2(){
adapter2.target();
}
}
测试结果: