若转载教程,请注明出自SW-X框架官方文档1

    1. <?php
    2. /**
    3. * 设计模式之中介者模式
    4. * 场景:使用中介类,为多个类之间进行信息交互,将交互流程解耦
    5. * 小黄牛
    6. */
    7. header("Content-type: text/html; charset=utf-8");
    8. /**
    9. * 抽象 中介者类
    10. */
    11. abstract class Department{
    12. /**
    13. * 发送内容
    14. * $message 内容
    15. * $Colleague 同事实例
    16. */
    17. public abstract function Declared($Message, $Colleague);
    18. }
    19. /**
    20. * 创建一个 - 技术部部门
    21. */
    22. class Technical extends Department{
    23. public $CountryChen; // 小陈
    24. public $CountryLin; // 小林
    25. # 发送消息
    26. public function Declared($Message, $Colleague) {
    27. # 小陈的话是要传给小林的
    28. if($Colleague == $this->CountryChen){
    29. $this->CountryLin->GetMessage($Message);
    30. }
    31. else {
    32. $this->CountryChen->GetMessage($Message);
    33. }
    34. }
    35. }
    36. /**
    37. * 抽象 同事类
    38. */
    39. abstract class Colleague{
    40. protected $Mediator; // 中介者实例
    41. # 获得中介者实例
    42. public function __construct($Mediator){
    43. $this->Mediator = $Mediator;
    44. }
    45. }
    46. /**
    47. * 创建一个同事 - 小陈
    48. */
    49. class Chen extends Colleague{
    50. public function __construct($Mediator){
    51. parent::__construct($Mediator); // 调用父类构造方法
    52. }
    53. # 发送消息
    54. public function Declared($Message){
    55. $this->Mediator->Declared($Message, $this);
    56. }
    57. # 获得消息
    58. public function GetMessage($Message){
    59. echo "小陈获得对方消息:{$Message}<br/>";
    60. }
    61. }
    62. /**
    63. * 创建一个同事 - 小林
    64. */
    65. class Lin extends Colleague{
    66. public function __construct($Mediator){
    67. parent::__construct($Mediator); // 调用父类构造方法
    68. }
    69. # 发送消息
    70. public function Declared($Message){
    71. $this->Mediator->Declared($Message, $this);
    72. }
    73. # 获得消息
    74. public function GetMessage($Message){
    75. echo "小林获得对方消息:{$Message}<br/>";
    76. }
    77. }
    78. # 生成中介者实例
    79. $Men = new Technical();
    80. # 实例化同事 - 小陈、小林
    81. $A = new Chen($Men);
    82. $B = new Lin($Men);
    83. $Men->CountryChen = $B; // 小陈要对小林说话
    84. $Men->CountryLin = $A; // 小林要对小陈说话
    85. $A->Declared("周经理让你过去他办公室一趟!");
    86. $B->Declared("好的,我现在就过去。");
    87. /**
    88. * 说话的顺序是,小陈让小林过去经理办公室,所以逻辑是,小陈说的话被小林获得,小林说的话被小陈获得,得出以下结果:
    89. * 小林获得对方消息:周经理让你过去他办公室一趟!
    90. * 小陈获得对方消息:好的,我现在就过去。
    91. */

    浏览器输出

    1. 小林获得对方消息:周经理让你过去他办公室一趟!
    2. 小陈获得对方消息:好的,我现在就过去。

    中介者模式

    1. 中介者接口(UnitedNations):在里面定义了各个同事之间相互交互所需要的方法。
    2. 具体的中介者实现对象(UnitedCommit):它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。
    3. 同事类的定义(Country):通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,
    4. 具体的同事类(China):实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。

    使用场景

    1. 1、如果一组对象之间的通信方式比较复杂,导致相互依赖,结构混乱,可以采用中介者模式
    2. 2、如果一个对象引用很多对象,并且跟这些对象交互,导致难以复用该对象