设计模式—结构型模式之适配器模式
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
别名也可以是Wrapper,包装器。
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口。
- 适配者(Adaptee)类:隐藏的转换接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。
举例
比如我们需要一个播放器类,可以根据不同的国家提供相应字幕的功能。我们不应该修改播放器,我们需要写一个适配器类,来进行字幕转换。
播放电影接口如下:
/**
* 提供原有接口,可以播放电影,并且返回字幕
*/
public interface Player {
String play();
}
电影播放器类如下:
/**
* 电影播放器
*/
public class MoviePlayer implements Player{
@Override
public String play() {
String content = "你好,世界!";
//打印字幕
System.out.println(content);
return content;
}
}
如果是我们自己看的话,直接进行如下操作即可:
public class AdapatorTest {
public static void main(String[] args) {
MoviePlayer moviePlayer = new MoviePlayer();
moviePlayer.play();
}
}
但是如果有一个以英文为语言的人来看的话,就不行了。
所以我们需要一个适配器,来为英文适配。
翻译文本内容的接口如下:
/**
* 提供接口,翻译文本内容
*/
public interface Translator {
String translate(String content);
}
中文翻译为英文的类如下;
/**
* 中文---》英文的翻译器
*/
public class ZhToEnTranslator implements Translator{
/**
* 简单示意翻译
* @param content 需要翻译的内容
* @return 翻译的内容
*/
@Override
public String translate(String content) {
//省略判空
if(content.contains("你好")){
content = content.replace("你好","Hello");
}
if(content.contains("世界")){
content = content.replace("世界","World");
}
return content;
}
}
运行如下:
类适配器
使用继承的方式来进行适配。
英文适配器如下:
/**
* 做英文适配
*/
public class EnglishMoviePlayerAdapter extends ZhToEnTranslator implements Player {
//被适配对象
private Player target;
public EnglishMoviePlayerAdapter(Player target) {
this.target = target;
}
@Override
public String play() {
String play = target.play();
//翻译
String translate = translate(play);
System.out.println("English:"+translate);
return translate;
}
}
测试如下:
public class ClazzAdapaterTest {
public static void main(String[] args) {
MoviePlayer moviePlayer = new MoviePlayer();
EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
englishMoviePlayerAdapter.play();
}
}
运行如下:
对象组合适配器
使用对象组合的方法来进行适配
/**
* 做英文适配
*/
public class EnglishMoviePlayerAdapter implements Player {
private Translator translator = new ZhToEnTranslator();
//被适配对象
private Player target;
public EnglishMoviePlayerAdapter(Player target) {
this.target = target;
}
@Override
public String play() {
String play = target.play();
//翻译
String translate = translator.translate(play);
System.out.println("English:"+translate);
return translate;
}
}
测试类如下:
public class ObjAdapaterTest {
public static void main(String[] args) {
MoviePlayer moviePlayer = new MoviePlayer();
EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
englishMoviePlayerAdapter.play();
}
}
运行如下: