中介者模式:
  中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

模式动机:
  1.在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:
系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理。
  2.对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱。
  3.系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统耦合度很高,对象操作很不灵活,扩展性差。
  4.在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。
  5.对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。

中介者模式包含如下角色:
  Mediator: 抽象中介者,在里面定义了各个同事之间相互交互所需要的方法。
  ConcreteMediator: 具体中介者,它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。
  Colleague:抽象同事类,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能
  ConcreteColleague:具体同事类,实现自己的业务,需要与其他同事对象交互,就通知中介对象,中介对象会负责后续的交互

UML类图:

  

//代码实现:

header("Content-type:text/html;Charset=utf-8");
//抽象同事类,家教
abstract class Tutor{
protected $message; //个人信息
protected $mediator; //为家教服务的中介机构
function __construct($message,Mediator $mediator){
$this->message = $message;
$this->mediator = $mediator;
}
//获取个人信息
function getMessage(){
return $this->message;
}
//找学生
abstract function findStudent();
}
//具体同事类,大学生家教
class UndergraduateTutor extends Tutor{
//家教类型
public $type = "UndergraduateTutor"; function __construct($message,Mediator $mediator){
parent::__construct($message,$mediator);
}
//找学生,让中介机构代为寻找
function findStudent(){
$this->mediator->matchStudent($this);
}
}
//具体同事类,高中生家教
class SeniorStudentTutor extends Tutor{
//家教类型
public $type = "SeniorStudentTutor"; function __construct($message,Mediator $mediator){
parent::__construct($message,$mediator);
}
//找学生,让中介机构代为寻找
function findStudent(){
$this->mediator->matchStudent($this);
}
}
//具体同事类,初中生家教
class MiddleStudentTutor extends Tutor{
//家教类型
public $type = "MiddleStudentTutor"; function __construct($message,Mediator $mediator){
parent::__construct($message,$mediator);
}
//找学生,让中介机构代为寻找
function findStudent(){
$this->mediator->matchStudent($this);
}
} //抽象中介类
abstract class AbstractMediator{
abstract function matchStudent(Tutor $tutor);
}
//具体中介类,为家教匹配合适的学生
class Mediator extends AbstractMediator{
//定义其服务的所有家教,不在范围内的不服务
private $serveObject = array("UndergraduateTutor","SeniorStudentTutor","MiddleStudentTutor");
//匹配学生
function matchStudent(Tutor $tutor){
for($i=0;$i<count($this->serveObject);$i++){
if($tutor->type == $this->serveObject[$i]){
$message = $tutor->getMessage();
echo "该家教个人信息为".print_r($message)."<br/>将为其匹配合适的学生";
break;
}
}
if($i>=count($this->serveObject)){
echo "该家教不在我中介机构服务范围内";
}
}
} //测试
$mediator = new Mediator();
$undergraduateTutor = new UndergraduateTutor(array("name"=>"张三","age"=>22),$mediator);
$undergraduateTutor->findStudent();
//结果:该家教个人信息为 Array ( [name] => 张三 [age] => 22 ),将为其匹配合适的学生

中介者模式和php实现的更多相关文章

  1. 23种设计模式--中介者模式-Mediator Pattern

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  2. MediatorPattern(中介者模式)

    /** * 中介者模式 * @author TMAC-J * 研究了这么多设计模式,觉得无非就是几点: * 1.若两个类有耦合关系,设立一个中间类,处理两个类的关系,把两个类的耦合降低 * 2.面向接 ...

  3. C#设计模式-中介者模式

    在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 一. 中介者(Mediator)模式 从 ...

  4. php实现设计模式之 中介者模式

    <?php /* * 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ /* * 以一个同学qq群为例说明, ...

  5. 轻松掌握:JavaScript代理模式、中介者模式

    代理模式.中介者模式 代理模式 在面向对象设计中,有一个单一职责原则,指就一个类(对象.函数)而言,应该仅有一个引起它变化的原因.如果一个对象承担了过多的职责,就意味着它将变得巨大,引起它变化的原因就 ...

  6. java设计模式之中介者模式

    中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式UML图 中介者模式代码 package com ...

  7. 中介者模式(Mediator Pattern)

    定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. Mediator:中介者接口.在里面定义了各个同事之间相互交互所 ...

  8. C++设计模式-Mediator中介者模式

    Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...

  9. JAVA 设计模式 中介者模式

    用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...

  10. (七)中介者模式-C++实现

    用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其解耦合松散而且可以独立地改变他们之间的交互. 中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含, ...

随机推荐

  1. 【运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

    一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffm ...

  2. QT子窗口及停靠实现

    Demo的效果 头文件中的变量声明 //退出动作 QAction* exit; //菜单栏菜单 QMenu* filemenu; QMenu* actiona; //在状态栏的标签控件 QLabel* ...

  3. 2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)

    B. 腾讯益智小游戏—矩形面积交(简单) 1000ms 262144K   腾讯游戏开发了一款全新的编程类益智小游戏,最新推出的一个小游戏题目是关于矩形面积交的.聪明的你能解出来吗?看下面的题目接招吧 ...

  4. FZU - 2109 Mountain Number 数位dp

    Mountain Number One integer number x is called "Mountain Number" if: (1) x>0 and x is a ...

  5. unity5 manifest

    https://www.cnblogs.com/lancidie/p/5878789.html 之前曾经写了一篇博客介绍Unity5的AssetBundle,结果似乎很受关注.不过似乎很多人看了之后都 ...

  6. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  7. 2014-11-2 NOIP模拟赛1

    Noip2009 团结模拟赛如题目理解困难,请自行阅读或参考样例.内存限制均为 256MB,时间限制均为 1s.出题人不会 故意 在题目中设置陷阱,但请自己注意程序的正确性.IO 文件名(.in/.o ...

  8. Java获取上周,本周,本月,本年,开始结束时间 。日期工具类

    由于获取日期经常会使用到,所有我自己写了一个工具类 1.基本上能用上的都写出来了,包括:1)获取当天的开始时间 2)获取当天的结束时间 3)获取昨天的开始时间 4)获取昨天的结束时间 5)获取明天的开 ...

  9. shell学习(10)- if的使用

    在写Linux脚本的时候,经常会用到判断,这篇主要讲if的具体使用. if用法: if [ ] ;then command elif [ ] ;then command else command fi ...

  10. Python面向对象之类和实例

    1.类的定义 定义是用过class关键字 class Student(object): pass class 后面紧接着是类名,即Student,类名通常是大写开头的单词, 紧接着是(object), ...