php模式之装饰者模式学习
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,
千家信息网最后更新 2025年12月03日php模式之装饰者模式学习
name = $name; echo '我叫'.$name.'我准备出门了
'; } public function display() { echo '我出门了
'; } } /** *装饰器1,和被装饰者一样都是属于Decorate接口的实现 **/ class Wash implements Decorate { private $compact; public function __construct(Decorate $compact) { $this->compact = $compact; } public function display() { echo '我是一个装饰器1,出门之前先换件衣服
'; $this->compact->display(); } }/***装饰器2**/ class Dress implements Decorate { private $compact; public function __construct(Decorate $compact) { $this->compact = $compact; } public function display() { echo '我是一个装饰器2,换衣服之前,先洗把脸
'; $this->compact->display(); } } /** *装饰器3 **/ class Close implements Decorate { private $compact; public function __construct(Decorate $compact) { $this->compact = $compact; } public function display() { $this->compact->display(); echo '我是装饰器3,把门锁了
'; } } $person = new Person('韩梅梅'); //开始装饰 $dress = new Dress($person); $wash = new Wash($dress); $close = new Close($wash); $close->display();
laravel中装饰器模式实现----中间件(middleware)
laravel中的实现方式可能与上面讲的不一样,但是其软件设计模式是相通的,通过对请求不断的装饰,
只是它装饰采用的是闭包传入的方式。
核心源码解析
/** * Send the given request through the middleware / router. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */protected function sendRequestThroughRouter($request){ $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); $this->bootstrap(); return (new Pipeline($this->app)) //发送请求到管道中 ->send($request) //thtough()方法可以理解成在收集该请求过程中 //的中间键数组包括基础服务的和用户自定义的 ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware) ->then($this->dispatchToRouter());}核心方法是在then() 我们接着来看then()里面的实现
/** * Run the pipeline with a final destination callback. * * @param \Closure $destination * @return mixed */public function then(Closure $destination){ $pipeline = array_reduce( array_reverse($this->pipes), $this->carry(), $this->prepareDestination($destination) //这里$this->pipes即为要通过的中间件数组,$this->carray()是一个闭包处理函数。它会 //执行当前上一次传入的闭包,同时可以决定在执行前或执行后,插入逻辑(即中间件)。 //$this->prepareDestination($destination)也是一个闭包,可以理解成没用中间件的情况 //请求过程中会执行的 ); return $pipeline($this->passable);}这里的难点和巧妙在于mixed array_reduce( array $array , callable $callback [, mixed $initial = NULL ] );
官方的说法是--array_reduce - 用回调函数迭代地将数组简化为单一的值。通俗一点讲就是以$callback遍历处理$array,每次传入的是上一次回调处理的函数和当前数组元素(是不是有点像装饰者,一层一层装饰);由于篇幅有限,具体使用和理解请参考手册。
这里比较难理解的是在传入参数上,laravel框架中传入的第一个参数---中间件对象数组 。它会使用上一次处理的结果(闭包对象$next),在根据自己的handle方法,该方法接受一个参数--$next,这样就可以在$next()方法之前,或之后添加逻辑了。
指的一提的是,最后返回的还是一个闭包对象,所以在最后执行了一次,相当于启动,内部就会依次联动。
单是文字确实难以理解,后续有时间会把代码补上。
由于作者水平有限,如有错误还望海涵。
闭包
中间件
数组
方法
处理
函数
参数
对象
上一
模式
方式
是在
有限
核心
衣服
过程
逻辑
巧妙
通俗
不断
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
光明区光纤网络技术开发分类
张家口软件开发规范
软件开发人员处罚
计算机网络技术综合测试卷2
数据库查询窗口可以循环吗
易天购软件开发者是谁
西北工业大学网络安全参考书
4子星服务器节点是独立的嘛
印度软件开发行业
公安部网络安全考试
提升服务器租用安全性
网页加入数据库的php文件
查询软件开发部的员工姓名年龄
网络技术与安全 课程
动态ip邮件服务器
wincc服务器不可用
网络安全信息通报是什么意思
数据库安全控制的目的是什么
数据库物理同步题
以色列网络安全
建立案例数据库好处
北京软件开发行业收费标准
魔兽服务器人口情况
提升服务器租用安全性
hbase数据库如何连接
陕西web服务器租用云空间
软件软件开发外包企业
服务器主机和机箱有什么区别
短信报警网络隔离服务器价格
如何做好党媒平台的网络安全