第四节 PHP设计模式(三)—外观模式(门面模式)(Facade Pattern)

 

外观模式 (Facade Pattern): 为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。

(一)为什么需要外观模式

1,开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

2,维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

3,外观模式可以隐藏来自调用对象的复杂性。

ps: 外观模式,也叫门面模式。它多用于在多个子系统之间,作为中间层。用户通过Facade对象,直接请求工作,省去了用户调用多个子系统的复杂动作。主流框架中都有用到该模式,单例、工厂、外观、注册树这几种是支撑TP和laravel框架运行必不可少的设计模式,大家一定要仔细研究一下。

(二)外观模式UML图

(三)简单实例

 

比如说我们去医院就诊,医院有医生员工系统,有药品系统,有患者资料系统。但是我们只是在前台挂个号,就能在其他系统里都看到我们。外观系统就差不多这样。

如果没有挂号系统的话,我们就先要去医生系统通知一下医生,
然后去患者系统取一下患者资料交给医生,再去药品系统登记一下,最后到药房领药。

// 医院员工系统
class StaffSystem{
    public static function getDoctor($name)
    {
        echo __class__ . ':' . $name . '医生,有人挂你号了,请注意' . '<br/>';
        return new Doctor($name);
    }
}
// 医生
class Doctor{
    public $name;
    public function __construct($name)
    {
        $this->setName($name);
    }
    
    public function setName($name){
        $this->name = $name;
    }
    
    public function prescribe()
    {
        echo __CLASS__.':'.'开个处方给你'.'<br/>';
        return '杏花村汾酒。';
    }

    public function diagnose($data)
    {
        echo __CLASS__.':'.'根据症状来看是抑郁症'.'<br/>';
        return '抑郁症';
    }
}
// 患者系统
class PatientSystem{
    public static function getData($data)
    {
        $data = '资料:' . $data;
        echo __CLASS__ . ':' . $data . '<br/>';
        return $data;
    }
}
// 药房系统
class DrugSystem{
    public static function getMedicine($prescribe)
    {
        echo __CLASS__ . ':拿到处方:' . $prescribe . '通知药房发药' . '<br/>';
        Drugstore::setMedicine($prescribe);
    }
}
// 药店系统
class Drugstore{
    public static $medicine;

    public static function setMedicine($medicine)
    {
        return self::$medicine = $medicine;
    }
    public static function getMedicine()
    {
        echo __CLASS__.':'.self::$medicine.'<br/>';
        return self::$medicine;
    }
}
//如果没有挂号系统,我们就诊的第一步
//通知就诊医生
$doctor = StaffSystem::getDoctor('白求恩');
//患者系统拿病历资料
$data = PatientSystem::getData('出现幻觉、妄想');
//医生看病历资料、诊断,开处方
$doctor->diagnose($data);
$prescribe= $doctor->prescribe();
//医药系统登记处方
DrugSystem::getMedicine($prescribe);
//药房拿药
Drugstore::getMedicine();

//StaffSystem:白求恩医生,有人挂你号了,请注意
//PatientSystem:资料:出现幻觉、妄想
//Doctor:根据症状来看是抑郁症
//Doctor:开个处方给你
//DrugSystem:拿到处方:杏花村汾酒。通知药房发药
//Drugstore:杏花村汾酒。
echo '<br/>'.'--------有了挂号系统以后--------'.'<br/>';
// 挂号系统
class Facade{
    public static function regist($symptom, $doctor)
    {
        //通知就诊医生
        $doctor = StaffSystem::getDoctor($doctor);
        //患者系统拿病历资料
        $data = PatientSystem::getData($symptom);
        //医生看病历资料、诊断,开处方
        $doctor->diagnose($data);
        $prescribe= $doctor->prescribe();
        //医药系统登记处方
        DrugSystem::getMedicine($prescribe);
        //药房拿药
        Drugstore::getMedicine();
    }
}
Facade::regist('出现幻觉、妄想', '白求恩');

第五节 PHP设计模式(四)—注册树模式(Registry Pattern)

参考资料:

https://design-patterns.readthedocs.io

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值