首页 > 代码库 > Java设计模式1-适配器模式

Java设计模式1-适配器模式

一、适配器模式简介

    适配器模式主要解决的问题是:当需调用已存接口类型,此接口类型无法满足当前需求。需要创建一个适配器对已存接口类型进行转换,转换后达到供新需求调用的目的。适配器仅仅起到一个功能转换的目的,而具体实现仍然是旧接口类型。

    下面以一个比较通俗的例子进行阐述:

     大家都在用手机,当我们手机没电时需要充电,我们不能直接把220V交流电插入手机上,否则手机肯定报废。而是需要一个充电器把高压电流转化成符合手机的低压电流。从而实现了手机充电这个功能。

二、适配器适用场景

    1、使用第三方类提供的方法时,需要转换成当前系统需要的方法。

    2、当前已经存在系统,新建一个系统并且要求新系统能够使用旧系统的数据接口。

三、Java适配器分类

    1、类适配器

         当新需求需要调用一个接口规则时,我们可以让适配器继承自已存接口类型,并且同时实现接口类型方法。在实现方法内调用已存接口类型的方法。从而达到实现转换的目的。

    2、对象适配器

        当新需求调用非接口时,我们让适配器继承自需求类,并且在适配器内部新建一个已存类型的实例,在需求方法内部调用已存类型的方法。从而达到转换的目的。

四、涉及角色

    4.1、调用者(Client)

    4.2、目标(Target)

    4.3、适配器(Adapter)

    4.4、被适配者(Adaptee)

五、适配器模式实例讲解

      实例场景:

      某公司已经在线运行ERP软件(自主开发),一直运行比较稳定,由部门程序员小张维护。近期、委托B软件公司进行扩展功能开发,已经根据需求完成了大半的工作。此时,B软件公司需要一个功能,把当前ERP的库存进行展现,设计调用规则为接口的GetList()方法,考虑到ERP已经存在此模块功能,但是原功能函数为Query()。此时,为了数据的来源的一致性,需要小张提供一个接口实现,完成功能转换。

     4.1、类适配器类图

   类图:

    技术分享

     角色分解:

     ClientClass:调用者,是B软件公司显示库存的功能。

     TargetInterface:目标接口,B软件公司设计的调用规则,规定调用GetList()函数功能,(java中的接口类型)

     AdapteeClass:被适配者,ERP软件中已存模块,其中查询库存使用了Query()函数。

     AdapterClass:适配器,用于把AdapteeClass中的Query()函数转换成ClientClass中使用的调用规则函数GetList().

    代码:

///客户端使用类public class ClientClass {	///运行	public static void main(String[] args)	{		ClientClass d = new ClientClass();		d.GetData();	}		public void GetData()	{		TargetInterface target = new AdapterClass();		ArrayList<String> data = http://www.mamicode.com/target.GetList();"1");add("2");add("3");}};	}}

  运行效果:

  技术分享

  4.2、对象适配模式

  类图

技术分享

     角色分解:

     ClientClass:调用者,是B软件公司显示库存的功能。

     TargetInterface:目标接口,B软件公司设计的调用规则,规定调用GetList()函数功能,(java中的抽象类)

     AdapteeClass:被适配者,ERP软件中已存模块,其中查询库存使用了Query()函数。

     AdapterClass:适配器,用于把AdapteeClass中的Query()函数转换成ClientClass中使用的调用规则函数GetList().

   代码实例:

   

package com.msj.adapter.objectadapter;import java.util.ArrayList;public class ClientClass {    ///运行    public static void main(String[] args)    {        ClientClass d = new ClientClass();        d.GetData();    }        public void GetData()    {        TargetAbstractClass target = new AdapterClass();        ArrayList<String> data =http://www.mamicode.com/ target.GetList();        System.out.print(data);            }}public abstract class TargetAbstractClass {        abstract ArrayList<String> GetList();}public class AdapterClass extends TargetAbstractClass{        @Override    java.util.ArrayList<String> GetList() {        AdapteeClass adapter = new AdapteeClass();        return adapter.Query();    }    }public class AdapteeClass {        public ArrayList<String> Query()    {        return  new ArrayList<String>(){{add("1");add("2");add("3");}};    }}

运行效果:

  跟类适配器效果相同。

 

Java设计模式1-适配器模式