读了《设计模式之蝉》之适配器模式后的总结。
C适配器模式的定义: onvert the interface of a class into another interface clients expect.Adapter lets classes work togeher that couldn’t otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无发在一起工作的两个类能够在一起工作)
类适配器 原有公司的内部员工形象有这么一个接口(target)
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 <?php interface IuserInfo { public function getUserName () ; public function getHomeAdress () ; public function getMobileNumber () ; public function getOfficeTelNumber () ; public function getJobPosition () ; public function getHomeNumber () ; } public class UserInfo implements IuserInfo { public function getUserName () { echo "名字是...." }; public function getHomeAdress () { echo "家庭住址是...." }; public function getMobileNumber () { echo "手机号码是...." }; public function getOfficeTelNumber () { echo "办公室号码是..." }; public function getHomeNumber () { echo "家里的号码是..." }; public function getJobPosition () { echo "办公室位置式..." }; } public class clients { public main function () { $user = new UserInfo(); $user->getUserName(); } }
一切看上去都没有什么问题,但是可能处于某种原因,公司需要从其他公司租用的员工的信息。而其他公司租用的员工信息的接口是这个样子的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php interface IouterUserInfo(){ public function userNumber () ; public function userAddress () ; } public class OuterUser implements IouterUserInfo { public function userNumber () { $telnumber = ['moblie_number' => '135...' , 'office_mobile_number' =>'001-12..' , 'home_tel_number' => '002-22' ]; return $telnumber; } public function baseInfo () { $info = ['name' => 'steve' , 'office_address' => '办公室位置...' , 'home_address' => '家的位置是...' ]; return $info; } }
这和我们原先的接口完全不同,我们希望还是希望以自己接口设计去获取信息,因为这样就不需要大修改原先已经写好的客户端类。我们这里就可以用到适配器模式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php public class OuterUserInfo extends OuterUser implements UserInfo { public function getUserName () { echo $this ->baseInfo()['name' ]; }; public function getHomeAdress () { }; public function getMobileNumber () { }; public function getOfficeTelNumber () { }; public function getHomeNumber () { }; public function getJobPosition () { }; } public class clients { public main function () { $user = new OuterUserInfo(); $user->getUserName(); } }
对象适配器 如果是多个不同的接口则可以用对象适配器 对象适配器和类适配器的不同就是,对象适配器是把对象注入到适配器内部而不是通过继承直接使用。假如我们把IouterUserInfo一分为二,mobile归IouterUserMobile(通讯录),IouterUserInfo接口则是基本信息(姓名和地址)。那么类适配器是不能继承两个类的,所以采用对象适配器来解决。
1 2 3 4 5 6 7 8 9 <?php public class OuterUserInfo implements UserInfo { private $outerUserMobile; private $outerUserInfo; public function __construct (OuterUserInfo $outrUserInfo,OuterUserMoblie $outerUserMobile) { $this ->outerUserMobile = $outerUserMobile; $this ->outerUserInfo = $outerUserInfo; } }