描述
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。 别名也可以是Wrapper,包装器
类结构型
主要角色
- 目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口
- 适配者(Adaptee)类:隐藏的转换接口
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。
代码实现
//目标接口 要适配的接口
public interface MoviePlayback {
String playback();
}
public class AnimationMoviePlayback implements MoviePlayback{
@Override
public String playback() {
String content = "咒术回战 开播!!!";
return content;
}
}
public class MoviePlaybackAdapter /*extends JP_Translation*/ implements MoviePlayback{
//此处翻译器可以 以继承 或者组合方式 组合方式更加灵活
private Translation translation;
private MoviePlayback moviePlayback;
public MoviePlaybackAdapter(MoviePlayback moviePlayback,Translation translation) {
this.moviePlayback = moviePlayback;
this.translation = translation;
}
@Override
public String playback() {
String playback = moviePlayback.playback();
System.out.println(playback+"第二季");
translation.translation();
return null;
}
}
public interface Translation {
void translation();
}
public class ZH_Translation implements Translation{
@Override
public void translation() {
System.out.println("中文翻译");
}
}
public class JP_Translation implements Translation{
@Override
public void translation() {
System.out.println("日文翻译开始");
}
}
测试
public class test {
public static void main(String[] args) {
MoviePlaybackAdapter moviePlaybackAdapter = new MoviePlaybackAdapter(new AnimationMoviePlayback(),new JP_Translation());
moviePlaybackAdapter.playback();
}
}
//输出结果
//咒术回战 开播!!!第二季
//日文翻译开始
public class Adapter {
public static void main(String[] args) {
MoviePlaybackAdapter moviePlaybackAdapter = new MoviePlaybackAdapter(new AnimationMoviePlayback(),new ZH_Translation());
moviePlaybackAdapter.playback();
}
}
//输出结果
//咒术回战 开播!!!第二季
//中文翻译
使用场景
什么场景用到?
- Tomcat如何将Request流转为标准Request;
- omcat.Request接口
- servlet.Request接口
- tomcat === CoyoteAdapte === ServletRequest Spring
- AOP中的AdvisorAdapter是什么:增强的适配器
- 前置、后置、返回、结束 Advisor(通知方法)
- 底层真的目标方法
- Spring MVC中经典的HandlerAdapter是什么;
- HelloController.hello()
- HandlerAdapter
- Servlet.doGet()
- SpringBoot 中 WebMvcConfigurerAdapter为什么存在又取消
- ……