适配器模式
定义
将一个接口转换成客户希望的另一个接口, 使接口不兼容的那些类可以一起工作.
类型
结构型.
分类
类适配器, 对象适配器.
角色
目标接口: Target, 该角色把其他类转换为我们期望的接口.
被适配者: Adaptee , 原有的接口, 也是希望被适配的接口.
适配器: Adapter, 将被适配者和目标接口组合到一起的类.
类适配器
Adaptee 类.
- package com.kaven.design.pattern.structural.adapter.classadapter;
- public class Adaptee {
- public void adapterRequest(){
- System.out.println("被适配者的方法");
- }
- }
Target 接口.
- package com.kaven.design.pattern.structural.adapter.classadapter;
- public interface Target {
- void request();
- }
ConcreteTarget 类, 具体目标类, 实现了 Target 接口.
- package com.kaven.design.pattern.structural.adapter.classadapter;
- public class ConcreteTarget implements Target {
- public void request() {
- System.out.println("concreteTarget 目标方法");
- }
- }
Adapter 类, 继承了 Adaptee 类, 实现了 Target 接口.
- package com.kaven.design.pattern.structural.adapter.classadapter;
- public class Adapter extends Adaptee implements Target {
- public void request() {
- super.adapterRequest();
- }
- }
Adapter 类继承了 Adaptee 类, 所以称为类适配器.
应用层代码:
- package com.kaven.design.pattern.structural.adapter.classadapter;
- public class Test {
- public static void main(String[] args) {
- Target target = new ConcreteTarget();
- target.request();
- Target adapterTarget = new Adapter();
- adapterTarget.request();
- }
- }
输出:
concreteTarget 目标方法
被适配者的方法
对象适配器
- package com.kaven.design.pattern.structural.adapter.objectadapter;
- public class Adaptee {
- public void adapterRequest(){
- System.out.println("被适配者的方法");
- }
- }
- package com.kaven.design.pattern.structural.adapter.objectadapter;
- public interface Target {
- void request();
- }
- package com.kaven.design.pattern.structural.adapter.objectadapter;
- public class ConcreteTarget implements Target {
- public void request() {
- System.out.println("concreteTarget 目标方法");
- }
- }
前面的这些类和类适配器中的一样.
Adapter 类, 实现了 Target 接口.
- package com.kaven.design.pattern.structural.adapter.objectadapter;
- public class Adapter implements Target {
- private Adaptee adaptee = new Adaptee();
- public void request() {
- adaptee.adapterRequest();
- }
- }
Adapter 类没有继承 Adaptee 类, 而是与 Adaptee 类实例进行组合, 这便是对象适配器.
应用层代码:
- package com.kaven.design.pattern.structural.adapter.objectadapter;
- public class Test {
- public static void main(String[] args) {
- Target target = new ConcreteTarget();
- target.request();
- Target adapterTarget = new Adapter();
- adapterTarget.request();
- }
- }
输出:
concreteTarget 目标方法
被适配者的方法
结果是一样, 只是 Adapter 类与 Adaptee 类的关系不同而已.
例子
我们平时用充电器给手机充电, 充电器可能需要将 220v 的电压转换成 5v 的电压, 我们才能给手机正常充电.
AC220 类 (Adaptee), 被适配者类, 原有 220v 的电压.
- package com.kaven.design.pattern.structural.adapter;
- public class AC220 {
- public int outputAC220V(){
- int output = 220;
- System.out.println("输出交流电"+output+"V");
- return output;
- }
- }
DC5 类 (Target 接口), 目标接口, 需要转换成 5v 的电压.
- package com.kaven.design.pattern.structural.adapter;
- public interface DC5 {
- int outputDC5V();
- }
PowerAdapter 类 (Adapter 类), 适配器类, 将 220v 的电压转换成 5v 的电压.
- package com.kaven.design.pattern.structural.adapter;
- public class PowerAdapter implements DC5 {
- private AC220 ac220 = new AC220();
- public int outputDC5V() {
- int adapterInput = ac220.outputAC220V();
- // 变压器...
- int adapterOutput = adapterInput/44;
- System.out.println("使用 PowerAdapter 输入 AC"+adapterInput+"V"+"输出 DC"+adapterOutput+"V");
- return adapterInput;
- }
- }
应用层代码:
- package com.kaven.design.pattern.structural.adapter;
- public class Test {
- public static void main(String[] args) {
- DC5 dc5 = new PowerAdapter();
- dc5.outputDC5V();
- }
- }
输出:
输出交流电 220V
使用 PowerAdapter 输入 AC220V 输出 DC5V
这里便完成了一个简单的适配器模式例子.
适用场景
想要使用一个已经存在的类, 但是它却不符合现有的接口规范, 导致无法直接去访问, 这时创建一个适配器就能间接去访问这个类中的方法.
我们有一个类, 想将其设计为可重用的类, 我们可以创建适配器, 将这个类来适配其他没有提供合适接口的类.
优点
将目标类和适配者类解耦, 通过引入一个适配器类来重用现有的适配者类, 无须修改原有结构.
增加了类的透明性和复用性, 将具体的业务实现过程封装在适配者类中, 对于客户端类而言是透明的, 而且提高了适配者类的复用性, 同一个适配者类可以在多个不同的系统中复用.
灵活性和扩展性都非常好, 通过使用配置文件, 可以很方便地更换适配器, 也可以在不修改原有代码的基础上增加新的适配器类, 符合 "开闭原则".
缺点
会让系统看起来很复杂, 不易维护.
适配器模式最好在详细设计不要考虑它, 它不是为了解决还处在开发阶段的问题, 而是解决正在服役的项目问题.
如果有说错的地方, 请大家不吝赐教 (记得留言哦~~~~).
来源: https://blog.csdn.net/qq_37960603/article/details/104090293