适配器模式的应用场景

发布时间:2023-05-19

一、现有系统需求变更

在开发软件系统过程中,有时候由于规划不周或者客户需求改变,我们需要对现有系统进行修改或者升级。在这个过程中,适配器模式能够在不破坏现有代码的前提下,将新的代码整合到系统中。 例如,在一个旧的系统中,你需要添加一个新的数据存储组件,而这个组件的接口和原系统中已有的数据存储组件的接口不一样。这时候可以让新的组件实现与旧组件相同的接口,然后使用适配器模式将它们整合到一起。

//旧数据存储组件的接口
public interface OldDataStorage {
    public void saveData(String data);
    public String loadData();
}
//新数据存储组件的接口
public interface NewDataStorage {
    public void save(String data);
    public String load();
}
//新组件适配器
public class NewDataStorageAdapter implements OldDataStorage {
    private NewDataStorage newDataStorage;
    public NewDataStorageAdapter(NewDataStorage newDataStorage){
        this.newDataStorage = newDataStorage;
    }
    public void saveData(String data){
        newDataStorage.save(data);
    }
    public String loadData(){
        return newDataStorage.load();
    }
}

二、不兼容接口的系统整合

在面向对象编程中,接口是不同组件之间通信的唯一方式。但是有时候,我们需要整合的两个组件之间的接口不兼容,无法正常通信。使用适配器模式可以解决这个问题。 例如,在一个系统中,你需要整合两个独立运行的组件,其中一个组件使用MySQL数据库,另一个组件使用Oracle数据库。由于两个数据库的接口不同,无法直接通信。这时候可以使用适配器模式将MySQL数据库适配成Oracle数据库的接口,或者将Oracle数据库适配成MySQL数据库的接口。

//MySQL数据库接口
public interface MySQLDatabase {
    public void connectMySQL();
    public String executeMySQLCommand(String command);
}
//Oracle数据库接口
public interface OracleDatabase {
    public void connectOracle();
    public String executeOracleCommand(String command);
}
//MySQL数据库适配器
public class MySQLDatabaseAdapter implements OracleDatabase {
    private MySQLDatabase mySQLDatabase;
    public MySQLDatabaseAdapter(MySQLDatabase mySQLDatabase){
        this.mySQLDatabase = mySQLDatabase;
    }
    public void connectOracle(){
        mySQLDatabase.connectMySQL();
    }
    public String executeOracleCommand(String command){
        return mySQLDatabase.executeMySQLCommand(command);
    }
}

三、旧系统与新系统的整合

当新的系统需要与旧的系统进行整合时,由于两个系统的接口不一样,无法直接通信。使用适配器模式可以将新的系统的接口适配成旧的系统的接口。 例如,在一个旧的系统中,你需要整合一个新的支付系统,但是新的支付系统的接口与旧系统的接口不兼容。这时候可以使用适配器模式将新的支付系统的接口适配成旧的系统的接口。

//旧系统的支付接口
public interface OldPayment {
    public void payWithOrder(String orderId);
}
//新支付系统的接口
public interface NewPayment {
    public void pay(String orderId, double amount);
}
//新支付系统适配器
public class NewPaymentAdapter implements OldPayment {
    private NewPayment newPayment;
    public NewPaymentAdapter(NewPayment newPayment){
        this.newPayment = newPayment;
    }
    public void payWithOrder(String orderId){
        newPayment.pay(orderId, 0.0);
    }
}

四、提供额外功能

有时候,我们需要给一个已有的组件添加额外的功能。但是由于各种原因,不方便直接修改原有组件的代码。使用适配器模式可以在不改变原有组件的代码的情况下,给其添加额外的功能。 例如,在一个已有的日志组件中,你需要添加性能监控功能。但是由于这个组件的源代码不支持修改,无法直接给它添加监控功能。这时候可以使用适配器模式,在这个组件的基础上,添加一个新的接口,实现监控功能。

//已有日志组件的接口
public interface Log {
    public void log(String message);
}
//添加监控功能的接口
public interface PerformanceMonitor {
    public void startMonitor();
    public void endMonitor();
}
//组合Log和PerformanceMonitor的适配器
public class LogWithPerformanceMonitorAdapter implements Log, PerformanceMonitor {
    private Log log;
    private PerformanceMonitor performanceMonitor;
    public LogWithPerformanceMonitorAdapter(Log log, PerformanceMonitor performanceMonitor){
        this.log = log;
        this.performanceMonitor = performanceMonitor;
    }
    public void log(String message){
        performanceMonitor.startMonitor();
        log.log(message);
        performanceMonitor.endMonitor();
    }
    public void startMonitor(){
        //TODO: start monitoring
    }
    public void endMonitor(){
        //TODO: end monitoring
    }
}