适配器模式

问题

N年之前已经开发并上线了一款应用,应用包括字符串格式化的功能,包括接口Formatter,TextFormatter类实现了Formatter接口将字符串中的句号转换为换行符

public interface Formatter {
    String format(String text);
}

public class TextFormatter implements Formatter {
    @Override
    public String format(String text) {
        return text.replace("。", "\n");
    }
}

 于是客户端:

public static void main(String args[]) {
    // 客户端从其他方法返回了 formatter
    String text = "a。b。c。"
    formatter.format(text);
}

N年之后对应用进行了升级,新的应用要求使用CSV格式,也就是将字符串转换为按逗号分隔。并且新功能是交由开发商实现的,于是开发商创建了StringFormatter接口和CsvFormatter实现类:

public interface StringFormatter {
    String format(String text);
}

public class CsvFormatter implements StringFormatter {
    @Override
    public String format(String text) {
        return text.replace("。", ",");
    }
}

开发商开发完成集成的时候发现和原来的应用不兼容,要处理这个问题,要么让开发商修改接口和之前的接口保持统一,要么修改之前程序的源代码,无论采用那种方式都需要修改代码,修改完之后也不符合单一职责原则和接口隔离原则。这时可以使用适配器模式。

创建适配器类实现原先的接口并重写原先的方法,在方法中调用新接口的方法。

public class Adapter implements Formatter {
    
    private StringFormatter stringFormatter;
    public Adapter(StringFormatter stringFormatter) {
        this.stringFormatter = stringFormatter;
    }

    @Override
    public String format(String text) {
        return stringFormatter.format(text);
    }
}

 这样客户端在使用时就不需要修改源代码,只需要创建适配器类就可以了:

StringFormatter stringFormatter = new CsvFormatter();
Adapter adapter = new Adapter(stringFormatter);
apapter.format("a。b。c。");

定义

定义包装类,包装不兼容的接口,使两个不兼容接口的对象可以一起工作。

需要使用的类型和提供的类型不一致,比如国内电压220V美国电压110V导致国内电器不能在美国使用,此时可以用电源适配器将110V转换为220V。

结构

  1. Target(Formatter):目标接口(原始接口/需要的接口)
  2. Adaptee(StringFormatter):需要适配的接口(新接口/不兼容的接口)
  3. Apapter:适配器类,将新接口转换为目标接口。内部有Adaptee的引用。

使用场景

  1. 应用升级时接口不兼容(本例)
  2. 引用第三方类库或接口和本地接口不兼容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值