设计模式之四:适配器模式(Adapter Pattern)
????? 在軟件系統(tǒng)中,由于應用環(huán)境的變化,常常需要將“一些現(xiàn)存的對象”放在新的環(huán)境中應用,但是新環(huán)境要求的接口是這些現(xiàn)存對象所不滿足的。如果能既能利用現(xiàn)有對象的良好實現(xiàn),同時又能滿足新的應用環(huán)境所要求的接口?這就是適配器模式要解決的問題。
目的:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
下面以日志記錄程序為例子說明Adapter模式。假設我們在軟件開發(fā)中要記錄日志,包括數(shù)據(jù)庫記錄日志DatabaseLog和文本文件記錄日志W(wǎng)riteLog.現(xiàn)有日志接口為:
類圖實現(xiàn):
public abstract class Log
??? {
??????? public abstract void WriteLog();
??? }
?
??? public class DatabaseLog : Log
??? {
??????? public override void WirteLog()
??????? {
??????????? Console.WriteLine("called database log");
??????? }
??? }
??? public class FileLog : Log
??? {
??????? public override void WirteLog()
??????? {
??????????? Console.WriteLine("called File log");
?????? ?}
??? }
?
但是開發(fā)過程需要引入一個新的日志接口,但新的日志接口和以前的不一樣,該接口如下:public interface Ilog
??? {
??????? void Write();
??? }
?
由于前后兩個接口都不能修改,那么如何來適配前后兩種情況,從而使原來的對象適應新的接口呢?
其實有兩種思路:一個是類適配模式,另一個對象適配模式。類適配模式是通過類的繼承機制來實現(xiàn),而對象適配機制通過對象的組合來實現(xiàn)。
1.類適配模式類圖實現(xiàn):
?
具體實現(xiàn)為:
public class DatabaseLogAdapter : DatabaseLog, Ilog
??? {
??????? public void Write()
??????? {
?????????? this.WirteLog();
??????? }
??? }
??? public class FileLogAdapter : FileLog, Ilog
??? {
??????? public void Write()
??????? {
??????????? this.WirteLog();
??????? }
??? }
?
?
代碼實現(xiàn):
//對象適配
??? public class LogAdapter : Ilog
??? {
??????? private Log log;
??????? public LogAdapter(Log log)
??????? {
??????????? this.log = log;
??????? }
??????? public void Write()
??????? {
??????????? log.WriteLog();
??????? }
??? }
?? 上兩種適配方式,可以看出在類適配方式中,是通過類的繼承來實現(xiàn)的,同時也具有接口ILog的所有行為,這些就違背了面向對象設計原則中的類的單一職責原則,而對象適配器則是通過對象組合的方式來實現(xiàn)的,則符合面向對象的精神,所以推薦用對象適配的模式。
實現(xiàn)要點:
總結
以上是生活随笔為你收集整理的设计模式之四:适配器模式(Adapter Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUG管理系统(Mantis)迁移实录
- 下一篇: 用纯C面向过程写icefox3的代码