Java学习之路5--适配器模式
结构型模式
前几篇设计模式都是属于创建型设计模式,都是写如何创建一个所需的对象。而结构型模式是从程序结构上实现松耦合,扩大整体的类结构。
适配器模式
什么是适配器模式
好比如现实中的充电线,华为用的Type-C接口,而苹果用的是苹果接口,要使苹果手机能用华为充电线的Type-C接口,必须在苹果手机上加装一个适配器,如图:
回到程序中,适配器可以用这样的一张图来表示:
适配器起到了通过调用接口1的方法1,就能调用到接口2的方法2。也就是说,接口1的抽象方法1通过适配器能在接口2的方法2中实现。
适配器模式由什么构成
由上图可知,适配器由目标接口(角色),适配器(角色),源接口(角色)3大部分组成。
目标接口(Target)一般由一个抽象类/接口来实现。
源接口(Adaptee)一般都有接口方法的具体实现。
适配器(Adapter)是核心,一般都是一个具体类。
适配器模式的简单实现
题目:有一个“苹果手机”的程序,它必须通过调用“苹果充电线”接口来进行实现。但是我们只有“安卓充电线”接口是实现了方法的。如何运用适配器模式来让程序充电?
类适配器
通过适配器类的extends源接口类并implements目标接口类进行适配。
Target:
//苹果
public interface Target {
void charge() ;
}
Adaptee:
//安卓
public class Adaptee {
void charge() {
System.out.println("正在充电");
}
}
Adapter:
//继承Adaptee,实现Target
public class Adapter extends Adaptee implements Target{
public void charge() {
super.charge();
}
}
Client:
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Target iphone=new Adapter();
iphone.charge();
}
}
输出:
正在充电
对象适配器
在适配器中运用已实现方法的Adaptee对象,进行Target接口的实现。
Target和Adaptee的代码不变。
Adapter:
public class Adapter implements Target{
private Adaptee Android=new Adaptee();
public Adapter(Adaptee Android) {
this.Android=Android;
}
public void charge() {
Android.charge();
}
}
Client:
public class Client {
public static void main(String[] args) {
//已有Android线,创建其对象
Adaptee Android=new Adaptee();
//“插上适配器”
Adapter iphone=new Adapter(Android);
//用适配器充电
iphone.charge();
}
}
输出:
正在充电
运用场景
常用于老接口改造,用适配器模式可让他不影响旧版本项目使用,也可让新版本项目适应。
旧的类实现了原有的功能,但是基于扩展性,我们由另外的接口访问。适配器将字节流转换为字符流