适配器模式的实现,就这么简单

标签: 设计模式  java  编程语言  接口  proxy

image-20200522221626410
往期设计模式回顾


1、一文深入理解单利模式

2、浅谈工厂设计模式

3、Java Builder 模式,你搞明白了吗?

4、通俗易懂的讲解一下Java的代理模式如何实现

5、java学习笔记之原型模式及深浅拷贝

一、什么是适配器模式

生活中的例子:

手机充电:电源,充电器,手机

通常情况下电源的电压是220V,而市面上不同的手机所需的充电电压可能是10V,20V等等,这个时候充电器就充当一个转换器的角色。就是把电源电压转换成手机需要的电压。

其实适配器模式就是把原本不能在一起工作的设备转换成能一起工作的设备。

适配器中的角色:

需要适配的类(Adaptee),需要适配的类。 ----电源

适配器(Adapter),通过包装一个需要适配的对象,把原有的接口转换成目标接口。–充电器

目标接口(Target),客户所期待的接口,目标可以是具体的或抽象的类或接口。 —手机

模拟图:

image-20200522191854845

二、适配器的实现方式

适配器模式实现的方式

  • 类适配器模式
  • 对象适配器模式
  • 接口适配器模模式

下面我们就以上面提到手机为例讲解适配器模式

1、类适配器模式

代码类图:

image-20200522211533423

代码实现:

/**
 * @author 13394
 * 电源(Adaptee)
 */
public class PowerSupply {
    private int powerValue = 220;
    public int outSrcPower() {
        System.out.println("电源输出的电压为:" + powerValue);
        return powerValue;
    }
}

/**
 * @author 13394
 * 适配器(Adapter)
 */
public class ChargerAdapter extends PowerSupply implements TargetPhone {
    @Override
    public int outDescPower() {
        int srcPower = outSrcPower();
        int desc = srcPower/4;
        System.out.println("phone的电压是:"+desc);
        return desc;
    }
}

/**
 * @author 13394
 * 目标接口(Target)
 */
public interface TargetPhone {
   int outDescPower();
}

public class Client {
    public static void main(String[] args) {
        new ChargerAdapter().outDescPower();
    }
}

测试结果:

电源输出的电压为:220
phone的电压是:55

类适配器模式,因为 ChargerAdapter类既继承了 PowerSupply(需要适配的类),也实现了 TargetPhone接口,但是在Java是单继承机制,所以有一定的局限性。

2、对象适配器模式

类图:

image-20200522212710673

代码实现

说明TargetPhone,PowerSupply和上面的一样,适配器(ChargerAdapter)是通过持有需要适配对象(PowerSupply)的引用来实现的。

/**
 * @author 13394
 * 适配器(Adapter)
 */
public class ChargerAdapter implements TargetPhone {

    private PowerSupply powerSupply; 
    初始化需要适配的对象 
    public ChargerAdapter(PowerSupply powerSupply){
        this.powerSupply=powerSupply;
    }

    @Override
    public int outDescPower() {
        int srcPower =powerSupply.outSrcPower();
        int desc = srcPower/4;
        System.out.println("phone的电压是:"+desc);
        return desc;
    }
}

public class Client {
    public static void main(String[] args) {
        new ChargerAdapter(new PowerSupply()).outDescPower();
    }
}

测试结果:

电源输出的电压为:220
phone的电压是:55

说明:对象适配器和类适配器其实是同一种思想,不同的实现方式而已,对象适配器模式是使用组合代替继承,解决了对象适配器继承的问题。

测试结果与类适配器测试结果一致。从代码中我们可以看出只不过就是 ChargerAdapter类的内部结构,即 ChargerAdapter自身必须先拥有一个被适配类的对象,再初始化需要适配的对象。使用对象适配器模式,可以使得 ChargerAdapter类(适配类)根据传入多个需要适配类对象达到适配多个不同被适配类的功能。

3、接口适配器模式

思路是:当我们不需要全部实现接口提供的方法时,可以设计一个抽象类实现接口,并且为接口中的每一个方法提供一个默认的方法,那么该抽象类的之类可以有选择的覆盖父类的某些方法来实现需求。

public interface Target {

    void test();

    void test1();

    void test2();
}

public abstract class Adapter implements Target {
    @Override
    public void test() {

    }

    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }
}

public class Client {
    public static void main(String[] args) {
       Adapter adapter=new Adapter() {
           @Override
           public void test() {
               System.out.println("test1");
           }
       };
       adapter.test();
    }
}

三、小结

优点
更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能.

好了,今天就和小伙伴们聊到这里了,如果觉得对你有帮助记得为阿福点赞哦

版权声明:本文为weixin_44848573原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44848573/article/details/106292217