原文地址:PHP設計模式(十):適配器模式php
在PHP設計模式(七):設計模式分類中咱們提到過結構設計模式(Structural patterns),結構設計模式專一於設計對象(Object)和實例(Instance)的構建、組合過程。
結構設計模式包括下面七種設計模式:web
適配器(Adapter)編程
橋接(Bridge)設計模式
合成(Composite)架構
裝飾(Decorator)this
外部(Facade)翻譯
輕量(Flyweight)設計
代理(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(); } } ?>
其餘的地方和使用繼承的適配器模式同樣,這裏再也不贅述。
適配器模式在不修改現有代碼的基礎上,保留了架構。使用繼承的適配器和使用組件的適配器各有利弊,繼承的類冗餘度/空間複雜度偏高,組件的調用棧/時間複雜度偏高,應該結合實際狀況選擇。
(本文出自csprojectedu.com,轉載請註明出處)