首页 > 代码库 > 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-适配器模式