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