适配器模式(Adapter Pattern)
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
别名也可以是Wrapper,包装器
适配器模式的主要角色
- Target(目标接口):这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- Adaptee(被适配者/适配对象):需要适配的类,它的接口与
Target
接口不兼容。 - Adapter(适配器):通过包装一个
Adaptee
实例来实现Target
接口。适配器把Adaptee
的接口转换成Target
接口。
案例
电影播放器接口及其实现类:
public interface Player {
String play();
}
public class MoviePlayer implements Player{
@Override
public String play() {
System.out.println("正在播放电影");
String content = "你好";
return content;
}
}
现在需要一个翻译器将中文翻译成英文:
public interface Translater {
String translate(String content);
}
public class ZH_ENGTranslater implements Translater{
@Override
public String translate(String content) {
if("你好".equals(content)){
return "hello";
}
return "";
}
}
在不改变原有接口的条件下使用适配器完成翻译:
1)类结构模式:
public class EnglishMovieAdaptor extends ZH_ENGTranslater implements Player {
MoviePlayer player;
EnglishMovieAdaptor(MoviePlayer player){
this.player = player;
}
@Override
public String play() {
String content = player.play();
String translate = translate(content);
return translate;
}
}
2)对象结构模式(推荐使用):
public class EnglishMovieAdaptor01 implements Player {
private static ZH_ENGTranslater translater = new ZH_ENGTranslater();
MoviePlayer player;
EnglishMovieAdaptor01(MoviePlayer player){
this.player = player;
}
@Override
public String play() {
String content = player.play();
String translate = translater.translate(content);
return translate;
}
}