7、设计模式之适配器模式

定义

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。

适配器模式(Adapter)包含以下主要角色。

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

类适配器模式

需求
给手机充电时,需要用5v的电压,而我们生活用电时220v的。如果直接用220v电压给手机充电,估计手机一下子就爆炸了,所以需要电源适配器将220v电压转换成5v电压。

创建适配者类:22V电压类

package com.hupp.adapter.classadapter;

public class Voltage220V {
    
    
    public int output220v(){
    
    
        int source = 220;
        System.out.println("电压="+source+"伏");
        return source;
    }
}

创建目标接口:5V电压接口

package com.hupp.adapter.classadapter;

public interface IVoltage5V {
    
    
    int output5v();
}

创建适配器:将220v转换成5v

package com.hupp.adapter.classadapter;

public class VoltageAdapter extends Voltage220V implements IVoltage5V {
    
    
    @Override
    public int output5v() {
    
    
        int source = output220v();
        int dst = source/44;
        return dst;
    }
}

创建手机类,给手机充电

package com.hupp.adapter.classadapter;

public class Phone {
    
    
    public void charging(IVoltage5V iVoltage5V){
    
    
        if(iVoltage5V.output5v()==5){
    
    
            System.out.println("电压5V,可以充电");
        }
        else if(iVoltage5V.output5v()>5){
    
    
            System.out.println("电压过高,不能充电");
        }
    }
}

创建客户端类,调用手机充电方法

package com.hupp.adapter.classadapter;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
    }
}

输出结果
在这里插入图片描述

对象适配器

对象适配器代码和类适配器非常相似,区别就是将类适配器中的继承关系改成聚合关系,对于类继承器的代码只需改动适配器就行了。因为没有继承关系了,那么适配器和适配者的耦合度就降低了。

修改后的适配器代码

package com.hupp.adapter.objadapter;

public class VoltageAdapter implements IVoltage5V {
    
    

    //通过构造函数传入
    public VoltageAdapter(Voltage220V voltage220V) {
    
    
        this.voltage220V = voltage220V;
    }

    private Voltage220V voltage220V;

    @Override
    public int output5v() {
    
    
        int dst = 0;
        if(null!=voltage220V){
    
    
            int source = voltage220V.output220v();
            dst = source/44;
        }
        return dst;
    }
}

客户端调用

package com.hupp.adapter.objadapter;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
    }
}

执行结果
在这里插入图片描述

接口适配器模式 / 缺省设计模式

当不需要全部实现接口提供的方法时,可以设计一个抽象类实现接口,并为该接口中每一个方法提供一个默认实现(空方法),那么该抽象类的子类可以有选择的覆盖父类的某些方法来实现需求

适用于一个接口实现类不需要使用接口提供的所有方法的情况。

代码演示

接口

package com.hupp.adapter.interfaceadapter;

public interface MyInterface {
    
    
    void method1();

    void method2();

    void method3();
}

适配器,实现接口

package com.hupp.adapter.interfaceadapter;

public abstract class AbsAdapter implements MyInterface{
    
    
    @Override
    public void method1() {
    
    

    }

    @Override
    public void method2() {
    
    

    }

    @Override
    public void method3() {
    
    

    }
}

客户端,匿名了重写需要的方法

package com.hupp.adapter.interfaceadapter;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        AbsAdapter adapter = new AbsAdapter() {
    
    
            @Override
            public void method1() {
    
    
                System.out.println("使用了method1方法");
            }
        };
        adapter.method1();
    }
}

输出结果
在这里插入图片描述

Guess you like

Origin blog.csdn.net/hpp3501/article/details/111317186