适配器模式

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

何为适配器?

假设,一台电脑需要用电,他的插头是两项插头,但是呢,插座却只有三项插孔的。怎么办?插座就在那里,是不可能改变的。我们总不能为了电脑用个电把整个电脑换了吧?不现实!那我们常用的做法就是买一个转接头,一面是两项插孔,一面是三项插孔。这样就很好的解决了这个问题。

这个生活中常见的场景就是经典的适配器模式的体现。

做个小总结,适配器模式就是解决这样一种场景,客户端需要通过一种方式(或者接口规范)去访问或者使用另一个已经存在的接口,但是由于各类原因,没有办法直接去调用。这个时候可以提供一下中间媒介作为适配器对象,在其内部将接口做一下转换,然后客户端就可以顺利的通过访问适配器的方式去访问目标接口了。

适配器模式的实现有两种,就是上面展示的两种,一种是通过继承方式,另一种是通过组合方式实现的。考虑到Java的单继承特点,加上组合聚合复用设计原则,一般都会采用组合方式实现。

适配器模式的优点也很明显,它使得在不需要修改已有代码的前提下,直接重用现有的类库代码。而且实现起来很简单,也很容易理解。另外对于客户端而言,适配器这种兼容转换不同接口的方式是在其内部实现的,对于客户端而言是完全透明的,客户端无需了解目标接口的细节,只需要按照当前接口的规范去调用即可。

默认适配器

假设现在有一个A接口,这个接口里面定义了非常多的接口方法m1()m2()m3()......针对不同功能点,然后其实现类也是根据不同的功能对A接口进行实现,但是每个实现类可能只需要实现其中自己关注的那个方法即可,至于其余无关的方法我并不想实现。但是Java语法限制,如果一个实体类要实现一个接口,必须需要实现其所有抽象方法。这也就意味着他会将自己关注的那个方法实现,而至于其余不关心都只能空实现。这样的造成了极大的代码冗余,而且这些冗余的代码毫无优雅可言,除了占用空间和美观不起任何作用。如下图,

这个时候,有一种比较特殊的适配器模式,叫默认适配器模式来解决这个问题。

怎么解决呢?

在接口的直接下层,定义一个抽象层作为适配器,将接口的所有方法全部空实现。而所有的具体实现类不会再直接实现顶层接口了,而且去跟这个抽象层打交道,这样的话,每个具体实现类只需要实现自己关注的方法即可。如下,

 

下面是一些适配器模式的一些应用

JDK IO转换流的实现

JDK的IO API中转换流InputStreamReaderOutputStreamWriter也是应用了适配器模式,实现了由字节流到字符流的转换,下面我简单的带大家来看看其实现。

OutputStreamWriter继承了Writer(目标接口),并且重写了Writer所有核心的方法。但是我们现在只能提供一个字节流OutputStream类型,OutputStreamWriter内会将其封装成为StreamEncoder对象,并且设置为OutputStreamWriter的属性。至于封装StreamEncoder对象是因为还需要考虑字符集编码的问题,这个不是重点。然后此时,客户端去访问OutputStreamWriterwrite()等方法时,会将其委托给StreamEncoder对象的相关方法执行,从而实现由字节流操作到字符流操作的转换。

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看