1. 程式人生 > >php 設計模式之介面卡模式

php 設計模式之介面卡模式

一、意圖
將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原來由於介面不相容而不能一起工作的那此類可以一起工作
二、介面卡模式結構圖

 

三、介面卡模式中主要角色
目標(Target)角色:定義客戶端使用的與特定領域相關的介面,這也就是我們所期待得到的
源(Adaptee)角色:需要進行適配的介面
介面卡(Adapter)角色:對Adaptee的介面與Target介面進行適配;介面卡是本模式的核心,介面卡把源介面轉換成目標介面,此角色為具體類
四、介面卡模式適用場景
1、你想使用一個已經存在的類,而它的介面不符合你的需求
2、你想建立一個可以複用的類,該類可以與其他不相關的類或不可預見的類協同工作
3、你想使用一個已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的介面。物件介面卡可以適配它的父類介面(僅限於物件介面卡)
五、類介面卡模式與物件介面卡

類介面卡:Adapter與Adaptee是繼承關係
1、用一個具體的Adapter類和Target進行匹配。結果是當我們想要一個匹配一個類以及所有它的子類時,類Adapter將不能勝任工作
2、使得Adapter可以重定義Adaptee的部分行為,因為Adapter是Adaptee的一個子集
3、僅僅引入一個物件,並不需要額外的指標以間接取得adaptee
物件介面卡:Adapter與Adaptee是委託關係
1、允許一個Adapter與多個Adaptee同時工作。Adapter也可以一次給所有的Adaptee新增功能
2、使用重定義Adaptee的行為比較困難
介面卡模式與其它模式
橋樑模式(bridge模式):橋樑模式與物件介面卡類似,但是橋樑模式的出發點不同:橋樑模式目的是將介面部分和實現部分分離,從而對它們可以較為容易也相對獨立的加以改變。而物件介面卡模式則意味著改變一個已有物件的介面
裝飾器模式(decorator模式):裝飾模式增強了其他物件的功能而同時又不改變它的介面。因此裝飾模式對應用的透明性比介面卡更好。
六、類介面卡模式PHP示例
類介面卡使用的是繼承

<?php
/**
 * 目標角色
 */
interface Target {
  
  /**
   * 源類也有的方法1
   */
  public function sampleMethod1();
  
  /**
   * 源類沒有的方法2
   */
  public function sampleMethod2();
}
  
/**
 * 源角色
 */
class Adaptee {
  
  /**
   * 源類含有的方法
   */
  public function sampleMethod1() {
    echo 'Adaptee sampleMethod1 <br />';
  }
}
  
/** * 類介面卡角色 */ class Adapter extends Adaptee implements Target { /** * 源類中沒有sampleMethod2方法,在此補充 */ public function sampleMethod2() { echo 'Adapter sampleMethod2 <br />'; } } class Client { /** * Main program. */ public static function main() { $adapter = new Adapter(); $adapter->sampleMethod1(); $adapter->sampleMethod2(); } } Client::main(); ?>

七、物件介面卡模式PHP示例
物件介面卡使用的是委派 

<?php
/**
 * 目標角色
 */
interface Target {
  
  /**
   * 源類也有的方法1
   */
  public function sampleMethod1();
  
  /**
   * 源類沒有的方法2
   */
  public function sampleMethod2();
}
  
/**
 * 源角色
 */
class Adaptee {
  
  /**
   * 源類含有的方法
   */
  public function sampleMethod1() {
    echo 'Adaptee sampleMethod1 <br />';
  }
}
  
/**
 * 類介面卡角色
 */
class Adapter implements Target {
  
  private $_adaptee;
  
  public function __construct(Adaptee $adaptee) {
    $this->_adaptee = $adaptee;
  }
  
  /**
   * 委派呼叫Adaptee的sampleMethod1方法
   */
  public function sampleMethod1() {
    $this->_adaptee->sampleMethod1();
  }
  
  /**
   * 源類中沒有sampleMethod2方法,在此補充
   */
  public function sampleMethod2() {
    echo 'Adapter sampleMethod2 <br />';
  }
  
}
  
class Client {
  
  /**
   * Main program.
   */
  public static function main() {
    $adaptee = new Adaptee();
    $adapter = new Adapter($adaptee);
    $adapter->sampleMethod1();
    $adapter->sampleMethod2();
  
  }
  
}
  
Client::main();
?>