以前已经将五个建立型设计模式介绍完了,从这一篇开始介绍结构型设计模式,适配器模式就是结构型模式的一种,适配器要实现的效果是把“源”过渡到“目标”。html
在开发过程当中,使用一个已经存在的类,而他的接口不符合咱们的需求。这个时候咱们本着开闭原则,要建立一个既符合咱们需求又实现了已存在的接口的类,这个类能够把其余不相关或不可预见的类协同起来一块儿工做。咱们建立的这个类就是适配器类,起到了一个转换的做用。设计模式
适配器模式有类型的适配器模式和对象适配器模式两种实现方式。app
面向类的适配器实现起来并不复杂,主要的思想就是靠继承来实现适配。举个🌰,若是咱们在调用一个接口的时候,发现这个接口中没有能实现咱们需求的方法,而后发现这个接口旁边的一个类中有咱们想要的方法,这个时候咱们就能够建立一个适配器类,来继承接口旁边的这个类,并实现调用接口。这样就知足了咱们既没有改变调用方式又实现了功能需求。ide
以下代码功能:函数
定义一个数据线接口post
public interface IMobilePhone { /** * 谷歌数据线 * @return */ String google(); /** * 苹果数据线 * @return */ String apple(); }
当咱们调用数据线接口时发现没有type-c类型接口的数据线,而后发现了下面的这个类里有。学习
public class HuaWei { /** * 华为的type-c数据线 * @return */ public String huawei(){ return "huawei:type-C"; } }
而后咱们就建立一个适配器类来知足咱们的需求。测试
public class Adapter extends HuaWei implements IMobilePhone { @Override public String google() { return "Android:数据线"; } @Override public String apple() { return "IOS:数据线"; } }
使用方式以下:this
public class AdapterTest { public static void main(String[] args) { HuaWei dataLine = new Adapter(); String typC = dataLine.huawei();
System.out.println(typC); } }
运行结果:google
huawei:type-C
在上面的例子中,咱们经过Adapter类继承自HuaWei类,而后实现了IMobilePhone接口,作到了适配的效果,可是这种适配器是有明确规定了父类的。因为Java语言的特性,类只能单继承,决定了这个适配器只能用在这个业务当中。若是咱们又须要另外一个类里面的方法呢?这个时候就又须要建立一个子类来实现适配,这也是为何这种方式叫类适配器的缘由。
为了解决类适配器只是适配单一类的这个问题,就又出现了对象适配器模式,对象适配器,是将适合类的对象注入到适配器中,而后达到适配的做用。
其余的代码没有变化,只须要更改适配器类。
更改后以下所示:
public class Adapter implements IMobilePhone { @Override public String google() { return "Android:数据线"; } @Override public String apple() { return "IOS:数据线"; } public Adapter(){} private HuaWei huaWei; public Adapter(HuaWei huaWei){ this.huaWei = huaWei; } public String huawei(){ return huaWei.huawei(); } }
适配器类,再也不继承HuaWei类,而是经过构造函数将HuaWei类的对象注入进来,而后定义一个方法来调用要使用的方法。
测试以下:
public class AdapterTest { public static void main(String[] args) { HuaWei huaWei = new HuaWei(); Adapter dataLine = new Adapter(huaWei); String typC = dataLine.huawei(); System.out.println(typC); } }
运行结果:
huawei:type-C
对象适配器模式,能够为多个类进行适配(多个构造方法),解决了类适配模式的单一化问题。
可是其实除了对象适配器模式和类适配器模式,还有一种方式也是实现适配的方法,接口适配器模式。当咱们想实现一个接口,但又不想实现全部接口方法,而只想去实现一部分方法时,就可使用接口适配器。它的作法是在接口和具体实现类中添加一个抽象类,而用这个抽象类去实现目标接口的全部方法。而具体的实现类只须要覆盖其须要完成的方法便可。
例若有以下接口:
public interface MobilePhoneBrand { String xiaomi(); String huawei(); String apple(); String vivo(); String oppo(); String samsung(); }
对应的抽象类以下:
public abstract class MobilePhoneDefault implements MobilePhoneBrand{ public String xiaomi(){ return null; } public String huawei(){ return null; } public String apple(){ return null; } public String vivo(){ return null; } public String oppo(){ return null; } public String samsung(){ return null; } }
实现类中我只想使用中国品牌的手机,因此只需实现部分方法就能够了。
public class ChinaMobilePhone extends MobilePhoneDefault { public String xiaomi(){ return "小米"; } public String huawei(){ return "华为"; } public String vivo(){ return "VIVO"; } public String oppo(){ return "OPPO"; } }
适配器模式的3个实现方式介绍完了,下面来讲说适配器模式的结构,以下图:
适配器模式中有以下4个角色:
目标抽象角色(Target):定义客户所期待要使用的接口,在第一个例子中的IMobilePhone就是表明的这个角色。
源角色(Adaptee):也叫被适配角色,在第一例子中HuaWei表明的就是这个角色。
适配器角色(Adapter):用来把源角色转换成符合要求的目标接口设备,在第一个例子中Adapter类表明的就是这个角色。
客户端(Client):这个就是具体使用角色,在第一个例子中的AdapterTest表明的就是这个角色。
想了解更多的设计模式请查看Java设计模式学习记录-GoF设计模式概述。