重构思路
- 定义抽象:识别高层模块与底层模块之间的交互点,针对这些交互定义抽象接口或抽象类。这些抽象应涵盖高层模块对底层模块的核心需求操作。
- 高层依赖抽象:让高层模块依赖于这些抽象,而不是直接依赖具体的底层模块实现类。这样,高层模块只需关注抽象所定义的行为,而无需关心底层模块的具体实现细节。
- 底层实现抽象:底层模块实现上述定义的抽象接口或继承抽象类,通过这种方式,底层模块可以自由变化其具体实现,只要保持对抽象的实现一致性,就不会影响到高层模块。
通过接口和抽象类解耦的方式
- 接口方式:定义接口,包含高层模块需要的方法。底层模块实现该接口,高层模块通过接口来引用底层模块实例。
- 抽象类方式:定义抽象类,包含高层模块需要的抽象方法。底层模块继承该抽象类并实现抽象方法。高层模块通过抽象类的引用操作底层模块实例。
关键代码示例
- 接口方式
public interface DatabaseAccess {
String getData();
}
- **底层模块实现接口**:
public class MySQLDatabase implements DatabaseAccess {
@Override
public String getData() {
return "Data from MySQL";
}
}
- **高层模块依赖接口**:
public class BusinessLogic {
private DatabaseAccess databaseAccess;
public BusinessLogic(DatabaseAccess databaseAccess) {
this.databaseAccess = databaseAccess;
}
public void processData() {
String data = databaseAccess.getData();
System.out.println("Processing data: " + data);
}
}
- **测试代码**:
public class Main {
public static void main(String[] args) {
DatabaseAccess mySQLDatabase = new MySQLDatabase();
BusinessLogic businessLogic = new BusinessLogic(mySQLDatabase);
businessLogic.processData();
}
}
- 抽象类方式
public abstract class DatabaseAccess {
public abstract String getData();
}
- **底层模块继承抽象类**:
public class OracleDatabase extends DatabaseAccess {
@Override
public String getData() {
return "Data from Oracle";
}
}
- **高层模块依赖抽象类**:
public class BusinessLogic {
private DatabaseAccess databaseAccess;
public BusinessLogic(DatabaseAccess databaseAccess) {
this.databaseAccess = databaseAccess;
}
public void processData() {
String data = databaseAccess.getData();
System.out.println("Processing data: " + data);
}
}
- **测试代码**:
public class Main {
public static void main(String[] args) {
DatabaseAccess oracleDatabase = new OracleDatabase();
BusinessLogic businessLogic = new BusinessLogic(oracleDatabase);
businessLogic.processData();
}
}