螃蟹学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:可以



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

你可能感兴趣的:(设计模式,PHP,中介者模式)