Facade模式

描述:Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行。Facade模式提供一个高层次的接口,使得子系统更易于使用。

意义:将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。

实现原理

工作流程图

业务中需要使用子系统的能力步骤:

1.调用子系统的访问门面,获取相关服务;
2.门面从容器中获取子系统的实例;
3.通过子系统的实例,调用其相关服务。

相关技术点分析:

1.了解facade模式。
2.调用子系统门面中不可访问的方法,会自动触发__callstatic
如 \App\Facade\Redis::set(.....);
3.static 静态延时绑定。参考:PHP后期静态绑定
4.Closure 匿名函数的运用,只有调用$closure()才开始真正起作用。
5.容器的实现。

代码实现

目录结构

\client.php 业务调用客户端:

<?php
/*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12*/
namespace App;
require_once './InitIoc.php';
require_once './Facade.php';
require_once './Facade/Redis.php';use App\Facade\Redis;Redis::set('a','b');
echo PHP_EOL;

\Facade.php 门面类

<?php
/*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 上午11:04*/
namespace App;use App\Ioc;class Facade
{public static function getFacadeRoot(){$facadeAccessor = static::getFacadeAccessor();$obj = Ioc::resolve($facadeAccessor);return $obj();}/**** @param string $name* @param array $arguments* @return mixed*/public static function __callStatic(string $name, array $arguments){$instance = static::getFacadeRoot();if (! $instance) {throw new RuntimeException('A facade root has not been set.');}return $instance->$name(...$arguments);}
}

\Facede\Redis.php 访问子系统能力的门面

<?php
/*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 上午11:07*/
namespace App\Facade;
//require_once '../Facade.php';use App\Facade;class Redis extends Facade
{public static function getFacadeAccessor():string{return 'redis';}
}

\Ioc.php服务容器

<?php
/*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 上午11:22*/
namespace App;class Ioc
{public static $instance = [];/*** 注入容器* @param string $name* @param \Closure $closure*/public static function register(string $name,\Closure $reslove){static::$instance[$name]=$reslove;}/*** 返回实例* @param string $name* @return mixed*/public static function resolve(string $name){if(static::$instance[$name] instanceof \Closure){return static::$instance[$name];}else{new $name;}}
}

\Subsystem\Redis.php 子系统服务能力类

<?php
/*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 下午12:07*/
namespace App\Subsystem;class Redis
{public static function set(){echo "Hello world";}
}

\InitIoc.php 将子系统的实例注入到容器

<?php
/*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 下午1:45*/
namespace App;
require_once './Subsystem/Redis.php';
require_once './Ioc.php';use App\Subsystem\Redis;
use App\Ioc;//将Redis连接注入容器
Ioc::register('redis',function(){return new Redis();
});

转载于:https://blog.51cto.com/phpme/2342100

浅析laravel门面原理与实现相关推荐

  1. 浅析 Laravel 底层原理:契约(Contracts)

    简介 Laravel 中的契约是指框架提供的一系列定义核心服务的接口(interface). 例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务所需的方法,而 ...

  2. 数据结构 — 浅析红黑树原理以及实现

    浅析红黑树原理以及实现 我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到平衡二叉树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找.插入 和删除在平均 和 最坏情况下都是O(log ...

  3. 光电编码器的原理及应用场合_【技术浅析】编码器原理在数控系统维修中的应用...

    摘要:本文分析了编码器工作原理及其在数控系统中的应用,  结合维修工作中常见的机床零点丢失故障案例,找出有效的解决方法.      关键词:编码器 FANUC 数控系统 参考点 目前数控机床采用日本 ...

  4. 浅析React Hooks原理

    React Hooks 简介 React Hooks 是 React 16.8 以及之后版本的产物,React Hooks 就是一堆钩子函数,不同的钩子函数提供了不同的功能,React 通过这些钩子函 ...

  5. 浅析 Servlet 执行原理

    在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础.无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效 ...

  6. 【网络安全】浅析跨域原理及如何实现跨域

    前言 我们在解决一个问题的时候应该先去了解这个问题是如何产生的,为什么会有跨域的存在呢?其实,最终的罪魁祸首都是浏览器的同源策略,浏览器的同源策略限制我们只能在相同的协议.IP地址.端口号相同,如果有 ...

  7. 浅析HTTP代理原理--转

    代理服务器是HTTP协议中一个重要的组件,发挥着重要的作用. 关于HTTP代理的文章有很多,本文不再赘述,如果不清楚的可以看一下 HTTP代理的基础知识. 本文主要介绍代理的事例,分析一个真实的案例来 ...

  8. 浅析webpack的原理

    一.前言 ​ 现在随着前端开发的复杂度和规模越来越大,鹰不能抛开工程化来独立开发,比如:react的jsx代码必须编译后才能在浏览器中使用,比如sass和less代码浏览器是不支持的.如果摒弃这些开发 ...

  9. 光纤收发器的原理及应用_浅析光纤收发器的原理与分类

    光纤收发器是一种将以太网电信号转换成光信号或光信号转换成以太网电信号的光电转换设备,通过将电信号转换为光信号在多模或单模光纤上传输,突破了电缆传输距离短的限制,使得以太网在保证高带宽传输的前提下,利用 ...

最新文章

  1. VIM技巧:显示行号
  2. VirtualBox 安装Centos 之访问虚拟机里面的服务受阻解决方案
  3. ADAS实际已涵盖20多种功能
  4. 让Redis突破内存大小的限制
  5. cubemx 读卡器_cubeMX 之 SD卡读写
  6. [深度学习]CTR模型如何加入稠密连续型|多值类别特征
  7. weakhashmap_Java WeakHashMap keySet()方法与示例
  8. QT5.9连接MySQL5.7解决QSqlDatabase: QMYSQL driver not loaded问题
  9. windows10上Eclipse运行MapReduce wordcount程序遇到的坑
  10. html5 innerhtml标签,innerHTML、outerHTML与innerText、outerText
  11. stm8s stvd 编译出错
  12. Unity网格编程篇(四) 三维温度图、热力图
  13. winedit自动换行
  14. JavaWEB10:Request、Response
  15. 苹果蓝牙耳机怎么接电话_除了苹果AirPods,真无线蓝牙耳机到底怎么选?
  16. Ubuntu 16.04 LTS安装搜狗输入法解析
  17. 在Ubuntu中使用雷电3外接显卡(eGPU)进行深度学习
  18. idea 导入halo报错
  19. 欧拉角,轴角,四元数与旋转矩阵详解
  20. 串口调试助手版本合集

热门文章

  1. hibernate、easyui、struts2整合
  2. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
  3. c# 关于WebBrowser的模拟提交InvokeMember方法是什么意思!
  4. MC新手入门(三十)------ 逻辑运算符和表达式
  5. Spring Boot 单例模式中依赖注入问题
  6. 如何解决SVN 清理失败
  7. mysql 1157_更新时出现MySQL错误1157,但是我在where子句中使用主键
  8. android 使用动态的svg资源,在Android中使用SVG作为资源 – victor
  9. maya材质sheen_maya怎样做耐磨金属质感?
  10. gbdt 回归 特征重要性 排序_gbdt、xgb、lgb、cat面经整理——from牛客