91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php模式之裝飾者模式學習

發布時間:2020-04-03 06:06:49 來源:網絡 閱讀:600 作者:香蕉拿鐵 欄目:軟件技術
<?php
//裝飾器模式主要是兩類對象--被裝飾者和裝飾器對象
//裝飾器和被裝飾者擁有一樣的超類(接口)
//外層裝飾對象重寫公共方法,并委托調用內層方法。
interface Decorate
 {
   # code...
   public function display();
 }
  
 class Person implements Decorate
 {
  
   public $name;
  
   public function __construct($name)
   {
     $this->name = $name;
     echo '我叫'.$name.'我準備出門了<br>';
   }
  
   public function display()
   {
  
     echo '我出門了<br>';
   }
 }
 /**
 *裝飾器1,和被裝飾者一樣都是屬于Decorate接口的實現
 **/
  
 class Wash implements Decorate
 {
  
   private $compact;
     
   public function __construct(Decorate $compact)
   {
     $this->compact = $compact;
       
   }
  
   public function display()
   {
     echo '我是一個裝飾器1,出門之前先換件衣服<br>';
     $this->compact->display();
   }
  
 }
/**
*裝飾器2
**/
 class Dress implements Decorate
 {
  
   private $compact;
     
   public function __construct(Decorate $compact)
   {
     $this->compact = $compact;
       
   }
  
   public function display()
   {
        echo '我是一個裝飾器2,換衣服之前,先洗把臉<br>';
     $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,把門鎖了<br>';
   }
 }
  
  
 $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()方法之前,或之后添加邏輯了。


指的一提的是,最后返回的還是一個閉包對象,所以在最后執行了一次,相當于啟動,內部就會依次聯動。



單是文字確實難以理解,后續有時間會把代碼補上。


由于作者水平有限,如有錯誤還望海涵。





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青川县| 贺兰县| 乐平市| 高尔夫| 赤壁市| 宜兰县| 抚远县| 句容市| 阿城市| 巴彦淖尔市| 南皮县| 淄博市| 襄城县| 五常市| 疏附县| 益阳市| 济宁市| 全椒县| 平乡县| 自治县| 连州市| 桐乡市| 乐安县| 棋牌| 舒城县| 石渠县| 长岭县| 和平区| 慈利县| 泸溪县| 奇台县| 永善县| 西和县| 华蓥市| 南宁市| 景德镇市| 清水县| 安西县| 仙居县| 台南县| 灵台县|