杨居易的设计模式之------------ 适配器模式----------百搭篇

**

适配器模式

**

1.是什么

为解决两个对象或者接口之间的不兼容而需要引入第三方进行适配

简单来说就是代码中的转换器

2.用在哪

当需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时就使用适配器模式。

生活中的适配器

我们用的是220V的交流电,为了满足不同电器的使用,我们于是有了一个转换电源电压的装置,来保护电器,这是最明显的适配器

1.现在用电脑的朋友,看下后面那一坨充电器就明白了吧!!

在这里插入图片描述

2.同理手机也是这样

在这里插入图片描述

3.结构

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。我的电子产品

  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。 充电器,转换器

  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。 220V交流电

    现在一般有三种适配器类型模式选择

    a.类适配器

    b.对象适配器

    c.抽象适配器

4.怎么用

1.类适配器模式

在这里插入图片描述

现在抽象一个场景:我们来给我的洋气手机充电,手机和电源我们已经找好了,现在就差一个适配器了

插座

//220V的交流插座
public class Adaptee {
    public int output220V() {
        int output = 220;
        return output;
    }
}

适配器接口

//适配器接口
public interface Target {
    int output5V();
}

具体适配器

//具体的将220V转换
public class ClassAdapter extends Adaptee implements Target {
    @Override
    public int output5V() {
        int output = output220V();
        return (output/44);
    }
}

客户端测试

public class ClassAdapterTest {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        System.out.println("电源的电压是"+adaptee.output220V()+"V");
        Target out5v=new ClassAdapter();
        System.out.println("转换后的电压"+out5v.output5V()+"V");

    }
}

2.对象适配器模式

在这里插入图片描述

插座

//220V的交流插座
public class Adaptee {
    public int output220V() {
        int output = 220;
        return output;
    }
}

适配器接口

//适配器接口
public interface Target {
    int output5V();
}

具体适配器 区别

//具体的将220V转换
public class ObjAdapter implements Target {
   private Adaptee adaptee;
//利用构造函数
    public ObjAdapter(Adaptee adaptee) {
        super();
        this.adaptee = adaptee;
    }

    @Override
    public int output5V() {
        Adaptee adaptee=new Adaptee();
        System.out.println("电源的电压是"+adaptee.output220V()+"V");
        int output = adaptee.output220V();
        return (output/44);
    }
}

测试

public class ObjAdapterTest {
    public static void main(String[] args) {
        ObjAdapter adaptee=new ObjAdapter(new Adaptee());
        System.out.println("转换后的电压"+adaptee.output5V()+"V");
    }
}

区别

a.类适配器可以重定义实现行为,而对象适配器重定义适配的行为比较困难,但是添加行为较方便。

b.对象适配器通过委派与adaptee衔接,即持有adaptee对象,是动态的方式;类适配器通过集成与adaptee衔接,也就是说类适配器继承adaptee,并且实现target方法,是静态的方式。

c.由于对象适配器采用动态的方式与adaptee衔接,使得它可以对不同的适配源及其子类进行适配.

尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。

3.现在我想一个充电器头可以输出不同的电流,实现快充和慢充 1A 2A 3A的接口,将接口再次抽象一下

在这里插入图片描述

插座

//220V的交流插座
public class Adaptee {
    public int output220V() {
        int output = 220;
        return output;
    }
}

适配器接口

/*对于接口适配器模式,我们的接口可以有更多的抽象方法,但我们只需要关心我们需要的回调方法
(详见AnimatorListenerAdapter类),我们把接口比作万能适配器:*/
public interface Target {
    int output1A();
    int output2A();
    int output3A();
}

中间适配器

/*我们必须存在一个中间适配器,用于实现默认的接口方法,以至于减少我们适配器的代码量,让代码更加清晰*/
public abstract class PowerAdapter implements Target {
//I=U/R
    public int R1=220;
    public int R2=110;
    public int R3=70;
    @Override
    public int output1A() {
        return 220/R1;
    }

    @Override
    public int output2A() {
        return 220/R1;
    }

    @Override
    public int output3A() {
        return 220/R1;
    }
}

单独电流接口

public class Adapter1A extends PowerAdapter{
    @Override
    public int output1A() {
        int output = super.output1A();
        return output;
    }
}

2A,3A…

测试

public class Test {
    public static void main(String[] args) {

        PowerAdapter powerAdapter=new Adapter1A();
        powerAdapter.output1A();
        System.out.println("这是一个"+ powerAdapter.output1A()+"A的适配器");
    }
}

5.融会贯通–适配者模式

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值