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(); } }
输出:
正在充电
运用场景
常用于老接口改造,用适配器模式可让他不影响旧版本项目使用,也可让新版本项目适应。 旧的类实现了原有的功能,但是基于扩展性,我们由另外的接口访问。适配器将字节流转换为字符流