PHP面对对象设计模式之适配器模式
适配器,也叫adapter模式,顾名思义,是用来做适配的,将不同规格的设备通过统一规格的适配器对接到你的系统中,将某个对象的接口适配为另一个对象所期望的接口,适配器模式使原本由于接口不兼容而不能一起工作的类可以一起工作。
适配器模式的原理:
将一些截然不同的函数接口封装成统一的API,最简单的例子就是DB类了。我们有mysql,mysqli,pdo等。如果我们项目中同时有这几种数据库存在,那么做一些操作是很蛋疼的,因为它们的都有各自额api.所以,这个时候,我们可以用适配器模式将3种不同的数据库封装成统一的api, 对外就是统一的方式调用。再比如我们项目中可能会用到的缓存有redis,memcache等,我们也同样可以把他们封装成统一的API接口。
适配器模式的例子:
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 | < ?php // 微博登录类 class Weibo { public function weiboLogin($username,$password){ echo $username.' is logining weibo with password '. $password. '<br>'; } } // 微信登录类 class Weixin { public function weixinLogin($config){ echo $config['username'].' is logining weixin with password '. $config['password']. '<br />'; } } // 适配器接口 interface Adapter { public function login($username, $password); } // 微博适配器 class WeiboAdapter extends Weibo implements Adapter { public function login($username, $password) { $this->weiboLogin($username, $password); } } // 微信适配器 class WeixinAdapter extends WeiXin implements Adapter { public function login($username, $password) { $this->weixinLogin(['username'=>$username, 'password'=> $password]); } } // 用户类 class User { private $adapter; public function setAdapter(Adapter $adapter) { $this->adapter = $adapter; } public function login($username, $password){ $this->adapter->login($username, $password); } } $user = new User(); // 实例化微博适配器 $adapter1 = new WeiboAdapter(); $adapter2 = new WeixinAdapter(); // 设置适配器 $user->setAdapter($adapter1); $user->login('明凯博客', '123456'); $user->setAdapter($adapter2); $user->login('明凯微信', '123456'); |
明凯博客 is logining weibo with password 123456
明凯微信 is logining weixin with password 123456
适配器模式的用处:
需要的东西在面前,但却不能用,而短时间又无法改造它,于是就想办法适配。
给接口不同的相同功能的类提供相同的接口,以使主业务运行时,可以通过调用相同的接口来完成业务,并且可以轻松切换相同功能的不同实现方式。
在项目中需要使用第三方组件时,常用到此模式。
1.数据库,mysql,mysqli,pdo
2.缓存,redis,memcache,mongodb
3.第三方登录,微博,微信,QQ
4.第三方支付,支付宝,微信,网银
PHP面对对象设计模式之注册模式 Superset Filter box报错Cannot read property ‘map’ of undefined的解决方案
学习了
文章不错非常喜欢