index.php
<?php
//適配器模式
//適配器模式只是將某個對象的接口適配為另一個對象所期望的接口
//PHP適配器模式原理,先創建目標實現方法,然后通過適配器類來連接原功能和目標方法,來實現功能的擴展.
function __autoload($filename){
include_once 'class/'.$filename.'.class.php';
}
/*
* 原來的功能中只有輸出錯誤到控制臺,但是后來要求增加一個輸出錯誤到csv中,方便記錄,在不更改基類的情況加,通過適配器模式,繼承原來得錯誤類,
* 并且擴展到適配器中,更改代碼,實現輸出到csv中.而且也不影響原來輸出到控制臺中.實現功能的擴展.
*/
//注釋代碼模仿原來的錯誤輸出功能
//$error=new errorObject("404:Not Found");
// $log=new logToConsole($error);
// $log->write();
//【主要角色】
//目標(Target)角色:定義客戶端使用的與特定領域相關的接口,這也就是我們所期待得到的
//源(Adaptee)角色:需要進行適配的接口
//適配器(Adapter)角色:對Adaptee的接口與Target接口進行適配;適配器是本模式的核心,適配器把源接口轉換成目標接口,此角色為具體類
//使用場景
//1、你想使用一個已經存在的類,而它的接口不符合你的需求
//2、你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類協同工作
//3、你想使用一個已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口(僅限于對象適配器)
//以下為增加新的功能
$error=new logToCSVAdapter("404:Not Found");
$log=new logToCSV($error);
$log->write();
?>原始功能類
errorObject.class.php
<?php
/*
* 錯誤基類
*/
class errorObject{
private $_error;
function __construct($error){
$this->_error=$error;
}
function getError(){
return $this->_error;
}
}
?>logToConsole.class.php
<?php
/*
* 輸出到控制臺,原始錯誤執行代碼
*/
class logToConsole{
private $_errorObject;
function __construct($o){
$this->_errorObject=$o;
}
function write(){
fwrite(STDERR, $this->_errorObject->getError());
}
}
?>以上就是原來的功能,將指定的錯誤輸出到控制臺顯示出來.現在的需求是擴展一個寫入CSV文件中得功能.在不改變原來的功能的情況下.擴展功能
logToCSV.class.php
<?php
/*
* 輸出錯誤到csv文件
*/
class logToCSV{
const CSV_LOCATION='log.csv';
private $_errorObject;
function __construct($o){
$this->_errorObject=$o;
}
function write(){
$line=$this->_errorObject->getErrorNumber();
$line.=',';
$line.=$this->_errorObject->getErrorText();
$line.="\n";
file_put_contents(self::CSV_LOCATION, $line,FILE_APPEND);
}
}
?>接下來要做的就是將新得logToCSV方法和原來寫得errorObject連接起來使用,兩種方法,可以更改原來得errorObject類,或者是使用適配器模式,新增一個基類,來重寫原來的功能
logToCSVAdapter.class.php
<?php
/*
* 擴展錯誤類,并且增加新的功能來支持logToCSV類中的方法
*/
class logToCSVAdapter extends errorObject{
private $_errorNumber,$_errorText;
function __construct($error){
//繼承父類的初始化.并且增加新的方法.
parent::__construct($error);
$parts=explode(":", $error);
$this->_errorNumber=$parts[0];
$this->_errorText=$parts[1];
}
function getErrorNumber(){
return $this->_errorNumber;
}
function getErrorText(){
return $this->_errorText;
}
}
?>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。