设为首页 收藏本站
查看: 4162|回复: 0

[经验分享] PHP-中介者模式

[复制链接]

尚未签到

发表于 2017-3-30 11:27:49 | 显示全部楼层 |阅读模式
大家都在说设计模式,俺们也来插一脚解说一下。
先来中介者模式吧,大家都把设计模式将复杂了。GOF第一中介者模式为:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互。中介者模式使原有一对多的依赖变成了一对一的依赖,同事类只依赖中介者,降低了类之间的耦合。
其实说白了就是将下面的联系方式A变成了B方式而已,不仅降低类与类之间的耦合,也减少了我们维护的成本。
DSC0000.png
图1:联系方式A
DSC0001.png
图2:联系方式B
在A方式下各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改B的一个函数,你就需修改A,C,E三个类的代码,至少修改4个类,在B方式下,可以使各个对象间的耦合松散,只需关心和  Mediator (矩形)的关系,修改一个类既可以。
例子比较通俗,果农与化肥老板,中介是商场。果农如果需要化肥,直接和商场要化肥;化肥老板若需水果,同样直接和商场打交道。照惯例上和UML和代码:
DSC0002.png
1.定义抽象中介者类,就是商场的抽象,就一个sell方法
interface Mediator{
function sell($name,$number);
}

2.定义抽象同事类,咱们的抽象同事类就是一个人。。。。。。,他buy买东西,他getThings卖东西。
abstract class Human{
protected $mediator=null;
abstract public  function getThings($number);
abstract public function buy($name,$number);
public function setMediator($mediator)
{
$this->mediator = $mediator;
}
public function getMediator()
{
return $this->mediator;
}
//set/get自己去加!!
}
3.具体中介者
class ConcreteMediator implements  Mediator{
private $orchardist=null;//果农
private $boss=null;//化肥老板
public function sell($name,$number){
if($name == 'fruit'){
$fruit=$this->orchardist->getThings($number);
echo '商场从果农给你'.$fruit.'!'."\n";
return $fruit;
}
if($name == 'fertilizer'){
$fertilizer=$this->boss->getThings($number);
echo '商场从化肥老板那里给你'.$fertilizer.'!'."\n";
return $fertilizer;
}
}
//set/get自己去加!!
}
4.具体2个同事,果农和化肥老板
class Orchardist extends Human{
public function __construct($mediator){
$this->mediator=$mediator;
}
public  function getThings($number){
return $number.'水果';
}
public function buy($name,$number){
$result=$this->mediator->sell($name,$number);
echo '我们果农得到了'.$result."\n";
}
}
class Boss extends Human{
public function __construct($mediator){
$this->mediator=$mediator;
}
public  function getThings($number){
return $number.'化肥';
}
public function buy($name,$number){
$result=$this->mediator->sell($name,$number);
echo '我们化肥老板得到了'.$result."\n";
}
}

最后测试:
$mediator=new  ConcreteMediator();
$orchardist=new Orchardist($mediator);
$boss=new Boss($mediator);
$mediator->setOrchardist($orchardist);
$mediator->setBoss($boss);

$orchardist->buy('fertilizer',200);//果农买200袋化肥
$boss->buy('fruit',50);//化肥老板买50个水果
结果:
DSC0003.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-357579-1-1.html 上篇帖子: PHP中cookie的使用 下篇帖子: php实现数组的合并
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表