适配器模式概念
适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。比如我们突然就想看电影了,但是这个电影是AVI格式的,目前我们开发的Player播放器只能播放Mp4格式的,那么我们就得对这款落后的Player进行版本升级,通过Adapter适配器就可以实现既可以播放AVI格式的、也可以播放Mp4,这个适配器既可以播放原有的Mp4,也可以提供AVI接口。
Adapter:适配器
Adaptee:被适配的对象,就是Player
Target:客户端理想的接口,就是可以播Mp4,也可以播放AVI接口
类适配器类图
类适配器代码
public interface TargetPlayer {
public void playMp4();
public void playAVI();
}
public class AdpateePlayer {
public void playMp4(){
System.out.println("can play mp4");
}
}
public class Adapter extends AdpateePlayer implements TargetPlayer {
public void playAVI() {
System.out.println("can play avi");
}
}
public class AdapterMain {
public static void main(String[] args) {
Adapter adapter=new Adapter();
adapter.playAVI();
adapter.playMp4();
}
}
对象适配器类图
对象适配器代码
public interface TargetPlayer {
public void playMp4();
public void playAVI();
}
public interface AdapteePlayer {
public void playMp4();
}
public class AdapteePlayerImpl implements AdapteePlayer {
public void playMp4() {
System.out.println("can play mp4");
}
}
public class Adapter implements TargetPlayer{
private AdapteePlayer adapteePlayer;
public void setAdapteePlayer(AdapteePlayer adapteePlayer) {
this.adapteePlayer = adapteePlayer;
}
public void playMp4() {
adapteePlayer.playMp4();
}
public void playAVI() {
System.out.println("can play avi");
}
}
public class AdapterMain {
public static void main(String[] args) {
Adapter adapter=new Adapter();
AdapteePlayer adapteePlayer=new AdapteePlayerImpl();
adapter.setAdapteePlayer(adapteePlayer);
adapter.playAVI();
adapter.playMp4();
}
}
二者比较
小编为了突出对象适配器的好,将待适配器对象实现既写了接口又写了实现,很明显对象适配器很灵活,可以动态的传入不同的待适配的对象,而类适配器是静态的类继承,后期不可以修改,很死板。
应用场景
适配器作用就是讲一个接口适配到另一个接口,在Java 的I/O类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等。
以InputStreamReader和OutputStreamWriter类为例。
InputStreamReader和OutputStreamWriter类分别继承了Reader和writer接口,但是要创建他们的对象必须在构造函数中传入一个InputStream和OutputStream的实例,InputStreamReader和OutputStreamWriter类的作用也就是将InputStream和OutputStream适配到Reader和Writer。
适配器是InputStreamReader,源角色是InputStream代表的实例对象,目标接口就是Reader类。
InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。来源:https://www.icode9.com/content-1-263451.html