若转载教程,请注明出自SW-X框架官方文档
<?php
/**
* 设计模式之适配器模式
* 场景:接口设计
* 小黄牛
*/
header("Content-type: text/html; charset=utf-8");
/**
* 接口 - 数据库
*/
interface DataBase{
public function Connect(); // 链接数据库
public function Select(); // 查询操作
}
/**
* 实现两种数据库操作类
*/
class Mysql implements DataBase{
public function Connect(){echo '链接Mysql <br/>';} // 链接数据库
public function Select(){echo '查询Mysql <br/>';} // 查询操作
}
class Oracle implements DataBase{
public function Connect(){echo '链接Oracle <br/>';} // 链接数据库
public function Select(){echo '查询Oracle <br/>';} // 查询操作
}
/**
* 实现适配器 - 使用组件切换的模式,达到适配效果
* 注意:适配器也应该继承与 对应适配类的接口
*/
class Adapter implements DataBase{
private $DataBase; // 数据库操作的实例 - 也就是组件操作的实例
public function __construct($DataBase){
$this->DataBase = $DataBase;
}
# 根据适配器调用对应的方法
public function Connect(){$this->DataBase->Connect();}
public function Select(){$this->DataBase->Select();}
}
# 实例化适配器,并传入Mysql组件
$obj = new Adapter(new Mysql());
$obj->Connect();
$obj->Select();
# 实例化适配器,并传入Oracle组件
$obj = new Adapter(new Oracle());
$obj->Connect();
$obj->Select();
浏览器输出
链接Mysql
查询Mysql
链接Oracle
查询Oracle
适配器模式
待适配(ForeignPlayer)角色:此角色的接口规则内部的接口规则不一致,但内部需要调用该角色的方法功能。
内部接口(IPlayer)角色:这是一个抽象角色,此角色给出内部期待的接口规则。
适配器(Adapter)角色:通过在内部包装一个Adapter对象,把待适配接口转换成目标接口,此角色为适配器模式的核心角色,也是适配器模式所解决问题的关键。
使用场景
数据库实例切换
接口的版本更新
打个非常容易理解的比喻:
假设Mysql和Oracle 都是 DataBase 教出来的徒弟,所以他们会的功夫都是一样的,但两人在招式的领悟上多少有些不同;而Apapter是他们两人的大师兄,所以在境界上,他们两人会的东西,Apapter也一样会。当你拿着Mysql的实例去问Apapter的时候,他就能够耍出跟Mysql一样功夫,所以在实际应用中,你只需要访问Apapter,并将Mysql或Oracle的实例给他,Apapter就能给你实现两者之间定义的方法。
免费教程手写不易,希望能支持一下SW-X框架,(^.^)
GitHub有账号的朋友,也可以给我们一个小星星噢!
希望能够与大家共同培育出良好的Swoole生态,对Swoole有兴趣的朋友可以加我微信好友,进入SW-X框架官方交流群。
该群以Swoole生态发展交流为主,若出现争吵,攻击其他人等行为,立即剔除。
该群以Swoole生态发展交流为主,若出现争吵,攻击其他人等行为,立即剔除。
