螃蟹学PHP设计模式之中介者模式

螃蟹学PHP设计模式之中介者模式

10.中介者模式

今天学习新的干货,螃蟹也不多扯了。昨天学的迭代器模式,就是对计数对象集合的遍历,避免直接操作原对象集合。中介者模式搞清楚后也不难,螃蟹还是用比喻更理解透彻一些。假如你要买房,需要从银行贷款,又要到房产公司办理手续,来来回回你跑的很辛苦,现在你直接交给中介,不用跑了。中介者模式就是类似中介做的事,这个和之前的委托模式不一样,委托模式是访问多个对象时的处理,对象之间是彼此独立,而中介者主要是处理对象之间的关系,不需要对象直接访问,通过第三方来访问就可以让彼此更松散,即便后期对象有修改也不会影响彼此的交互,也更易于维护。

参考项目模块:消息模块

说实话,螃蟹之前做过的项目中遇到对象关系特别复杂的还真想不起来了。不过最近做的一个项目的消息模块,倒是可以拿来改造。消息对象分别有系统管理员,普通用户,合作商家,之间都存在交互,正好可以使用中介者模式来重构。

消息抽象类:Message.class.php

<?php //消息抽象类 abstract class Message{ private $_mediator = null; public function __construct($mediator = null){ $this->_mediator = $mediator; } public function send($message){ $this->_mediator->send($message,$this); } abstract function output($message); } ?>

这里面定义了构造方法以及需要具体类实现的抽象方法,接下来定义具体对象

管理员:AdminMessage.class.php

<?php require_once('Message.class.php'); //消息具体类 class AdminMessage extends Message{ public function output($message){ echo 'Admin:'.$message.'<br>'; } } ?>

普通会员:MemberMessage.class.php

<?php require_once('Message.class.php'); //消息具体类 class MemberMessage extends Message{ public function output($message){ echo 'Member:'.$message.'<br>'; } } ?>

合作商家:ShopMessage.class.php

<?php require_once('Message.class.php'); //消息具体类 class ShopMessage extends Message{ public function output($message){ echo 'Shop:'.$message.'<br>'; } } ?>

然后编写中介者抽象类:Mediator.class.php

<?php //抽象中介者 abstract class Mediator{ abstract public function send($message,$user); } ?>

这里面只定义了一个抽象方法,对应Message的抽象类,实现对象交互,具体中介者类为:MessageMediator.class.php

<?php require('Mediator.class.php'); require_once('AdminMessage.class.php'); require_once('ShopMessage.class.php'); require_once('MemberMessage.class.php'); //消息中介者 class MessageMediator extends Mediator{ protected $_user = array(); public function __construct(){ array_push($this->_user,'AdminMessage'); array_push($this->_user,'MemberMessage'); array_push($this->_user,'ShopMessage'); } public function send($message,$user){ foreach ($this->_user as $countainer){ if($user instanceof $countainer){ $user -> output($message); } } } } ?>

这里面定义了中介者的send操作,编写测试文件:TestMediator.php

<?php require('MessageMediator.class.php'); //测试 $mediator = new MessageMediator(); $msg1 = new MemberMessage($mediator); $msg2 = new AdminMessage($mediator); $msg3 = new ShopMessage($mediator); $msg1->send("我看看"); $msg2->send("看看"); $msg3->send("可以"); ?>

输出结果

Member:我看看 Admin:看看 Shop:可以

虽然是敲了一遍代码,大致思路也有,不过感觉这里使用中介者模式还真不如用委托模式或工厂模式方便。螃蟹觉得应该是例子没写全的原因,如果在中介者对象里面直接封装多个对象的交互方法确实可以使复杂的对象关系处理得更为巧妙,这里先学习了。

转载于:https://my.oschina.net/caroltc/blog/299229

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109758.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java设计模式之行为型:状态模式

    Java设计模式之行为型:状态模式

    2021年10月4日
    43
  • JavaScript设计模式—-策略模式[通俗易懂]

    JavaScript设计模式—-策略模式[通俗易懂]声明:这个系列为阅读《JavaScript设计模式与开发实践》—-曾探@著一书的读书笔记1.策略模式的定义将不变的部分和变化的部分隔开是每个设计模式的主题。定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。2.策略模式的目的将算法的使用与算法的实现分离开来。3.传统语言中的策略模式和JavaScript中的策略模式对比3.1.传统语言中的策略模式使用策略模式来实现计算奖金v

    2022年7月12日
    16
  • 六、策略模式—旅行的交通工具 #和设计模式一起旅行#[通俗易懂]

    兵无常势,水无常形,能因敌变化而取胜者,谓之神! ——《孙子兵法》故事背景旅行开始,我和设计模式mm要去的目的地很多,去往不同目的地可以选择的交通工具也是多样的,从北京到上海,我们可以选择自驾游、乘坐飞机、高铁,甚至是骑单车等等方式!每一种交通工具到达目的的时间也不同,假如从北京到上海,乘坐飞机两个小时,高铁五个小时,自驾游3天(3*24小时),每一种交通费也不一样!假…

    2022年2月27日
    44
  • JAVA设计模式之享元模式

    解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。  在Flyweight模式中,由于要产生各种各样

    2022年3月11日
    47
  • Java设计模式之结构型:桥接模式

    Java设计模式之结构型:桥接模式

    2021年10月5日
    42
  • 抽象工厂设计模式例题_什么是抽象工厂模式

    抽象工厂设计模式例题_什么是抽象工厂模式定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。类型:创建类模式类图:抽象工厂模式与工厂方法模式的区别       抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽

    2025年7月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号