文档章节

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

行走的螃蟹
 行走的螃蟹
发布于 2014/08/08 11:55
字数 796
阅读 66
收藏 0

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:可以



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

© 著作权归作者所有

行走的螃蟹

行走的螃蟹

粉丝 33
博文 48
码字总数 23634
作品 0
杭州
程序员
私信 提问
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
2018/07/13
0
0
《JavaScript设计模式与开发实践》模式篇(11)—— 中介者模式

中介者模式的作用就是解除对象与对象之间的紧耦合关系。增加一个中介者对象后,所有的 相关对象都通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知 中介者对象即...

嗨呀豆豆呢
2018/12/23
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
2018/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GMTC2019|闲鱼-基于Flutter的架构演进与创新

作者:闲鱼技术-宗心 2012年应届毕业加入阿里巴巴,主导了闲鱼基于Flutter的新混合架构,同时推进了Flutter在闲鱼各业务线的落地。未来将持续关注终端技术的演变及趋势 Flutter的优势与挑战 ...

阿里云云栖社区
25分钟前
2
0
迪蒙人工智能共享停车吸引国际关注

  近来,华为创始人任正非多次提及人工智能。即便在华为生死攸关的关键时刻,任正非依旧不忘强调教育的重要性,“如果不重视教育,实际上我们会重返贫穷的,因为这个社会,最终是要走向人工智能的...

琴殇的
26分钟前
0
0
iOS开发之EventKitUI框架的应用

iOS开发之EventKitUI框架的应用 前面博客,有介绍EventKit这个框架的使用,使用EventKit可以与系统的日历和提醒应用进行交互,读写用户的日程事件。EventKitUI,顾名思义,其实基于EventKit框...

珲少
34分钟前
0
0
从MySQL源码看其网络IO模型

从MySQL源码看其网络IO模型 前言 MySQL是当今最流行的开源数据库,阅读其源码是一件大有裨益的事情(虽然其代码感觉比较凌乱)。而笔者阅读一个Server源码的习惯就是先从其网络IO模型看起。于是...

无毁的湖光-Al
35分钟前
0
0
WebService学习笔记

什么是Web Services? Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self-contained)并可自我描述 Web Services 可通过使用UDDI来发现 Web Serv...

榴莲黑芝麻糊
51分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部