基本信息
共有两类适配器模式:
对象适配器模式
-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
类适配器模式
-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。 [1]
解释
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
基本概念
客户:需要调用我们的代码的对象。
Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
主要内容
(1)类适配器:
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。
下面是类适配器的UML图:
(2)对象适配器:
对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。下面是对象适配器的UML图:
(3) 缺省适配器模式:
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。 [2]
案例总共有两种方案:
方案一
package coms.Design.Mode.adaptee; /** * 实现接口 * 处理请求 */ public interface NetToUsb { public void handleRequest(); }
package coms.Design.Mode.adaptee; /** * 适配器模式 * 将一个接口 */ public class Adaptee { public void request(){ System.out.println("开始在电脑上连线开始上网"); } }
package coms.Design.Mode.adaptee; /** * 电脑 适配器 网线 * 1 继承 * 2 组合 */ public class Adapter extends Adaptee implements NetToUsb{ @Override public void handleRequest() { super.request();//可以上网了 } }
public class Adapter extends Adaptee implements NetToUsb
package coms.Design.Mode.adaptee; /** * 电脑 想上网 */ public class Computer { public void net(NetToUsb adapter){ //要有转接头 // 上网具体的实现类 找个转接头 adapter.handleRequest(); } public static void main(String[] args) { //电脑 适配器 网线 Computer computer = new Computer(); //电脑 Adaptee adaptee = new Adaptee(); //网线 // Adapter adapter = new Adapter(); //转接器 Adapter2 adapter = new Adapter2(adaptee); computer.net(adapter); // computer.net(adapter); } }
方案二 在方案一的基础上改进
package coms.Design.Mode.adaptee; /** * 电脑 适配器 网线 * 1 继承 * 2 组合 */ public class Adapter2 implements NetToUsb{ /** * 将类注入Adaptee adaptee */ private Adaptee adaptee; public Adapter2(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void handleRequest() { adaptee.request();//可以上网了 } }
package coms.Design.Mode.adaptee; /** * 电脑 想上网 */ public class Computer { public void net(NetToUsb adapter){ //要有转接头 // 上网具体的实现类 找个转接头 adapter.handleRequest(); } public static void main(String[] args) { //电脑 适配器 网线 Computer computer = new Computer(); //电脑 Adaptee adaptee = new Adaptee(); //网线 // Adapter adapter = new Adapter(); //转接器 Adapter2 adapter = new Adapter2(adaptee); computer.net(adapter); // computer.net(adapter); } }
案例: