设计模式之适配器模式

栏目: 后端 · 发布时间: 7年前

内容简介:设计模式之适配器模式

最近学习《android源码设计模式》的同时,越来越感受到了 设计模式 在android源码中体现在相当多的地方,而且现今github上比较流行的开源库中也大都运用到了设计模式,这里先简单记录一下适配器模式的基本思想和例子,下一篇文章中会跟随android源码设计模式来梳理一下listview以及recyclerview中适配器模式的运用。

什么是适配器模式?

适配器在生活中算是很常见了,就拿笔记本的电源适配器来说,它的作用是把220v的电压转化为5v的电压,因为笔记本的电源接口大多是5v的,这就出现了不兼容的情况,而适配器就起到了一个中间层的作用,将不兼容的220v电压转化为了笔记本兼容的5v电压。也就是实现了220V和5V电压的协同工作。

简而言之,适配器模式,就是通过一个中间层(adapter)来将不兼容的接口转化为另一种接口,使得原本不兼容的两个类能够在一起协同工作。通过上述例子来对应,那就是,电源适配器(adapter)将220v的电压转化为5v电压,使得220v的电压可以转化为5v来给笔记本供电。

适配器模式的包括以下三个部分:

adaptee: 需要被转化(适配)的类,如上面的220v电压

adapter: 中间层适配器,起转化作用,如上面的电源适配器

target: 转化之后的结果,如上面的5v电压

adapter、adaptee应该声明为Class,而target通常对应了一个Interface。

适配器模式的分类

适配器模式分为以下两类:

  • 类适配器
  • 对象适配器

其中类适配器通过继承的方式实现,而对象适配器通过组合的方式来实现。对象适配器比类适配器更加灵活,使用场景也更丰富。

下面分别是采用类适配器和对象适配器来实现笔记本电源适配器的例子:

1.类适配器实现

类适配器模式反映到 java 代码上最典型的特点就是继承,首先写出adaptee,也就是220v电压的充电,

class V220 {
    public void get220() {
        System.out.println("充电220v");
    }
}

接下来是target对应的interface,5v:

interface V5{
    void get5();
}

最后是核心adapter, 类适配器的核心是,adapter继承adaptee并实现target ,按照这个规则,写出的adapter如下:

class Adapter extends V220 implements V5{
    @Override
    public void get5() {
        System.out.println("充电5v");
        }
}

下面是测试用例:

public class Computer {
    public static void main(String[] args) {
        Adapter adapter=new Adapter();
        //充电5V
        adapter.get5();
    }
}

2.对象适配器实现

对象适配器采用组合的方式来实现, 核心是adapter包含了一个adaptee并实现了target ,对应的代码如下:

class Adapter1 implements V5{
    V220 mV220;

    public Adapter1(V220 mV220) {
        this.mV220 = mV220;
    }

    @Override
    public void get5() {
        System.out.println("充电5v");
    }
    public void get220v(){
        mV220.get220();
    }
}

可以看到,和类适配器相比,不同之处在于,类适配器通过继承adaptee来获得get220v()方法,而对象适配器通过传入一个adaptee对象并通过代理的方式来获得get220v方法。java只支持单继承,所以这种方式比起类适配器来说更加灵活实用。

总而言之,适配器模式当然是用来处理不适配,不兼容的情况,通过适配器来协调不兼容的两者,使得它们可以协同工作

其他

另一种情况下的适配器:

很多情况下,java中的一个interface里往往声明了许多抽象方法,而这个接口又很可能在许多地方都会用到,这时就可以创建一个新的Adapter类来实现该接口,并让所有的方法默认实现为空,在使用时就可以通过继承Adapter的方式来覆盖我们需要的那一部分方法而不用实现所有的抽象方法,在RxJava的观察者中就可以这样实现:

public class ObserverAdapter<T> implements Observer<T> {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull T o) {

    }

    @Override
    public void onError(@NonNull Throwable e) {

    }

    @Override
    public void onComplete() {

    }
}

在RxJava的使用就可以这样写:

call.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new ObserverAdapter<NewsBean>(){
            @Override
            public void onNext(@NonNull NewsBean o) {
                callback.onBannerNewsFinish(o.getTop_stories());
                callback.onLatestNewsFinish(o.getStories(),o.getDate());
            }
        });

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Non-Obvious

Non-Obvious

Rohit Bhargava / Ideapress Publishing / 2015-3-29 / USD 24.95

What do Disney, Bollywood, and The Batkid teach us about how to create celebrity experiences for our audiences? How can a vending-machine inspire world peace? Can being imperfect make your business mo......一起来看看 《Non-Obvious》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具