适配器模式(Adapter Pattern)是指将一个类的接口转换成客户指望的另外一个接口,使本来的接口不兼容的类能够一块儿工做,属于结构型设计模式。
适配器模式主要有3个角色:
被适配者(Adaptee):适配者即被适配的角色
好比买了一个欧标吹风机,和国内的标准并不匹配。这时,被适配的角色即为国内的插座
适配器(Adapter):适配器能够调用适配者转换为目标接口,即做为一个转换器,将一个不可以使用的接口转换为可用的接口
果断的上了某东买了个接口转换器
目标角色(Target):目标角色即为适配器要转换成的目标接口
转换器提供的欧标插孔就是这里咱们所说的目标角色或者目标接口
设计模式
以上文中的欧标插头为例
一、被适配者socket
/** * Description : . * * @author : laoyeye.net * @date : Created in 2020/7/25 20:56 */ public interface ChinaSocket { void socketByChina(); }
二、被适配者实现ide
/** * Description : . * * @author : laoyeye.net * @date : Created in 2020/7/25 21:08 */ public class ChinaSocketImpl implements ChinaSocket { @Override public void socketByChina() { System.out.println("插入国标电源"); } }
三、目标接口,欧标电源接口this
/** * Description : . * * @author : laoyeye.net * @date : Created in 2020/7/25 20:56 */ public interface EuropeSocket { void socketByEurope(); }
四、适配器,国标转欧标.net
/** * Description : . * * @author : laoyeye.net * @date : Created in 2020/7/25 21:00 */ public class ChinaToEuAdapter implements EuropeSocket { /** * 须要适配的接口 */ private ChinaSocket chinaSocket; public ChinaToEuAdapter(ChinaSocket chinaSocke) { this.chinaSocket = chinaSocke; } @Override public void socketByEurope() { System.out.println("适配器,国标转为欧标"); chinaSocket.socketByChina(); } }
五、运行实现设计
/** * Description : . * * @author : zhangzhuo * @date : Created in 2020/7/25 21:03 */ public class HairDryer { /** * 指望的三项供电接口 */ private EuropeSocket europeSocket; public HairDryer(EuropeSocket europeSocket) { this.europeSocket = europeSocket; } public void work() { europeSocket.socketByEurope(); System.out.println("开始吹头发了"); } public static void main(String[] args) { // 国标插座 ChinaSocket chinaSocket = new ChinaSocketImpl(); //适配器转换 ChinaToEuAdapter chinaToEuAdapter = new ChinaToEuAdapter(chinaSocket); HairDryer hairDryer = new HairDryer(chinaToEuAdapter); // 工做 hairDryer.work(); } }
效果:code
适配器,国标转为欧标 插入国标电源 开始吹头发了
哇哦,接口成功实现转换,吹风机终于用起来了。对象
适配器模式我目前工做中其实不多用到,过多的适配器也不利于系统的维护接口
最后,你们有没有感受上面那个案例,其实咱们上次讲过的装饰者模式也能够实现呢。的确,这两种模式均可以实现相似的效果,但却又有所不一样,好比:
装饰者模式适合在不改变原有对象的基础上,将功能附加在对象上,用于扩展一个类的功能。而本文所讲的适配器模式主要适合在不改变原有接口的前提下,解决接口不兼容的问题。总得来讲二者的主要区别就在于一个是装饰,一个是来解决接口不兼容的问题,记住这两点,相信在使用上就不会有疑问了ip