• <em id="52tge"><object id="52tge"><blockquote id="52tge"></blockquote></object></em>

  • <progress id="52tge"></progress>
      
      
      <tbody id="52tge"><pre id="52tge"></pre></tbody>
      <em id="52tge"></em>
      <li id="52tge"><acronym id="52tge"><u id="52tge"></u></acronym></li>

      <nav id="52tge"><sub id="52tge"><noframes id="52tge"></noframes></sub></nav>

      網站地圖 | RSS訂閱 老鐵博客 - 上海SEO優化|上海網站建設|蜘蛛池出租|站群代搭建
      你的位置:首頁 ? 前端腳本 ? 正文

      策略模式,策略模式應用場景

      2020-3-13 14:47:32 | 作者:老鐵SEO | 0個評論 | 人瀏覽

        1.Petshop中策略模式的應用


        至于在程序中的應用,我也是個新手,不知道何時需要這種模式,可以參考下petshop中的策略模式,理解下在真實項目中如何使用。我對petshop中策略模式的理解就是里面處理訂單時可能有同步和異步插入數據兩種方式,具體用那種方式直接在配置文件中修改即可。


        看文字不如看圖片,自己畫了畫UML圖,不會用工具但是意思差不多。


        這是IBLLStrategy類庫中的接口IBLLStrage,為了同步異步插入訂單的實現,如果有新的訂單插入方式,可以繼承此接口這兩個類是處理同步異步的訂單類。


        繼承于IBLLStrage,分別實現自己的插入方法。在BLL層中的order類中


        privatestaticreadonlyPetShop.IBLLStrategy.IOrderStrategyorderInse


        rtStrategy=LoadInsertStrategy();LoadInsertStrategy


        方法決定了實例化


        的是同步傳送訂單還是異步傳送訂單。在BLL邏輯層中,Order訂單中會改變的是insert方法,所以根據設計原則,把需要改變的獨立出來。


        2.控制臺小應用程序


        實例描述,模擬鴨子應用,由于后期需要可能有N種鴨子,鴨子可不可以飛,怎樣飛,鴨子可不可以叫,怎么叫,如果僅僅寫兩個接口Ifly和Iquack,子類要么繼承,要么不繼承,對飛的行為無法控制,因為飛的動作和叫的方式千變萬化。


        設計原則


        1.找出應用中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的代碼混合在一起(此例子中鴨子的行為屬于變化)


        2.針對接口編程,而不是針對實現編程針對接口編程是真正的意思是針對超類型編程,利用多態,程序可以針對超類型編程,聲明一個類時通常是一個超類或者是一個接口,這也意味著聲明類時,不用理會以后執行的真正對象,舉例Animal是一個抽象類,有兩個子類Dog和Cat


        繼承Animal針對實現的編程是:


        Catc=newCat();


        c.meow();


        //


        貓叫的方式


        Dogd=newDog();


        d.bark();


        //


        狗叫的方式針對接口的編程是:


        Animala=newDog();


        a.makeSound();


        //makeSound中會調用bark();


        Animala=newCat();


        a.makeSound();


        //makeSound中會調用meow();


        3.多用組合,少用繼承根據讀headfirst策略模式做的c#的例子。


        策略模式:定義了算法族,分別封裝起來,讓他們之間可以相互替換,次模式讓算法的變化獨立于使用算法的客戶。


        策略模式與工廠模式


        工廠模式是創建型模式


        策略模式是行為性模式


        一個關注對象創建


        一個關注行為的封裝


        策略模式就是定義一系列的算法,這些算法可以在需要的時候替換和擴展.工廠模式是生成型的模式,在你需要的時候構建具體的實例.


        在下面的情況下應當考慮使用策略模式:


        1.如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。


        2.


        一個系統需要動態地在幾種算法中選擇一種。那么這些算法可以包裝到一個個的具體算法類里面,而這些具體算法類都是一個抽象算法類的子類。換言之,這些具體


        算法類均有統一的接口,由于多態性原則,客戶端可以選擇使用任何一個具體算法類,并只持有一個數據類型是抽象算法類的對象。


        3.一個系統的算法使用的數據不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的復雜的和只與算法有關的數據。


        4.如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。此時,使用策略模式,把這些行為轉移到相應的具體策略類里面,就可以避免使用難以維護的多重條件選擇語句,并體現面向對象設計的概念。


        策略模式的優點和缺點


        策略模式有很多優點和缺點。它的優點有:


        1.策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類里面,從而避免重復的代碼。


        2.


        策略模式提供了可以替換繼承關系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環境類就可能會有一些子類,每一個子類提


        供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯


        混合在一起,從而不可能再獨立演化。繼承使得動態改變算法或行為變得不可能。


        3.使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重轉移語句里面,比使用繼承的辦法還要原始和落后。


        策略模式的缺點有:


        1.客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。


        2.策略模式造成很多的策略類。有時候可以通過把依賴于環境的狀態保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。


        策略模式與很多其它的模式都有著廣泛的聯系。Strategy很容易和Bridge模式相混淆。雖然它們結構很相似,但它們卻是為解決不同的問題


        而設計的。Strategy模式注重于算法的封裝,而Bridge模式注重于分離抽象和實現,為一個抽象體系提供不同的實現。Bridge模式與


        Strategy模式都很好的體現了"Favorcompositeoverinheritance"的觀點。

    1. 本文來自: 老鐵博客,轉載請保留出處!歡迎發表您的評論
    2. 相關標簽:
    3. 已有0位網友發表了一針見血的評論,你還等什么?

      必填

      選填

      記住我,下次回復時不用重新輸入個人信息

      必填,不填不讓過哦,嘻嘻。

      ◎歡迎參與討論,請在這里發表您的看法、交流您的觀點。

      相關推薦

      色情激情片日本大全|亚洲无码色情gif|六人行成人版第九影院|亚洲成人电影理论电影

    4. <em id="52tge"><object id="52tge"><blockquote id="52tge"></blockquote></object></em>

    5. <progress id="52tge"></progress>
        
        
        <tbody id="52tge"><pre id="52tge"></pre></tbody>
        <em id="52tge"></em>
        <li id="52tge"><acronym id="52tge"><u id="52tge"></u></acronym></li>

        <nav id="52tge"><sub id="52tge"><noframes id="52tge"></noframes></sub></nav>