设计模式(五)结构型模式---适配器模式
文章目录
- 适配器模式简介
- 结构
- 适配器分类
- 类适配器(class adapter)
- 具体实现
- UML图
- 代码实现
- 缺点
- 接口适配器(interface adapter)
- 具体实现
- UML图
- 代码实现
- 对象适配器(object adapter)
- 具体实现
- UML图
- 代码实现
适配器模式简介
适配器模式是将一个类的接口转换成客户希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的,而能一起工作。
结构
- 1.目标接口(Target):当前系统所期待的接口,它可以是抽象类或者接口。
- 2.适配者类(Adaptee):它是被访问和适配的现存组件库中的组件接口。
- 3.适配器类(Adapter):转换器,通过继承或者引用适配者的对象,把适配折接口转换城目标接口,让客户目标接口的格式访问适配者。
适配器分类
适配器根据适配对象不同,分为:类适配器、接口适配器、对象适配器。
类适配器(class adapter)
类适配器中的目标对象(Target)是一个接口,被适配者类(Adaptee)需要实现或者继承目标对象接口和被适配者的类。
具体实现
例子:将220V的电压转到5V。
UML图
代码实现
- 5V电压接口(目标接口)
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 5V电压接口,目标接口 - target* @date 2024/5/24 23:56*/
public interface IVoltage5V {public int output5V();
}
- 220V类(适配者类)
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 现存适配者类* @date 2024/5/25 0:01*/
public class Voltage220V {/*** @description 输出220V* @author xxliao* @date 2024/5/25 0:04*/public int output220V() {System.out.println("电压="+220+"V");return 220;}
}
- 适配器类
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 适配器类** @date 2024/5/25 0:04*/
public class Adapter extends Voltage220V implements IVoltage5V{@Overridepublic int output5V() {int src = output220V();int dest = src / 44;System.out.println(src+"v ==> "+dest+"V");return dest;}
}
- 测试客户端
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 类适配器测试客户端类* @date 2024/5/25 0:06*/
public class Client {public static void main(String[] args) {Adapter adapter = new Adapter();adapter.output5V();}
}
- 测试结果
缺点
- 缺点:适配器类(Adapter)需要继承被适配器类(Adaptee)违背了 里氏替换原则。
接口适配器(interface adapter)
- 当不需要全部实现接口提供的方法时,可先设计一个适配器抽象类实现接口,并为该接口中每个方法提供一个默认实现(空实现),那么适配器的子类可以选择性地覆盖父类地方法。
- 使用一个接口不想使用其所有方法的情况。
具体实现
UML图
代码实现
- 测试接口
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;/*** @author xxliao* @description: 测试接口* @date 2024/5/25 0:23*/
public interface TestInterface {public void method01();public void method02();public void method03();public void method04();}
- 适配器抽象类
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;/*** @author xxliao* @description: 适配器抽象类* @date 2024/5/25 0:25*/
public abstract class AbstractAdapter implements TestInterface{@Overridepublic void method01() {}@Overridepublic void method02() {}@Overridepublic void method03() {}@Overridepublic void method04() {}
}
- 测试客户端
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;/*** @author xxliao* @description: 接口适配器 测试客户端 测试类* @date 2024/5/25 0:26*/
public class Client {public static void main(String[] args) {AbstractAdapter abstractAdapter = new AbstractAdapter(){@Overridepublic void method01() {super.method01();System.out.println("执行了method01方法..."); // 抽象适配器子类}};abstractAdapter.method01();}
}
- 测试结果:
对象适配器(object adapter)
- 因为类适配器的适配器类需要继承被适配者类违背了里斯替换原则,所以可以采用合成复用原则 ,将被适配者类当作成员变量进行组合使用。
具体实现
UML图
代码实现
- 5V接口(目标接口)
package com.xxliao.pattern.structure.adapter.object_adapter.demo;/*** @author xxliao* @description: 5V接口 - 目标接口* @date 2024/5/24 23:56*/
public interface IVoltage5V {public int output5V();}
- 220V类(适配者类)
package com.xxliao.pattern.structure.adapter.object_adapter.demo;/*** @author xxliao* @description: 现存适配者类* @date 2024/5/25 0:01*/
public class Voltage220V {/*** @description 输出220V* @author xxliao* @date 2024/5/25 0:04*/public int output220V() {System.out.println("电压="+220+"V");return 220;}
}
- 适配器类
package com.xxliao.pattern.structure.adapter.object_adapter.demo;import com.xxliao.pattern.structure.adapter.class_adapter.demo.Voltage220V;/*** @author xxliao* @description: 适配器类* @date 2024/5/25 0:04*/
public class Adapter implements IVoltage5V {private Voltage220V voltage220V;public Adapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {int src = voltage220V.output220V();int dest = src / 44;System.out.println(src+"v ==> "+dest+"V");return dest;}
}
- 测试客户端
package com.xxliao.pattern.structure.adapter.object_adapter.demo;import com.xxliao.pattern.structure.adapter.class_adapter.demo.Voltage220V;/*** @author xxliao* @description: 对象适配器 测试客户端 测试类* @date 2024/5/25 0:06*/
public class Client {public static void main(String[] args) {Voltage220V voltage220V = new Voltage220V();Adapter adapter = new Adapter(voltage220V);adapter.output5V();}
}
- 测试结果