php中介者模式

参考:https://www.phpmianshi.com/?id=145

概念

 

中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP中不是特别常用的设计模式。 

 

场景

1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

2、机场调度系统。

3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

 

优点

1、降低了类的复杂度,将一对多转化成了一对一。

2、各个类之间的解耦。

3、符合迪米特原则。

缺点

中介者会庞大,变得复杂难以维护。

 

角色    

1、中介者接口(UnitedNations):在里面定义了各个同事之间相互交互所需要的方法。

2、具体的中介者实现对象(UnitedCommit):它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。

3、同事类的定义(Country):通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,

4、具体的同事类(China):实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。

示例

<?php

//中介者接口:可以是公共的方法,如Change方法,也可以是小范围的交互方法。
//同事类定义:比如,每个具体同事类都应该知道中介者对象,也就是每个同事对象都会持有中介者对象的引用,这个功能可定义在这个类中。

//抽象国家
abstract class Country
{
    protected $mediator;

    public function __construct(UnitedNations $_mediator)
    {
        $this->mediator = $_mediator;
    }
}

//具体国家类
//美国
class USA extends Country
{
    function __construct(UnitedNations $mediator)
    {
        parent::__construct($mediator);
    }

//声明
    public function Declared($message)
    {
        $this->mediator->Declared($message, $this);
    }

//获得消息
    public function GetMessage($message)
    {
        echo "美国获得对方消息:$message<br/>";
    }
}

//中国
class China extends Country
{
    public function __construct(UnitedNations $mediator)
    {
        parent::__construct($mediator);
    }

//声明
    public function Declared($message)
    {
        $this->mediator->Declared($message, $this);
    }

//获得消息
    public function GetMessage($message)
    {
        echo "中方获得对方消息:$message<br/>";
    }
}

//抽象中介者
//抽象联合国机构
abstract class UnitedNations
{
//声明
    public abstract function Declared($message, Country $colleague);
}

//联合国机构
class UnitedCommit extends UnitedNations
{
    public $countryUsa;
    public $countryChina;

//声明
    public function Declared($message, Country $colleague)
    {
        if ($colleague == $this->countryChina) {
            $this->countryUsa->GetMessage($message);
        } else {
            $this->countryChina->GetMessage($message);
        }
    }
}




//测试代码块
$UNSC = new UnitedCommit();
$c1 = new USA($UNSC);
$c2 = new China($UNSC);
$UNSC->countryChina = $c2;
$UNSC->countryUsa = $c1;
$c1->Declared("姚明的篮球打的就是好");
$c2->Declared("谢谢。");

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值