适配器模式Adapt

一 概述

例子:墙上的插座为三孔接口,但是很多家电都是双孔标准,这个时候就需要一个适配器,让双孔的家电通过适配器后也可以接入三孔接口的插座;

两种适配器

  • 类适配器
  • 对象适配器

二 使用示例

对象适配器

package cn.http.test;

/**
 * 三孔插座
 *
 * @author:wjm
 * @date:2020/6/16 17:10
 */
public interface TriplePin {
    /**
     * 参数分别为火线live,零线null,地线earth
     *
     * @param l
     * @param n
     * @param e
     */
    void electrify(int l, int n, int e);
}
package cn.http.test;

/**
 * 双孔插座
 *
 * @author:wjm
 * @date:2020/6/16 17:10
 */
public interface DualPin {
    /**
     * 参数分别为火线live,零线null
     *
     * @param l
     * @param n
     */
    void electrify(int l, int n);
}
package cn.http.test;

/**
 * 使用双孔插座的电视
 *
 * @author:wjm
 * @date:2020/6/16 17:10
 */
public class TV implements DualPin {
    /**
     * 电视实现的是双孔插座标准
     *
     * @param l
     * @param n
     */
    @Override
    public void electrify(int l, int n) {
        System.out.println("火线通电:" + l);
        System.out.println("零线通电:" + n);
    }
}
package cn.http.test;

/**
 * 对象适配器
 *
 * @author:wjm
 * @date:2020/6/16 17:10
 */
public class TVObjectAdapter implements TriplePin {

    private DualPin dualPinDevice;

    /**
     * 创建对象适配器时,需要注入实现了双孔插座的类(不仅仅是电视,其他实现了DualPin的双孔家电都可以注入)
     */
    public TVObjectAdapter(DualPin dualPinDevice) {
        this.dualPinDevice = dualPinDevice;
    }

    /**
     * 实际上调用了被适配设备的双插通电,地线e被丢弃了
     *
     * @param l
     * @param n
     * @param e
     */
    @Override
    public void electrify(int l, int n, int e) {
        dualPinDevice.electrify(l, n);
    }
}

类适配器

package cn.http.test;

/**
 * 类适配器
 *
 * @author:wjm
 * @date:2020/6/16 17:10
 */
public class TVClassAdapter extends TV implements TriplePin {
    /**
     * 类适配器无需注入其他对象(不需对象组合),通过继承TV来直接调用
     *
     * @param l
     * @param n
     * @param e
     */
    @Override
    public void electrify(int l, int n, int e) {
        super.electrify(l, n);
    }
}

具体应用

package cn.http.test;

/**
 * 具体应用
 *
 * @author:wjm
 * @date:2020/6/16 17:12
 */
public class Test {
    public static void main(String[] args) {
        //参数分别为火线live,零线null,地线earth,其中地线只是初始化,实际上并没有用到,已经通过适配器转换
        int l = 1;
        int n = 2;
        int e = 0;

        //对象适配器,需要注入具体实现类才能使用
        TVObjectAdapter TVObjectAdapter = new TVObjectAdapter(new TV());
        TVObjectAdapter.electrify(l, n, e);

        //类适配器,是专门为某一个类做的适配器,使用时无需注入具体实现类,使用起来更方便,但是别的双孔家电就没法使用了,多态特性在类适配器失效
        TVClassAdapter TVClassAdapter = new TVClassAdapter();
        TVClassAdapter.electrify(l, n, e);
    }
}

三 总结

主要关注两种适配器:

  • 对象适配器:对象适配器在使用时,需要注入实现了双孔插座的类,因此对象适配器是可以使用多态的,只要是双孔插座的类,都可以在通过注入后使用;
  • 类适配器:类适配器是专门为某一个类进行适配的适配器,使用时直接调用即可,但也就摒弃了多态;
  • 两种方式各有优劣,根据不同场景按需使用;

四 类UML图

适配器模式

源码地址:我的GitHub

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值