php模式之装饰者模式学习
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,
千家信息网最后更新 2026年10月31日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安全错误
数据库的锁怎样保障安全
互联网科技园
什么是科技互联网
中国互联网科技工作委员会毛军
互联网最新的科技有限公司
易互联网科技有限公司
互联网 科技创新
上海致骋互联网科技
米客互联网科技
互联网科技的未来发展
互联网科技美容
玖二柒互联网科技公司待遇
移动互联网年度科技创新
消费医药和互联网科技
本届互联网博览会上的黑科技
东营紫格互联网科技
广州燕处互联网科技有限公司
济南小医互联网科技有限公司招聘
容联科技互联网电商
互联网科技收购价值
美国五大互联网科技公司市值多少
涨乐互联网科技
中国互联网科技发展
江苏南京365互联网科技
哈尔滨新华互联网科技学院
华夏互联网科技业
和信科技工业互联网
江阴互联网智能科技产品进口
互联网行业科技股
抖集互联网科技技术咨询
广西泛欧互联网科技有限公司