适配器模式是一种很简单的软件设计模式,它允许将现有的类(方法)用作另一个接口.它通常用于使现有类(方法)与其他类(方法)一起工作而无需修改其源码.
适配器模式看起和装饰者模式、代理模式看起来很像.但它们在设计目的上还是有不同的:
- 适配器模式主要是用来解决两个已有接口之间不匹配的问题,它不考虑这些接口具体的实现,也不考虑它们将如何演化.适配器不需要改变已有的接口,就能够使它们协同作用.
- 装饰者模式和代理模式也不会改变原有对象的接口,但装饰者模式的作用是为了给对象增加功能.代理模式是为了控制对象的访问,通常也只包装一次.
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
interface Lion { public function roar(); }
class AfricanLion implements Lion { public function roar() { } }
class AsianLion implements Lion { public function roar() { } }
class Hunter { public function hunt(Lion $lion) { $lion->roar(); } }
class WildDog { public function bark() { } }
class WildDogAdapter implements Lion { protected $dog;
public function __construct(WildDog $dog) { $this->dog = $dog; }
public function roar() { $this->dog->bark(); } }
$wildDog = new WildDog(); $wildDogAdapter = new WildDogAdapter($wildDog);
$hunter = new Hunter(); $hunter->hunt($wildDogAdapter);
|