Java结构型设计模式-适配器(一)

来源:互联网 发布:变性手术知乎 编辑:程序博客网 时间:2024/04/29 19:04

什么是适配器模式?

定义

适配器(Adapter):适配器模式将某个类的接口(Source)转换成客户端期望的另一个接口(Target)表示,主的目的是兼容性,使接口不兼容的两个类协同工作。其别名为包装器(Wrapper)。

简单来说就是,Source类以某种形式类型给到Adapter类,然后Adapter类的接口与Target接口兼容,将Source类形式类型表现出再Target里。

过程可以简述成:Source->Adapter->Targetable。

比如我们的RecycleView的接口情况来说,RecycleView的接口需要的是视图View(Targetable),而我们得到的一般是数据data(Source),所以我们的Adapter适配器将数据data(Source)转换成ItemView(View)的工作。

分为三类:类的适配器模式,对象的适配器模式和接口的适配器模式。

使用场景:

1 系统需要使用现有的类,而这些类的接口不符合系统的需要。

2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

3 需要一个统一的输出接口,而输入端的类型不可预知


类适配器模式

Adapter类,通过继承Source类获得类的某种类型表现形式,实现在Adapter类中进行转换成Target的接口。

用生活的例子手机充电器来讲解,220V交流电相当于Source类,5V直流电相当Target类,而充电器就相当Adapter类。

类图

这里写图片描述

Source类

public class Source{    public int output220V() {        return 220;    }}

Target接口

public interface Target{    public int Voltage5V();}

Adapter类

public class Adapter extends Source implements Target{    @Override    public int Voltage5V ()    {        return output220V()/44;    }}

Client类

public class Client{    public static void main(String[] args)    {        Target target = new Adapter();        System.out.println(target.Voltage5V()+"V");    }}

output:
5V

总结:

1.由于Java是单继承机制,所以我们尽量优先使用接口。

2.此模式要求Target类必须是接口,具有一定的局限性。

3.Source类中的方法全在Adapter中暴露,增加使用成本。

4.由于继承了Source类,可以根据需求重写Source类方法,增加了Adapter类的灵活性。


对象适配器模式(常用)

思路和类适配器相同,不继承Source类,获得Source的实例,

用生活的例子手机充电器来讲解,220V交流电相当于Source类,5V直流电相当Target类,而充电器就相当Adapter类。

类图

这里写图片描述

Source类

public class Source{    public int output220V() {        return 220;    }}

Target接口

public interface Target{    public int Voltage5V();}

Adapter类

public class Adapter extends Source implements Target{    @Override    public int Voltage5V ()    {        return output220V()/44;    }}

Client类

public class Client{    public static void main(String[] args)    {        Target target = new Adapter();        System.out.println(target.Voltage5V()+"V");    }}

output:
5V


接口的适配器模式(常用)

也称缺省适配器模式(Default Adapter Pattern)

当接口实现的方法都相同或不需要实现接口的所有方法时,可设计一个抽象类(AbstractSimpleClass),并为每个类默认实现方法或置空方法,那么抽象类可有选择地覆盖父类的方法来实现需求,这样大大增加了程序的简洁性和减少了工作量。

这里写图片描述

例如我们使用RxJava2的时候,实现观察者方法的时候总是会有四个接口方法需要实现,其中onSubscribe方法我们不怎么操作,可以置为空,而onError方法可以Log打印出错误信息,onComplete方法Toast出完成的信息。

源码

public class AbstractSimpleClass{    public abstract static class Next< T > implements Observer< T >    {        @Override        public void onSubscribe ( Disposable d )        {        }        @Override        public void onError ( Throwable e )        {            LogUtils.d(e.toString());        }        @Override        public void onComplete ()        {            ToastUtils.showShort("Complete");        }    }}

未使用接口适配器的代码
这里写图片描述


使用接口适配器的代码
这里写图片描述

1 0
原创粉丝点击