适配器(Adapter)

适配器模式说明

适配器模式(Adapter) 通常也被称为转换器,当一个对象或类的接口不能匹配用户所期待的接口时,适配器就充当中间转换的角色,以达到兼容用户接口的目的,同时适配器也实现了客户端与接口的解耦,提高了组件的可复用性

充当一个适配、兼容的工作

例子

两插脚的电子设备如何使用三孔插座实现通电,开启电视384bc2771f503d58f2ae3db19049ef87.png

● Target(目标接口):客户端要使用的目标接口标准,对应本章例程中的三相插孔接口TriplePin。

● Adapter(适配器):实现了目标接口,负责适配(转换)被适配者的接口specificRequest()为目标接口request(),对应本章例程中的电视机专属适配器类TVAdapter。

● Adaptee(被适配者):被适配者的接口标准,目前不能兼容目标接口的问题接口,可以有多种实现类,对应本章例程中的两相插孔接口DualPin。

● Client(客户端):目标接口的使用者。

对象适配器/类适配器

二者的区别在于前者的Adaptee(被适配者)以接口形式出现并被Adapter(适配器)引用,而后者则以父类的角色出现并被Adapter(适配器)继承,所以前者更加灵活,后者则更为简便,适配器需要具备适配双方的基本功能,才能做到兼容,相互对接

类适配器不利于扩展,具体场景下还是具体实用性

实例代码

package com.azure.design.adapter;

/**
 * 两孔接口
 */
public interface DualPin {
    // 火、零
    public void electrify (int l, int n);
}
package com.azure.design.adapter;

/**
 * 三孔接口
 */
public interface TriplePin {
    // 火、地、零
    public void electrify (int l, int n, int e);
}
package com.azure.design.adapter;

import com.azure.design.proxy.dymaicproxy.UserService;

public class TV implements DualPin {

    @Override
    public void electrify(int l, int n) {
        System.out.print("接通火线:" + l  + ",零线:" + n + "!" );
        System.out.println("电视开了" );
    }
}
package com.azure.design.adapter;

/**
 *
 */
public class Adapter implements TriplePin{

    private DualPin dualPin;

    // 创建适配器时, 将两插设备注入
    public Adapter(DualPin dualPin) {
        this.dualPin = dualPin;
    }

    @Override
    public void electrify(int l, int n, int e) {
        // 调用三插接口的方法实际上调的时两插接口的方法
        dualPin.electrify(l, n);
    }
}
package com.azure.design.adapter;

/**
 * 电视专属适配器
 */
public class TVAdapter extends TV implements TriplePin{

    @Override
    public void electrify(int l, int n, int e) {
        super.electrify(l, n);
    }
}
package com.azure.design.adapter;

import org.junit.Test;

public class Client {

    /**
     * 对象适配器
     */
    @Test
    public void tesAdapterDemo() {
        Adapter adapter = new Adapter(new TV());
        adapter.electrify(1,0,-1);
    }

    /**
     * 专属适配器
     */
    @Test
    public void tesTVAdapterDemo() {
        TVAdapter adapter = new TVAdapter();
        adapter.electrify(1,0,-1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值