结构型模式-02适配器模式

本文介绍了适配器模式的概念及其实现方式,包括类适配器模式和对象适配器模式,并提供了详细的代码示例。此外,还探讨了适配器模式的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、适配器模式

1. 定义

  • 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

2. 包含的角色

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成 目标接口,让客户按目标接口的格式访问适配者。

3. 分类

3.1 类适配器模式(耦合度较高,用的少)
  • 缺点:类适配器模式违背了合成复用原则

  • 注意:类适配器是客户类有一个接口规范的情况下可用,反之不可用。

  • 举例:苹果手机用带多功能转接头的数据线进行充电

  • UML:

image-20210521181337183
3.1.1 代码
  • iphoneInterface
/**
 * iPhone充电口
 */
public interface iphoneInterface {
    public String startCharge();

    public void endCharge(String msg);
}
  • iphoneInterfaceImpl
/**
 * iPhone充电口 实现类
 */
public class iphoneInterfaceImpl implements iphoneInterface{
    @Override
    public String startCharge() {
        String str = "开始充电";
        return str;
    }

    @Override
    public void endCharge(String msg) {

            System.out.println(msg+"->结束充电");
        }

}
  • chargeInterface
/** * 多功能数据线的不同型手机接口 */public interface chargerInterface {    public String startCharge();    public void endCharge(String msg);}
  • chargeInterfaceImpl
/** * 多功能数据线的不同型手机接口 实现类 */public class chargetInterfaceImpl implements chargerInterface{    @Override    public String startCharge() {        String str = "开始插上手机,进行充电";        return str;    }    @Override    public void endCharge(String msg) {        System.out.println(msg+"->结束充电,拔下数据线");    }}
  • dateBigport
/** * 数据线的多个接口选择其中一个充电,就选择苹果接口 */public class dateBigport extends iphoneInterfaceImpl  implements chargerInterface{    @Override    public String startCharge() {        System.out.println("通过多功能接口插的");        String str = "连接苹果手机";        return str;    }    @Override    public void endCharge(String msg) {        System.out.println(msg+"拔下苹果手机");    }}
  • charger
/** * 充电器大头 */public class charger {    public String charge(chargerInterface ci){        if(ci==null){            throw new NullPointerException("没连接手机吧?");        }        return ci.startCharge();    }}
  • 测试类
public class Client {    public static void main(String[] args) {        charger ch = new charger();        System.out.println(ch.charge(new chargetInterfaceImpl()));        String msg1 = ch.charge(new dateBigport());        System.out.println(msg1);    }}
  • 测试结果
====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电=====开始插上数据线,准备充电====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电==========通过转接口进行充电====通过多功能接口插的连接苹果手机=====通过转接口进行充电====
3.2 对象适配器模式
  • UML
image-20210521183344069
3.2.1 代码
  • dateBigport
/** * 数据线的多个接口选择其中一个充电,就选择苹果接口 */public class dateBigport implements chargerInterface {//修改后的代码    private iphoneInterface iphoneii;    public dateBigport(iphoneInterface iphoneii) {        this.iphoneii = iphoneii;    }//修改后的代码    @Override    public String startCharge() {        System.out.println("通过多功能接口插的");        String str = "连接苹果手机";        return str;    }    @Override    public void endCharge(String msg) {        System.out.println(msg + "拔下苹果手机");    }}
  • 测试类
public class Client {
    public static void main(String[] args) {

        System.out.println("====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电=====");
        charger ch = new charger();
        System.out.println(ch.charge(new chargetInterfaceImpl()));
        System.out.println("====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电=====");

        System.out.println();


        System.out.println("=====通过转接口进行充电====");
        dateBigport db = new dateBigport(new iphoneInterfaceImpl());
        String msg1 = ch.charge(db);
        System.out.println(msg1);
        System.out.println("=====通过转接口进行充电====");

    }
}
3.3 应用场景
  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值