設計模式php例項:介面卡模式
阿新 • • 發佈:2019-01-11
介面卡模式將一個類的換成客戶端需要的另一個介面,使原本不相容的介面能一起工作。一個現實中的例子,假如屋裡牆上只有兩項插口,而風扇有三個插頭,這時需要再拿一個移動插線板,插線板接入牆壁插口的一段是兩項插頭,插線板另外一段能夠提供三項插口給風扇,這時候插線板起到了一個介面卡的作用。
在應用中,介面卡模式分為類介面卡和物件介面卡。
類介面卡
類介面卡中介面卡繼承原有的Adaptee類,自己實現原類沒有的操作。
interface ITarget { function operation1(); function operation2(); } interface IAdaptee { function operation1(); } class Adaptee extends IAdaptee { public function operation1() { echo "原方法"; } } class Adapter extends Adaptee implements IAdaptee, ITarget { public function operation2() { echo "適配方法"; } } class Client { public function test() { $adapter = new Adapter(); $adapter->operation1();//原方法 $adapter->operation2();//適配方法 } }
物件配器
類介面卡使用的是繼承模式,而物件介面卡使用的是組合模式,將adaptee作為adapter的一個引用。
由於組合在耦合性上小於繼承,物件介面卡顯得更加靈活,當然它的缺點是增加程式碼量。 需要重寫adapee中的方法的數量太大的話,可以考慮在adapter中使用__call方法委託adapee取得客戶端呼叫的方法interface ITarget { function operation1(); function operation2(); } interface IAdaptee { function operation1(); } class Adaptee extends IAdaptee { public function operation1() { echo "原方法"; } } class Adapter implements ITarget { private $adaptee; public function __construct($adaptee) { $this->adaptee = $adaptee; } public function operation1() { return $this->adaptee->operation1(); } public function operation2() { echo "適配方法"; } } class Client { public function test() { $adapter = new Adapter(new Adaptee(null)); $adapter->operation1();//原方法 $adapter->operation2();//適配方法 } }
public function __call($func, $args) { if (is_callable(array($this->adaptee, $func))) { return $this->adaptee->$func($args); } trigger_error('*********', E_USER_ERROR); }