其他分享
首页 > 其他分享> > 设计模式之适配器模式(Adapter)

设计模式之适配器模式(Adapter)

作者:互联网

一、适配器模式的定义

  适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

  适配器模式分为类结构型模式和对象结构型模式两种:在类适配器模式中,适配器与适配者之间是继承(或实现)关系;在对象适配器模式中,适配器与适配者之间是关联关系。前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

二、适配器模式优缺点

  主要优点:

  具体来说,类适配器模式还有如下优点:

  对象适配器模式还有如下优点:

  类适配器模式的缺点如下:

  对象适配器模式的缺点如下:

三、适配器模式实现

  适配器模式(Adapter)包含以下主要角色。

  类适配器模式的结构图如图所示(继承或实现关系):

             

  对象适配器模式的结构图如图所示(关联关系):

          

  代码实现(类适配器模式代码):

//目标接口
interface Target
{
    public void request();
}
//适配者接口 class Adaptee { public void specificRequest() { System.out.println("适配者中的业务代码被调用!"); } }
//类适配器类 class ClassAdapter extends Adaptee implements Target { public void request() { specificRequest(); } }
//客户端代码 public class ClassAdapterTest { public static void main(String[] args) { System.out.println("类适配器模式测试:"); Target target = new ClassAdapter(); target.request(); } }

  测试结果如下:

类适配器模式测试:
适配者中的业务代码被调用!

  代码实现(对象适配器模式代码):

//目标接口
interface Target
{
    public void request();
}

//适配者接口
class Adaptee
{
    public void specificRequest()
    {       
        System.out.println("适配者中的业务代码被调用!");
    }
}

//对象适配器类
class ObjectAdapter implements Target
{
    private Adaptee adaptee;
    public ObjectAdapter(Adaptee adaptee)
    {
        this.adaptee=adaptee;
    }
    public void request()
    {
        adaptee.specificRequest();
    }
}
//客户端代码
public class ObjectAdapterTest
{
    public static void main(String[] args)
    {
        System.out.println("对象适配器模式测试:");
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();
    }
}

四、适配器模式扩展(双向适配器模式)

   适配器模式(Adapter)可扩展为双向适配器模式,双向适配器类既可以把适配者接口转换成目标接口,也可以把目标接口转换成适配者接口,其结构图如图所示:

            

  实现代码如下:

//目标接口
interface TwoWayTarget
{
    public void request();
}
//适配者接口
interface TwoWayAdaptee
{
    public void specificRequest();
}
//目标实现
class TargetRealize implements TwoWayTarget
{
    public void request()
    {       
        System.out.println("目标代码被调用!");
    }
}
//适配者实现
class AdapteeRealize implements TwoWayAdaptee
{
    public void specificRequest()
    {       
        System.out.println("适配者代码被调用!");
    }
}
//双向适配器
class TwoWayAdapter implements TwoWayTarget, TwoWayAdaptee
{
    private TwoWayTarget target;
    private TwoWayAdaptee adaptee;
    public TwoWayAdapter(TwoWayTarget target)
    {
        this.target=target;
    }
    public TwoWayAdapter(TwoWayAdaptee adaptee)
    {
        this.adaptee=adaptee;
    }
    public void request()
    {
        adaptee.specificRequest();
    }
    public void specificRequest()
    {       
        target.request();
    }
}
//客户端代码
public class TwoWayAdapterTest
{
    public static void main(String[] args)
    {
        System.out.println("目标通过双向适配器访问适配者:");
        TwoWayAdaptee adaptee=new AdapteeRealize();
        TwoWayTarget target=new TwoWayAdapter(adaptee);
        target.request();
        System.out.println("-------------------");
        System.out.println("适配者通过双向适配器访问目标:");
        target=new TargetRealize();
        adaptee=new TwoWayAdapter(target);
        adaptee.specificRequest();
    }
}

  运行结果如下:

目标通过双向适配器访问适配者:
适配者代码被调用!
-------------------
适配者通过双向适配器访问目标:
目标代码被调用!

五、适配器模式适用场景

  常见适配器模式使用场景如下:

  在开源框架中有很多地方使用到了适配器模式,比如Spring AOP中,使用的 Advice(通知) 来增强被代理类的功能;SpringMVC中适配器模式主要用于执行目标 Controller 中的请求处理方法;Spring中关于数据库类型的适配;Netty中关于InboundHandler和OutboundHandler的适配。

 

标签:适配,适配器,接口,public,adaptee,模式,设计模式,Adapter
来源: https://www.cnblogs.com/yb-ken/p/15084880.html