PHP設計模式(十):適配器模式

原文地址:PHP設計模式(十):適配器模式php

Introduction

PHP設計模式(七):設計模式分類中咱們提到過結構設計模式(Structural patterns),結構設計模式專一於設計對象(Object)和實例(Instance)的構建、組合過程。
結構設計模式包括下面七種設計模式:web

  1. 適配器(Adapter)編程

  2. 橋接(Bridge)設計模式

  3. 合成(Composite)架構

  4. 裝飾(Decorator)this

  5. 外部(Facade)翻譯

  6. 輕量(Flyweight)設計

  7. 代理(Proxy)代理

請無視拗口的中文翻譯。結構設計模式着重於低耦合、高複用、高可維護性、高拓展性的設計原則。code

適配器模式

適配器模式是一種利用適配器將現有的實現,適配到已有接口的設計模式,最多見的例子就是變壓器,將已有的5V輸入的電器,經過變壓器,適配到220V的電源插座。
適配器模式利用PHP設計模式(四):繼承中咱們提到過的繼承(inheritance),以及PHP設計模式(六):MVC中咱們提到過的組件(composition)來進行模式設計。
相比繼承,組件可用性高,低耦合,冗餘度低,所以推薦採用組件的模式來進行設計。

什麼時候使用適配器模式?

簡單來講,當你的實現和須要的接口,都沒法修改的時候。
例如,你須要給甲方已有的系統作標準的兼容,標準不可修改,甲方的系統也不可修改,這個時候你就須要適配器的設計模式了。
對於web編程來講,將你現有的實現,和三方庫結合起來,就須要使用適配器模式。

使用繼承的適配器模式

簡單來講,就是:

<?php
class Adapter extends YourClass implements OtherInterface
?>

仍是用前面的鯨魚和鯉魚的例子來講明如何使用適配器,假設咱們已經實現了鯨魚類和鯉魚類:

<?php
class Whale {
  public function __construct() {
    $this->name = "Whale";
  }
  public function eatFish() {
    echo "Whale eat fish.\n";
  }
}
class Carp {
  public function __construct() {
    $this->name = "Carp";
  }
  public function eatMoss() {
    echo "Carp eat moss.\n";
  }
}
?>

假設咱們如今須要建一個動物館,有eatFish()和eatMoss()接口,動物館接口以下:

<?php
interface Animal {
  function eatFish();
  function eatMoss();
}
?>

可是咱們不能修改Whale和Carp類,這裏就須要使用適配器了,建立兩個適配器:

<?php
class WhaleAdapter extends Whale implements Animal {
  public function __construct() {
    $this->name = "Whale";
  }
  public function eatMoss() {
    echo "Whale don't eat moss.\n";
  }
}
class CarpAdapter extends Carp implements Animal {
  public function __construct() {
    $this->name = "Carp";
  }
  public function eatFish() {
    echo "Carp don't eat moss.\n";
  }
}
?>

而後是調用代碼:

<?php
$whaleAdapter = new WhaleAdapter();
$whaleAdapter->eatFish();
$whaleAdapter->eatMoss();
$carpAdapter = new CarpAdapter();
$carpAdapter->eatMoss();
$carpAdapter->eatFish();
?>

運行一下:

Whale eat fish.
Whale don't eat moss.
Carp eat moss.
Carp don't eat moss.

使用組件的適配器模式

仍是使用鯨魚和鯉魚的例子,不過這個時候適配器變成了:

<?php
class WhaleAdapter implements Animal {
  public function __construct() {
    $this->name = "Whale";
    $this->whale = new Whale();
  }
  public function eatFish() {
    $this->whale->eatFish();
  }
  public function eatMoss() {
    echo "Whale don't eat moss.\n";
  }
}
class CarpAdapter implements Animal {
  public function __construct() {
    $this->name = "Carp";
    $this->carp = new Carp();
  }
  public function eatFish() {
    echo "Carp don't eat moss.\n";
  }
  public function eatMoss() {
    $this->carp->eatMoss();
  }
}
?>

其餘的地方和使用繼承的適配器模式同樣,這裏再也不贅述。

Summary

適配器模式在不修改現有代碼的基礎上,保留了架構。使用繼承的適配器和使用組件的適配器各有利弊,繼承的類冗餘度/空間複雜度偏高,組件的調用棧/時間複雜度偏高,應該結合實際狀況選擇。

(本文出自csprojectedu.com,轉載請註明出處)

相關文章
相關標籤/搜索