PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解

2025-05-27 0 24

本文实例讲述了PHP设计模式中介者模式(Mediator Pattern)。分享给大家供大家参考,具体如下:

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

我们先来看用户与用户直接聊天的设计方案。

在这个方案设计的过程中,我们可以发挥想象,用户对象之间存在很强的关联性,将导致系统出现如下问题:

  1. 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理
  2. 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱
  3. 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统耦合度很高,对象操作很不灵活,扩展性差

然而,在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,但是,对于一个模块来说,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是我们使用中介者模式的动机。

来看下中介者模式包含的角色:

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

再来看下图片感受下:

PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解

来看一个完整的实例:

  1. 我们有一个CD类和一个MP3类,两个类的结构相似。
  2. 我们需要在CD类更新的时候,同步更新MP3类。
  3. 传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
  4. 中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。

代码实例如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80
<?php

class CD {

public $band = '';

public $title = '';

protected $_mediator;

public function __construct(MusicContainerMediator $mediator = NULL) {

$this->_mediator = $mediator;

}

public function save() {

//具体实现待定

var_dump($this);

}

public function changeBandName($bandname) {

if ( ! is_null($this->_mediator)) {

$this->_mediator->change($this, array("band" => $bandname));

}

$this->band = $bandname;

$this->save();

}

}

//MP3Archive类

class MP3Archive {

protected $_mediator;

public function __construct(MusicContainerMediator $mediator = NULL) {

$this->_mediator = $mediator;

}

public function save() {

//具体实现待定

var_dump($this);

}

public function changeBandName($bandname) {

if ( ! is_null($this->_mediator)) {

$this->_mediator->change($this, array("band" => $bandname));

}

$this->band = $bandname;

$this->save();

}

}

//中介者类

class MusicContainerMediator {

protected $_containers = array();

public function __construct() {

$this->_containers[] = "CD";

$this->_containers[] = "MP3Archive";

}

public function change($originalObject, $newValue) {

$title = $originalObject->title;

$band = $originalObject->band;

foreach ($this->_containers as $container) {

if ( ! ($originalObject instanceof $container)) {

$object = new $container;

$object->title = $title;

$object->band = $band;

foreach ($newValue as $key => $val) {

$object->$key = $val;

}

$object->save();

}

}

}

}

//测试实例

$titleFromDB = "Waste of a Rib";

$bandFromDB = "Never Again";

$mediator = new MusicContainerMediator();

$cd = new CD($mediator);

$cd->title = $titleFromDB;

$cd->band = $bandFromDB;

$cd->changeBandName("Maybe Once More");

运行结果:

object(MP3Archive)#3 (3) {
["_mediator":protected]=>
NULL
["title"]=>
string(14) "Waste of a Rib"
["band"]=>
string(15) "Maybe Once More"
}
object(CD)#2 (3) {
["band"]=>
string(15) "Maybe Once More"
["title"]=>
string(14) "Waste of a Rib"
["_mediator":protected]=>
object(MusicContainerMediator)#1 (1) {
["_containers":protected]=>
array(2) {
[0]=>
string(2) "CD"
[1]=>
string(10) "MP3Archive"
}
}
}

还有个实例,一起看下吧:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83
//抽象同事类,家教

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程序设计有所帮助。

原文链接:https://blog.csdn.net/luyaran/article/details/82801998

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解 https://www.kuaiidc.com/70985.html

相关文章

发表评论
暂无评论