设计模式(五)结构型模式---适配器模式(adapter)

适配器模式简介

适配器模式(adapter pattern)是将一个类的接口转换成客户希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的,而能一起工作。

结构

  • 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{
    
    @Override
    public 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{

    @Override
    public void method01() {

    }

    @Override
    public void method02() {

    }

    @Override
    public void method03() {

    }

    @Override
    public 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(){
            @Override
            public 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;
    }

    @Override
    public 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();
    }
}
  • 测试结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑车上酒吧

帮到了您,有闲钱,再打赏哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值