内容简介:本文简述适配器模式,考虑到java中没有多继承就只写了对象适配器模式,然后例子是怎么用转接口把3.5mm耳机插在小米8上面。适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配器使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
本文简述适配器模式,考虑到 java 中没有多继承就只写了对象适配器模式,然后例子是怎么用转接口把3.5mm耳机插在小米8上面。
一、概念
适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配器使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式允许一个已存在的类的接口被用作另一个接口。通常可以在不需要修改源代码的情况下使用已存在的类。
其实在生活中,适配器随处看见,例如下图,一个type-c转耳机口的适配器。接下来让我看看适配器模式的结构,并用java代码来实现一个type-c接口的手机与3.5mm的耳机通过适配器连接。
适配器模式主要解决两个问题:
1.转换当前接口为客户端需要的接口
2.通过适配器使用没有我们需要的接口的类
描述看似相同,实际上出发点不同~嘿嘿,意会意会
二、结构
适配器模式有两种,一种是 类适配器 ,不过需要支持多继承的语言才能实现,本文主要讲解单继承也可以实现的 对象适配器 。下图是对象适配器模式的类图,Client需要一个实现Target接口的类来完成工作,而当前我们提供的只有Adaptee类,这时该怎么办呢?恩,我们就造一个适配器(adapter)来完成这个需求。
涉及到的主要角色:
Target :目标接口,也就是我们期待得到的接口。
Adaptee :当前拥有的接口,需要适配,已满足客户端的要求。
Adapter :适配器类,适配器模式的核心,就是将Adaptee转换成需要的接口的具体类。
三、Type-C转3.5mm耳机孔适配器
这个是小米8手机类,只提供插TypeC耳机的接口
public class Mi8{ private TypeCEraPhones eraPhones; //打电话功能 public void call() { System.out.println("打电话"); } //播放音乐,有耳机就用耳机,没耳机就外放 public void playMusic() { if (eraPhones != null){ eraPhones.play(); }else{ System.out.println("外放"); } } // 插个TypeC接口的耳机 public void setEraPhones(TypeCEraPhones eraPhones) { this.eraPhones = eraPhones; } }
这个是TypeC接口的耳机接口,听说用这个接口的耳机都好好贵呢~~
public interface TypeCEraPhones { void play(); }
这个是我们以前剩下的能听个响的3.5mm接口的耳机
public class Mi35MMEraPhones { public void play(){ System.out.println("使用3.5mm孔的小米耳机播放声音"); } }
怎么办呢,是花大钱买个新的耳机(想想,如果真是个复杂的对象,重新实现功能是不是很头大),还是对当前这个3.5mm的耳机爆改,可是我还有个需要使用3.5mm的mp3 ,樂,这可怎么是好……于是机智的我去淘宝发现了一个type-c转3.5mm的接口,才5块钱!!藍
适配器类
public class Adapter implements TypeCEraPhones { private Mi35MMEraPhones eraPhones; public Adapter(Mi35MMEraPhones eraPhones) { this.eraPhones = eraPhones; } @Override public void play() { eraPhones.play(); } }
适配器实现了TypeC耳机的接口,并能把原来的耳机传进来,于是我们就能愉快的用原来的耳机在小米8上听音乐了,hooooooo~而且还能我的mp3使用,美滋滋~
四、缺省适配器模式
在很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有的方法。通常的处理方法是,把方法都实现了,有用的写上需要的方法,没用的提供空实现,烦死了
这些空的方法是一种浪费,有时也是一种混乱。只有看过这些空方法的代码,程序员才能知道哪些是空的,哪些不是空的,于是我们可以提供一个适配器类,来为接口所有方法提供空实现,然后这个具体类继承适配器接口,需要哪些方法,进行重写就可以。
在jdk中有AbstractList这样一个抽象类,实现了List接口,如果我们需要定制自己的集合类,就可以继承这个抽象类,需要哪些方法就可以对这些方法进行重写,而不用对List接口下所有方法都提供空实现。
缺省适配器模式是一种特殊的适配器模式,目的是在不得不继承某个方法时可以减少重写不需要的方法。
五、优缺点
优点
-
更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
-
更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
缺点
- 过多的使用适配器模式,会让系统难以把控,毕竟表面上是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。
六、总结
本文对适配器模式进行了简要介绍,主要把握是适配器实现需要的接口,并与adaptee进行组合,就可以实现对象适配器。在学习适配器模式过程中可以与装饰者模式和外观模式,适配器和装饰者使用方法类似,但是目的完全不同,前者是将一个接口转为另一个接,后者是为了对类进行增强;外观模式目的是对外提供一个简单的接口。
本文首发于cdream个人博客
欢迎转载,转载请注明出处!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Chinese Authoritarianism in the Information Age
Routledge / 2018-2-13 / GBP 115.00
This book examines information and public opinion control by the authoritarian state in response to popular access to information and upgraded political communication channels among the citizens in co......一起来看看 《Chinese Authoritarianism in the Information Age》 这本书的介绍吧!