一、現有系統需求變更
在開發軟體系統過程中,有時候由於規劃不周或者客戶需求改變,我們需要對現有系統進行修改或者升級。在這個過程中,適配器模式能夠在不破壞現有代碼的前提下,將新的代碼整合到系統中。
例如,在一個舊的系統中,你需要添加一個新的數據存儲組件,而這個組件的介面和原系統中已有的數據存儲組件的介面不一樣。這時候可以讓新的組件實現與舊組件相同的介面,然後使用適配器模式將它們整合到一起。
//舊數據存儲組件的介面 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 } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/230604.html