适配器模式属于结构型模式的一种,用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有俩极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法充电。这时候一个三相到俩相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。适配器模式主要有俩种类型,类适配器模式和对象适配器模式,由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而JAVA并不支持多继承,也就是一个类只能有一个父类,所以我们这里主要讲的是对象适配器。
结构型模式是将系统中的多个类或对象组合在一起,相互协作来完成更复杂的任务或功能。就好比搭积木,许多简单积木可以搭建成更复杂、功能更强大的结构。它分为俩种形式:类结构型模式和对象结构性模式。类结构型模式由多个类组合,存在继承和实现关系;对象结构型模式由类和对象组合,存在关联关系(比如车和车胎的关系)。
下面我们再介绍下适配器模式:
1.定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2.模式结构图:
(1)Target(目标抽象类):定义了特定的工作接口。
(2)Adapter(适配器类):模式的核心类,作业转换器对Target和Adapter进行适配。
(3)Adaptee(适配者类):定义了需要适配的接口。
(4)Client(客户类):针对目标抽象类编程,调用其定义的方法。
3.案例分析:
目标抽象类Rebot
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:34 */ public interface Robot { void cry(); void move(); }
需要适配的类Dog
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:36 */ public class Dog { public void shout() { System.out.println("狗可以汪汪叫..."); } public void run() { System.out.println("狗可以跑..."); } }
适配器类DogAdapter
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:37 */ public class DogAdapter implements Robot { private Dog dog; public DogAdapter(Dog dog) { this.dog = dog; } public void cry() { System.out.print("机器人模仿:"); dog.shout(); } public void move() { System.out.print("机器人模仿:"); dog.run(); } }
最后是测试类,以及运行结果
package com.lwx.adapter; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-04-13 * Time: 18:38 */ public class Client { public static void main(String[] args) { Robot dogAdapter = new DogAdapter(new Dog()); dogAdapter.cry(); dogAdapter.move(); } }
4、模式优缺点:
优点:将目标类和适配者类解耦,更换添加适配器方便简单增加了类的复用性。
缺点:类适配器一次只能适配一个适配者类,目标抽象类只能为接口,具有一定的局限性;对象适配器模式很难置换适配者类的方法。
5、模式应用:
适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况;就是双方都不太容易修改时就可以考虑使用该模式。
最后附上demo的githup地址:https://github.com/yijinqincai/design_patterns