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 63 64 65 66 67 68 69 70 71 72 73 74 |
<?php /* 一般公司都会有一些稳定的类库,服务当前的系统 此时,有一个新的需求跟类库中的功能大部分都是相同的,只有小部分不同 这个时候可能有3种解决方案 1.复制相关类,然后修改其中的一些方法,服务这个新功能 这么做,缺点显而易见,代码变的不易于管理,通用性差,代码量增多,不便于维护 2.修改相关类,用if else 做相应判断 这么做,会使代码变得丑陋,而且修改现有类之后还会波及原来的被服务对象一起改动,这样的话,上一个新功能可能还得回归测试现有功能,可能还会改错,导致现有功能出现故障,同样不便于管理 3.适配器模式 通过适配器类去适配新需求,老代码不用做修改,是较好的一种处理方法 现实生活中,也会存在类似于适配器模式的情况 比如:小明去国内旅游,住进了某宾馆,晚上要给手机充电,只要插上手机充电器即可 然后小明又去了香港旅游,住进了某宾馆,晚上要给手机充电,当小明要插手机充电的时候,发现香港的插座不能插他的充电器,还好在香港去之前,他做了攻略,问朋友借了插口转换器,此时小明将充电器插在插口转换器上,再插入插座充电 这里的插口转换器,就类似于程序中的适配器 */ class Iphone{ protected $_charger; public function __construct() { $this->_charger = '充电器'; } public function getCharger(){ return $this->_charger; } } class HotelCn{ private $_phone; public function __construct($iphone) { $this->_phone = $iphone; } public function setCharger(){ echo '国内旅馆使用:' . $this->_phone->getCharger() . '充电'; } } class HotelHkAdapter extends Iphone{ public function getCharger(){ return $this->_charger . $this->setAdapter(); } public function setAdapter(){ return '插入转换器'; } } class HotelHk{ private $_phone; public function __construct($iphone) { $this->_phone = $iphone; } public function setCharger(){ echo '香港旅馆使用:' . $this->_phone->getCharger() . '充电'; } } $phone = new Iphone(); $hotelCn = new HotelCn($phone); $hotelCn->setCharger(); echo '<br>'; $hotelHkAdapter = new HotelHkAdapter(); $hotelHk = new HotelHk($hotelHkAdapter); $hotelHk->setCharger(); //输出: //国内旅馆使用:充电器充电 //香港旅馆使用:充电器插入转换器充电 //当然这个例子有些牵强,因为香港宾馆中一般备有插口转换器 |