1.简介
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
2.
源(Adaptee)角色:需要进行适配的接口
目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的
适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类
// 适配器模式 // 1. 源角色 abstract class Toy{ public abstract function openMonth(); public abstract function closeMonth(); } class Dog extends Toy{ public function openMonth(){ echo "Dog open Mouth\n"; } public function closeMonth(){ echo "Dog close Mouth \n"; } } class Cat extends Toy{ public function openMonth(){ echo ‘Cat open Mouth \n ‘; } public function closeMonth(){ echo ‘Cat close Mouth\n‘; } } // 2.目标角色:红枣公司 interface RedTarget{ public function doMouthOpen(); public function doMouthClose(); } // 目标角色:绿枣公司 interface GreenTarget{ public function operateMouth( $type = 0 ); } // 3 适配器角色:红枣公司 class RedAdapter implements RedTarget{ private $adaptee; public function __construct( Toy $adaptee ){ $this->adaptee = $adaptee; } public function doMouthOpen(){ $this->adaptee->openMonth(); } public function doMouthClose(){ $this->adaptee->closeMonth(); } } // 绿枣公司 class GreenAdapter implements GreenTarget{ private $adaptee; public function __construct(){ $this->adaptee = $adaptee; } public function operateMouth( $type = 0 ){ if($type){ $this->adaptee->openMouth(); }else { $this->adaptee->closeMouth(); } } } $adaptee_dog = new Dog(); $adapter_red = new RedAdapter( $adaptee_dog ); $adapter_red->doMouthOpen(); $adapter_red->doMouthClose();
笔记:1.开闭原则:一个类创建后,内部不可修改,对外可以扩展。