適配器模式 (Adapter Pattern)
Adapter模式也叫適配器模式,是構造型模式之一,通過Adapter模式可以改變已有類(或外部類)的接口形式。
適配器模式應用場景
在大規模的系統開發過程中,我們常常碰到諸如以下這些情況:
我們需要實現某些功能,這些功能已有還不太成熟的一個或多個外部組件,如果我們自己重新開發這些功能會花費大量時間;所以很多情況下會選擇先暫時使用外部組件,以后再考慮隨時替換。但這樣一來,會帶來一個問題,隨著對外部組件庫的替換,可能需要對引用該外部組件的源代碼進行大面積的修改,因此也極可能引入新的問題等等。如何最大限度的降低修改面呢?Adapter模式就是針對這種類似需求而提出來的。Adapter模式通過定義一個新的接口(對要實現的功能加以抽象),和一個實現該接口的Adapter(適配器)類來透明地調用外部組件。這樣替換外部組件時,最多只要修改幾個Adapter類就可以了,其他源代碼都不會受到影響。
php實例
假設我們有一個文章類已經完成了文章的列表及詳細信息展示工作:
- <?php
- class article{
- //文章列表獲取方法
- public function getLIst(){
- echo '獲取文章列表';
- }
- //根據文章id獲取文章的標題和內容
- public function getInfo($id){
- echo '根據文章id獲取文章的標題和內容';
- }
- }
- $art = new article();
- $art->getInfo(1);
由于項目的需要,現在需要這樣的一個功能。獲取文章細節時還需要獲取文章的創建時間,并需要更新文章的閱讀次數。
如果不使用適配器模式我們首先想到的時修改article類的源代碼增加這樣的功能。之所以這樣想是因為上面的例子代碼很簡單,如果他是上千行呢?如果getInfo()代碼非常復雜呢?
使用適配器模式來解決這一切吧!
- class articleAdapter{
- public $_artObj;
- public function __construct($artObj){
- $this->_artObj = $artObj;
- }
- public function getInfo($id){
- $this->_artObj->getInfo($id);
- }
- public function getInfoAndUpdate($id){
- //利用$this->_artObj查詢符合要求的文章數據并更新瀏覽次數
- echo '$this->_artObj查詢符合要求的文章數據并更新瀏覽次數';
- }
- }
- $art = new articleAdapter(new article());
- $art->getInfo(12);
- $art->getInfoAndUpdate(12);
為什么不使用繼承?
對象適配器:不是通過繼承的方式,而是通過對象組合的方式來進行處理的,我們只要學過OO的設計原則的都知道,組合相比繼承是推薦的方式。
類適配器:通過繼承的方式來實現,將舊系統的方法進行封裝。對象適配器在進行適配器之間的轉換過程中,無疑類適配器也能完成,但是依賴性會加大,并且隨著適配要求的靈活性,可能通過繼承膨脹的難以控制。
一般來說類適配器的靈活性較差,對象適配器較靈活,是我們推薦的方式,可以通過依賴注入的方式,或者是配置的方式來做。類適配器需要繼承自要適配的舊系統的類,無疑這不是一個好的辦法。
新聞熱點
疑難解答