版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/www851903307/article/details/81070206
一、适配器的基本概念
1、定义:
将一个接口转换为另一个客户期望的接口。
2、应用场景:
你想使用一个已经存在的类,而它的接口不符合你的需求。 类似于一个转接口,将电源线的接口转成你电脑可用的接口。
3、类图:
* Target:期待的目标接口
* Adaptee:原来需要转换的目标
* Adapter:适配器角色。目的是将原来的目标转换成客户期望的目标
二、实例
一个mp4播放器可以播放mp4,一个mp3播放器可以播放mp3,如果想在mp3中播放mp4格式的文件。
1、Target: 期待转成MP3
public interface IMp3Player {
/**
* 播放MP3
* @param fileName
*/
void playMp3(String fileName);
}
public class MyMp3Player implements IMp3Player{
@Override
public void playMp3(String fileName) {
System.out.println("正在播放mp3:"+fileName);
}
}
2、Adaptee 原来的文件mp4
public interface IMp4Player {
/**
* 播放mp4
* @param fileName
*/
void playMp4(String fileName);
/**
* 获取到文件名
* @return
*/
String getFileName();
}
public class MyMp4Player implements IMp4Player{
public String mFileName;
@Override
public void playMp4(String fileName) {
this.mFileName = fileName;
System.out.println("正在播放mp4:"+fileName);
}
@Override
public String getFileName() {
return mFileName;
}
}
3、Adapter 一个格式转换器
public interface IMediaAdapter {
/**
* 文件转换
*/
void conver();
}
public class MyMediaAdapter implements IMediaAdapter{
private IMp4Player mIMp4Player;
private IMp3Player mMp3Player;
public MyMediaAdapter(IMp4Player mp4Player, IMp3Player mp3Player){
this.mIMp4Player = mp4Player;
this.mMp3Player = mp3Player;
}
@Override
public void conver() {
String fileName = mIMp4Player.getFileName();
this.mMp3Player.playMp3(fileName.replace("mp4","mp3"));
}
}
4、使用:
public class AdapterTest {
public static void main(String[] args){
//创建MP4,并播放
IMp4Player mp4Player = new MyMp4Player();
mp4Player.playMp4("my.mp4");
//创建mp3
IMp3Player mp3Player = new MyMp3Player();
//通过适配器将mp4的文件转换,并在mp3中播放
IMediaAdapter adapter = new MyMediaAdapter(mp4Player, mp3Player);
adapter.conver();
}
}
三、适配器、装饰者、代理模式对比:
1、装饰模式和代理模式的对比:
相同点:
* 代理对象和被代理对象需要继承相同的抽象类或者实现相同的接口
* 装饰对象和被装饰对象需要继承相同的抽象类或者实现相同的接口
不同点:
* 代理对象的主要作用是控制被代理对象的访问。
* 装饰对象的主要作用是增强被装饰对象的功能。
举例:
public interface IPerson {
/**
* 睡觉
*/
void sleep();
}
被装饰者(被代理类):
public class Son implements IPerson {
@Override
public void sleep() {
System.out.println("儿子去睡觉了");
}
}
代理类:
public class Parent implements IPerson{
private IPerson mPerson;
//工作是否完成
private boolean mFinishWork;
public Parent(IPerson person){
this.mPerson = person;
}
public void setFinishWork(boolean finishWork){
mFinishWork = finishWork;
}
@Override
public void sleep() {
//控制了被代理类的方法调用
if (mFinishWork) {
mPerson.sleep();
}
}
}
装饰者:
public class Parent implements IPerson{
private IPerson mPerson;
public Parent(IPerson person){
this.mPerson = person;
}
@Override
public void sleep() {
//多了吃饭的功能
System.out.println("先吃饭");
mPerson.sleep();
}
}
2、装饰者和适配器模式对比
相同点:
* 都是对某个对象进行包装
不同点:
* 装饰者包装的是自己的同类,相同的接口或者父类
* 适配器包装的是不同类型的对象,然后将其伪装成自己的同类。