在應用程式中,你或許會使用一個文件的程式碼庫,然而,我們常常要增加新的功能,這些功能要求使用不同的方式使用現有的物件。可能新功能只是需要一個不同的名字,也可能是新功能需要與原有的物件稍有不同的行為。
針對上述問題,採用適配器模式是個很好的解決方案。使用適配器模式建立另一個物件,這個Adapter物件充當了原始應用與新功能之間的中介。適配器設計模式只是將某個物件的介面適配為另一個物件所期望的介面。
程式碼範例:
class errorObject{ private $_error; public function __construct($error){ $this->_error = $error; } public function getError(){ return $this->_error; } } class logToConsole{ private $_errorObject; public function __construct($errorObject){ $this->_errorObject = $errorObject; } public function write(){ fwrite(STDERR, $this->_errorObject->getError()); } } $error = new errorObject("404:Not Found"); $log = new logToConsole($error); $log->write();
class logToCSV{ const CSV_LOCATION = "log.csv"; private $_errorObject; public function __construct($errorObject){ $this->_errorObject = $errorObject; } public function write(){ $line = $this->_errorObject->getErrorNumber(); $line .= ','; $line .= $this->_errorObject->getErrorText(); $line .= '\n'; file_put_contents(self::CSV_LOCATION, $line, FILE_APPEND); } }
● 建立現有程式碼庫的errorObject類別;
● 建立一個Adapter類別;
考慮到保持這些公共介面標準性的需求,因此建立一個Adapter物件是最佳的解決方案。
新建立的適配器物件中必須存在現有errorObject的功能性,而且,getErrorNumber()和getErrorText()方法必須有效。
class logToCSVAdapter extends errorObject{ private $_errorNumber, $_errorText; public function __construct($error){ parent::__construct($error); $parts = explode(':', $this->getError()); $this->_errorNumber = $parts[0]; $this->_errorText = $parts[1]; } public function getErrorNumber(){ return $this->_errorNumber; } public function getErrorText(){ return $this->_errorText; } } $error = new logToCSVAdapter("404:Not Found"); $log = new logToCSV($error); $log->write();
適配器模式一般使用場景:
● 資料庫驅動(可查看各框架的驅動部分源碼)
● webservices(在多個不同的webservices中,使用適配器)
以上就介紹了PHP設計模式-轉接器模式Adapter,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。
🎜 🎜