<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      責任鏈模式

      責任鏈模式

       

      責任鏈模式  雙龍物流

      亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility

       意圖

      責任鏈模式是一種行為設計模式 允許你將請求沿著處理者鏈進行發送。 收到請求后, 每個處理者均可對請求進行處理 或將其傳遞給鏈上的下個處理者

       問題

      假如你正在開發一個在線訂購系統 你希望對系統訪問進行限制 只允許認證用戶創建訂單 此外, 擁有管理權限的用戶也擁有所有訂單的完全訪問權限

      簡單規劃后 你會意識到這些檢查必須依次進行 只要接收到包含用戶憑據的請求, 應用程序就可嘗試對進入系統的用戶進行認證 但如果由于用戶憑據不正確而導致認證失敗 那就沒有必要進行后續檢查了。


      請求必須經過一系列檢查后才能由訂購系統來處理。

      在接下來的幾個月里, 你實現了后續的幾個檢查步驟。

      • 一位同事認為直接將原始數據傳遞給訂購系統存在安全隱患。 因此你新增了額外的驗證步驟來清理請求中的數據。

      • 過了一段時間 有人注意到系統無法抵御暴力密碼破解方式的攻擊。 為了防范這種情況, 你立刻添加了一個檢查步驟來過濾來自同一 IP 地址的重復錯誤請求。

      • 又有人提議你可以對包含同樣數據的重復請求返回緩存中的結果, 從而提高系統響應速度 因此, 你新增了一個檢查步驟, 確保只有沒有滿足條件的緩存結果時請求才能通過并被發送給系統


      代碼變得越來越多 也越來越混亂。

      檢查代碼本來就已經混亂不堪 而每次新增功能都會使其更加臃腫。 修改某個檢查步驟有時會影響其他的檢查步驟 最糟糕的是, 當你希望復用這些檢查步驟來保護其他系統組件時 你只能復制部分代碼, 因為這些組件只需部分而非全部的檢查步驟。

      系統會變得讓人非常費解, 而且其維護成本也會激增 你在艱難地和這些代碼共處一段時間后 有一天終于決定對整個系統進行重構

       解決方案

      與許多其他行為設計模式一樣, 責任鏈會將特定行為轉換為被稱作的獨立對象 在上述示例中, 每個檢查步驟都可被抽取為僅有單個方法的類, 并執行檢查操作。 請求及其數據則會被作為參數傳遞給該方法

      模式建議你將這些處理者連成一條鏈。 鏈上的每個處理者都有一個成員變量來保存對于下一處理者的引用。 除了處理請求外 處理者還負責沿著鏈傳遞請求。 請求會在鏈上移動, 直至所有處理者都有機會對其進行處理。

      最重要的是 處理者可以決定不再沿著鏈傳遞請求, 這可高效地取消所有后續處理步驟。

      在我們的訂購系統示例中 處理者會在進行請求處理工作后決定是否繼續沿著鏈傳遞請求。 如果請求中包含正確的數據, 所有處理者都將執行自己的主要行為, 無論該行為是身份驗證還是數據緩存。


      處理者依次排列, 組成一條鏈。

      不過還有一種稍微不同的方式 (也是更經典一種, 那就是處理者接收到請求后自行決定是否能夠對其進行處理 如果自己能夠處理 處理者就不再繼續傳遞請求。 因此在這種情況下, 每個請求要么最多有一個處理者對其進行處理 要么沒有任何處理者對其進行處理 在處理圖形用戶界面元素棧中的事件時 這種方式非常常見。

      例如, 當用戶點擊按鈕時, 按鈕產生的事件將沿著 GUI 元素鏈進行傳遞, 最開始是按鈕的容器 (如窗體或面板 直至應用程序主窗口。 鏈上第一個能處理該事件的元素會對其進行處理。 此外, 該例還有另一個值得我們關注的地方 它表明我們總能從對象樹中抽取出鏈來


      對象樹的枝干可以組成一條鏈。

      所有處理者類均實現同一接口是關鍵所在。 每個具體處理者僅關心下一個包含 execute執行方法的處理者。 這樣一來, 你就可以在運行時使用不同的處理者來創建鏈, 而無需將相關代碼與處理者的具體類進行耦合

       真實世界類比


      給技術支持打電話時你可能得應對多名接聽人員。

      最近 你剛為自己的電腦購買并安裝了一個新的硬件設備。 身為一名極客, 你顯然在電腦上安裝了多個操作系統, 所以你會試著啟動所有操作系統來確認其是否支持新的硬件設備。 Windows 檢測到了該硬件設備并對其進行了自動啟用 但是你喜愛的 Linux 系統并不支持新硬件設備。 抱著最后一點希望, 你決定撥打包裝盒上的技術支持電話。

      首先你會聽到自動回復器的機器合成語音 它提供了針對各種問題的九個常用解決方案, 但其中沒有一個與你遇到的問題相關。 過了一會兒, 機器人將你轉接到人工接聽人員處。

      這位接聽人員同樣無法提供任何具體的解決方案。 他不斷地引用手冊中冗長的內容 并不會仔細聆聽你的回應。 在第 10 次聽到 “你是否關閉計算機后重新啟動呢? 這句話后, 你要求與一位真正的工程師通話

      最后 接聽人員將你的電話轉接給了工程師, 他或許正縮在某幢辦公大樓的陰暗地下室中, 坐在他所深愛的服務器機房里 焦躁不安地期待著同一名真人交流。 工程師告訴了你新硬件設備驅動程序的下載網址, 以及如何在 Linux 系統上進行安裝。 問題終于解決了! 你掛斷了電話 滿心歡喜

       責任鏈模式結構

       
      1. 處理者 (Handler 聲明了所有具體處理者的通用接口 該接口通常僅包含單個方法用于請求處理, 但有時其還會包含一個設置鏈上下個處理者的方法。

      2. 基礎處理者 (Base Handler 是一個可選的類 你可以將所有處理者共用的樣本代碼放置在其中

        通常情況下, 該類中定義了一個保存對于下個處理者引用的成員變量 客戶端可通過將處理者傳遞給上個處理者的構造函數或設定方法來創建鏈。 該類還可以實現默認的處理行為 確定下個處理者存在后再將請求傳遞給它。

      3. 具體處理者 (Concrete Handlers 包含處理請求的實際代碼。 每個處理者接收到請求后, 都必須決定是否進行處理, 以及是否沿著鏈傳遞請求。

        處理者通常是獨立且不可變的, 需要通過構造函數一次性地獲得所有必要地數據。

      4. 客戶端 (Client 可根據程序邏輯一次性或者動態地生成鏈 值得注意的是, 請求可發送給鏈上的任意一個處理者, 而非必須是第一個處理者。

       偽代碼

      在本例中, 責任鏈模式負責為活動的 GUI 元素顯示上下文幫助信息。


      GUI 類使用組合模式生成 每個元素都鏈接到自己的容器元素。 你可隨時構建從當前元素開始的、 遍歷其所有容器的元素鏈。

      應用程序的 GUI 通常為對象樹結構 例如, 負責渲染程序主窗口的 對話框類就是對象樹的根節點。 對話框包含 面板 , 而面板可能包含其他面板, 或是 按鈕 文本框等下層元素。

      只要給一個簡單的組件指定幫助文本, 它就可顯示簡短的上下文提示。 但更復雜的組件可自定義上下文幫助文本的顯示方式, 例如顯示手冊摘錄內容或在瀏覽器中打開一個網頁。


      幫助請求如何在 GUI 對象中移動。

      當用戶將鼠標指針移動到某個元素并按下 F1鍵時 程序檢測到指針下的組件并對其發送幫助請求。 該請求不斷向上傳遞到該元素所有的容器, 直至某個元素能夠顯示幫助信息

      // 處理者接口聲明了一個創建處理者鏈的方法。還聲明了一個執行請求的方法。
      interface ComponentWithContextualHelp is
          method showHelp()
      
      
      // 簡單組件的基礎類。
      abstract class Component implements ComponentWithContextualHelp is
          field tooltipText: string
      
          // 組件容器在處理者鏈中作為“下一個”鏈接。
          protected field container: Container
      
          // 如果組件設定了幫助文字,那它將會顯示提示信息。如果組件沒有幫助文字
          // 且其容器存在,那它會將調用傳遞給容器。
          method showHelp() is
              if (tooltipText != null)
                  // 顯示提示信息。
              else
                  container.showHelp()
      
      
      // 容器可以將簡單組件和其他容器作為其子項目。鏈關系將在這里建立。該類將從
      // 其父類處繼承 showHelp(顯示幫助)的行為。
      abstract class Container extends Component is
          protected field children: array of Component
      
          method add(child) is
              children.add(child)
              child.container = this
      
      
      // 原始組件應該能夠使用幫助操作的默認實現……
      class Button extends Component is
          // ……
      
      // 但復雜組件可能會對默認實現進行重寫。如果無法以新的方式來提供幫助文字,
      // 那組件總是還能調用基礎實現的(參見 Component 類)。
      class Panel extends Container is
          field modalHelpText: string
      
          method showHelp() is
              if (modalHelpText != null)
                  // 顯示包含幫助文字的模態窗口。
              else
                  super.showHelp()
      
      // ……同上……
      class Dialog extends Container is
          field wikiPageURL: string
      
          method showHelp() is
              if (wikiPageURL != null)
                  // 打開百科幫助頁面。
              else
                  super.showHelp()
      
      
      // 客戶端代碼。
      class Application is
          // 每個程序都能以不同方式對鏈進行配置。
          method createUI() is
              dialog = new Dialog("")
              dialog.wikiPageURL = "http://"
              panel = new Panel(0, 0, 400, 800)
              panel.modalHelpText = ""
              ok = new Button(250, 760, 50, 20, "")
              ok.tooltipText = "
      
      
      
      
      主站蜘蛛池模板:
      国产激情文学亚洲区综合|
      思思99热精品在线|
      精品国产综合成人亚洲区|
      欧美交A欧美精品喷水|
      国产在线视频一区二区三区|
      日本精品aⅴ一区二区三区|
      国内综合精品午夜久久资源|
      乱码午夜-极品国产内射|
      精品一区二区免费不卡|
      日韩视频一区二区三区视频|
      国产又色又爽又黄的在线观看|
      国产女主播喷水视频在线观看|
      亚洲国产精品综合久久网络|
      亚洲av色精品一区二区|
      国产农村老太xxxxhdxx|
      国产成人啪精品视频免费网|
      亚洲精品无码你懂的|
      亚洲av日韩av永久无码电影
      |
      亚洲大成色www永久网站动图|
      久久久久国产精品熟女影院|
      成人毛片100免费观看|
      日韩人妻不卡一区二区三区|
      色婷婷久久综合中文久久一本|
      精品人妻伦九区久久aaa片69|
      无码av中文字幕久久专区|
      日韩精品中文字幕一线不卡|
      欧美 亚洲 日韩 在线综合|
      国产成人一区二区不卡|
      青青草原国产精品啪啪视频
      |
      亚洲精品无码日韩国产不卡av|
      农民人伦一区二区三区|
      亚洲区综合区小说区激情区|
      久久一日本道色综合久久|
      野外做受三级视频|
      аⅴ天堂中文在线网|
      AV老司机色爱区综合|
      日韩精品国产另类专区|
      亚洲精品一二三四区|
      国产午夜精品福利免费不|
      国产亚洲精品俞拍视频|
      老司机免费的精品视频|