适配器模式

1、适配器的角色

1)目标(Target):使用的特定接口。
2)被适配者(Adaptee):一个现存需要适配的接口。
3)适配器(Adapter):负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。

2、类适配器

类图

在这里插入图片描述

代码

适配器类

/**
 * 电压适配器
 */
public class VoltageAdapter extends Voltage220V implements IVoltage110V {
    @Override
    public int output110V() {
        int v = output220V();
        System.out.println("============类适配器==============");
        System.out.println("电压="+v);
        System.out.println("电压转换中");
        v = v/2;//转为110v
        System.out.println("电压转换完毕,电压为"+v);
        System.out.println("============类适配器==============");
        return v;
    }
}

需要适配的接口

/**
 * 110v的电压接口
 */
public interface IVoltage110V {
    public int output110V();
}

需要被适配的对象

/**
 * 输出220v电压
 */
public class Voltage220V {
    public int output220V(){
        int src = 220;
        return src;
    }
}

调用适配接口的对象

/**
 * 我的设备只能接受110v的电压
 */
public class MyPC {
    public void charging(IVoltage110V iVoltage110V){
        if (iVoltage110V.output110V() == 110){
            System.out.println("充电中");
        }else{
            System.out.println("不能充电");
        }
    }
}

运行代码

public class AdapterTest {
    public static void main(String[] args) {
        MyPC myPC = new MyPC();
        //通过电源适配器将电压转为110V
        myPC.charging(new VoltageAdapter());
    }
}

运行效果
在这里插入图片描述

类适配器的缺点

1)java是单继承机制,一个类只能继承一个对象,通过继承adaptee并且实现target方法,是静态的方式。
2)它会将adaptee的方法都在适配器中暴露出来

解决以上的缺陷则选用对象适配器

3、对象适配器

类图

在这里插入图片描述

代码

适配器类

/**
 * 电压适配器
 * 对象适配器使用了合成服用原则的思想将要适配的对象实例化后进行适配大大增加了适配器的灵活性
 */
public class VoltageAdapter implements IVoltage110V {
    Voltage220V voltage220V = null;

    //通过构造器传入要适配的一个类型的实例
    public VoltageAdapter(Voltage220V voltage220V){
        this.voltage220V = voltage220V;
    }

    @Override
    public int output110V() {
        int v = voltage220V.output220V();
        System.out.println("============对象适配器==============");
        System.out.println("电压="+v);
        System.out.println("电压转换中");
        v = 110;//转为110v
        System.out.println("电压转换完毕,电压为"+v);
        System.out.println("============对象适配器==============");
        return v;
    }
}

运行代码

public class AdapterTest {
    public static void main(String[] args) {
        MyPC myPC = new MyPC();

        Voltage220V voltage220V = new Voltage220V();
        //通过电源适配器将电压转为110V
        myPC.charging(new VoltageAdapter(voltage220V));
    }
}

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

相较于类适配器

1、基本与类适配器相似,通过“合成复用原则”修改了adapter,不是在继承adaptee而是持有了adaptee的实例对象,解决了类适配器的缺陷

4、接口适配器

类图

在这里插入图片描述

代码

适配器

/**
 * 接口适配器
 * 当不想实现接口的全部方法时可以使用接口适配器来进行默认的实现
 */
public abstract class MyAdapter implements MyInterface{

    @Override
    public void method01() {
    }

    @Override
    public void method02() {
    }

    @Override
    public void method03() {
    }

    @Override
    public void method04() {
    }
}

被适配接口

/**
 * 被适配的接口
 */
public interface MyInterface {
    public void method01();
    public void method02();
    public void method03();
    public void method04();
}

运行代码

public class AdapterTest {
    public static void main(String[] args) {
        //只想使用method01方法就通过适配器重写method01方法即可使用
        MyInterface myAdapter = new MyAdapter() {
            @Override
            public void method01() {
                System.out.println("我就想使用method01方法");
            }
        };
        myAdapter.method01();
    }
}

运行效果
在这里插入图片描述

适用环境

适合使用在不需要实现该接口所有方法的情况下只需通过适配器实现自己所需要使用的方法即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值