6.适配器模式

目录

简介

类适配器

示例代码

1. 新建 Voltage220V.class,这是原有的 220V 电压的类,只提供了 220V 电压

2. 新建 IVoltage5V.interface,提供 5V 电压转换规则

3. 新建 VoltageAdapter.class,该类继承了 Voltage220V.class,拥有 220V 电压,又实现了 IVoltage5V.interface 的 5V 电压的转换方法

4. 新建 Phone.class,测试转换器提供的 5V 电压充电

对象适配器

示例代码

接口适配器

示例代码


简介

将一个类的接口转换成客户希望的另外一个接口;适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作;例如在生活中,我们常常会碰到这样的场景:手机充电需要 5V 的电压,但生活用电是 220V,手机不能直接使用 220V 电压充电,我们就需要一个充电器将电压从 220V 转换为 5V,才能给手机充电;本章以次示例演示不同的适配器模式

类适配器

类适配器主要采用继承方式实现,继承了被适配的类;因为 Java 是单继承机制,所以类适配器的设计是一个缺点,要求转换类必须是一个接口,有一定的局限性

被适配(被继承)的类在适配器中都会暴露出来,这也增加了使用的成本

由于继承了被适配的类,所以可以根据需求重写其原来的方法,使得适配器的灵活性增强了

示例代码

1. 新建 Voltage220V.class,这是原有的 220V 电压的类,只提供了 220V 电压

/**
 * 220V电压
 */
public class Voltage220V {
    public int output220V() {
        System.out.println("这是 220V 的电压");
        return 220;
    }
}

2. 新建 IVoltage5V.interface,提供 5V 电压转换规则

/**
 * 提供 5V 电压规范
 */
public interface IVoltage5V {
    int output5V();
}

3. 新建 VoltageAdapter.class,该类继承了 Voltage220V.class,拥有 220V 电压,又实现了 IVoltage5V.interface 的 5V 电压的转换方法

/**
 * 适配器类:电压转换
 */
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
    /**
     * 提供转换 5V 的电压
     */
    @Override
    public int output5V() {
        int v220 = this.output220V();
        System.out.println("将 220V 电压转换为 5V");
        return v220 / 44;
    }
}

4. 新建 Phone.class,测试转换器提供的 5V 电压充电

/**
 * 手机类, 需要使用 5V 电压充电
 */
public class Phone {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
    }

    /**
     * 定义充电方法
     */
    public void charging(VoltageAdapter adpater) {
        int v5 = adpater.output5V();
        System.out.println("手机使用 " + v5 + " 伏电压充电");
    }
}

对象适配器

对象适配器是类适配器的升级版,主要通过对适配器类的修改,不继承被适配的类,而是通过组合的方式持有被适配的类,以解决兼容性问题

根据"合成复用原则",在系统中应尽量使用关联关系来替代继承关系

示例代码

1. 修改 VoltageAdapter 代码如下

/**
 * 适配器类:电压转换
 */
public class VoltageAdapter implements IVoltage5V {
    // 把继承改为组合
    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    /**
     * 提供转换 5V 的电压
     */
    @Override
    public int output5V() {
        int v220 = voltage220V.output220V();
        System.out.println("将 220V 电压转换为 5V");
        return v220 / 44;
    }
}

2. 修改 Phone.class,在使用适配器的时候,需要把 Voltage220V 提供给适配器

/**
 * 手机类, 需要使用 5V 电压充电
 */
public class Phone {
    public static void main(String[] args) {
        Phone phone = new Phone();
        Voltage220V voltage220V = new Voltage220V();
        phone.charging(new VoltageAdapter(voltage220V));
    }

    /**
     * 定义充电方法
     */
    public void charging(VoltageAdapter adpater) {
        int v5 = adpater.output5V();
        System.out.println("手机使用 " + v5 + " 伏电压充电");
    }
}

接口适配器

对于实现了接口的类来说,我们需要实现该接口中的所有方法,但有的时候,我们只需要接口中的某些方法,特别是一个类实现了多个接口的情况下;接口适配器主要通过抽象类对接口方法的实现(空方法),我们只需要在调用特定方法的时候通过重写并实现这个抽象类中的方法即可

示例代码

1. 新建 Interface.interface,提供如下 3 个方法

/**
 * 接口类, 提供如下 3 个方法
 */
public interface Interface {
    void method1();
    void method2();
    void method3();
}

2. 新建 AbsClass.class 实现 Interface.interface,并对其 3 个方法进行实现(空方法)

/**
 * 抽象类实现 Interface, 提供 Interface 接口中 3 个方法的默认实现(空方法)
 */
public abstract class AbsClass implements Interface {
    @Override
    public void method1() {}

    @Override
    public void method2() {}

    @Override
    public void method3() {}
}

3. 新建测试类,我们只调用需要的方法 method1

/**
 * 测试类, 我们只想执行 method1 方法
 */
public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.executeMethod1(new AbsClass() {
            // method1 的具体实现
            @Override
            public void method1() {
                System.out.println("执行 method1() 方法");
            }
        });
    }
    /**
     * 测试执行 method1
     */
    public void executeMethod1(AbsClass clazz) {
        clazz.method1();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值