<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 策略設計模式 > 原文: [https://howtodoinjava.com/design-patterns/behavioral/strategy-design-pattern/](https://howtodoinjava.com/design-patterns/behavioral/strategy-design-pattern/) **策略設計模式**是行為設計??模式,在該行為型設計模式中,我們選擇[算法](//howtodoinjava.com/java-algorithms-implementations/)或任務在運行時的特定實現 - 從同一任務的多個其他實現中選擇。 重要的一點是,這些實現是可互換的 – 根據任務可以選擇一種實現而不會干擾應用工作流程。 ```java Table of Contents Introduction Design Participants Problem Statement Solution with strategy design pattern Code Implementation Demo Popular Implementations Summary ``` ## 介紹 策略模式涉及從其宿主類中刪除算法并將其放在單獨的類中,以便在同一編程上下文中可能存在不同的算法(即策略),可以在運行時選擇它們。 **策略模式**使客戶端代碼可以從一系列相關但不同的算法中進行選擇,并提供了一種簡單的方法來根據客戶端上下文在運行時選擇任何算法。 #### 由開/關原則驅動 該模式基于**開閉原則**。 我們不需要修改上下文(已關閉以進行修改),但是可以選擇并添加任何實現(可擴展用于開放)。 例如,在`Collections.sort()`中 - 我們無需更改排序方法即可獲得不同的排序結果。 我們可以在運行時提供不同的比較器。 > 閱讀更多:[比較器示例](//howtodoinjava.com/java/collections/when-to-use-comparable-and-comparator-interfaces-in-java/) ## 設計參與者 在策略模式中,我們首先創建算法的[抽象](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/)。 這是具有抽象操作的接口。 然后,我們創建此抽象的實現,這些實現稱為策略。 客戶端將始終調用抽象,并將傳遞上下文對象。 該上下文對象將決定使用哪種策略。 ![Strategy Pattern Participants](https://img.kancloud.cn/8a/7f/8a7f791d40553964ebaed09aba3fb926_481x208.png) 策略模式參與者 ## 問題陳述 讓我們解決一個設計問題,以更詳細地了解策略模式。 我想設計一個社交媒體應用,使我可以在四個社交平臺(例如,Facebook,Google Plus,Twitter 和 Orkut)上與朋友聯系。 現在,我希望該客戶端能夠告訴朋友的名稱和所需的平臺 - 然后我的應用應該透明地連接到他。 更重要的是,如果我想在應用中添加更多社交平臺,則應用代碼應在不破壞設計的情況下容納它。 ## 使用策略設計模式的解決方案 在上述問題中,我們有一個可以以多種方式(連接到朋友)完成的操作,用戶可以在運行時選擇所需的方式。 因此,它非常適合用于策略設計模式。 為了實現該解決方案,讓我們一次設計一個參與者。 * **`ISocialMediaStrategy`** - 抽象操作的接口。 * **`SocialMediaContext`** – 確定實現的上下文。 * **實現** – `ISocialMediaStrategy`的各種實現。 例如。 `FacebookStrategy`,`GooglePlusStrategy`,`TwitterStrategy`和`OrkutStrategy`。 #### 類圖 ![Strategy Pattern Class Diagram](https://img.kancloud.cn/86/ed/86ed243c172d600fc879c666ad74b70a_914x345.png) 策略模式類圖 ## 代碼實現 現在,讓我們在設計參與者之上進行編碼。 **`ISocialMediaStrategy.java`** ```java package com.howtodoinjava.designpattern.strategy; public interface ISocialMediaStrategy { public void connectTo(String friendName); } ``` **`SocialMediaContext.java`** ```java package com.howtodoinjava.designpattern.strategy; public class SocialMediaContext { ISocialMediaStrategy smStrategy; public void setSocialmediaStrategy(ISocialMediaStrategy smStrategy) { this.smStrategy = smStrategy; } public void connect(String name) { smStrategy.connectTo(name); } } ``` **`FacebookStrategy.java`** ```java package com.howtodoinjava.designpattern.strategy.impl; import com.howtodoinjava.designpattern.strategy.ISocialMediaStrategy; public class FacebookStrategy implements ISocialMediaStrategy { public void connectTo(String friendName) { System.out.println("Connecting with " + friendName + " through Facebook"); } } ``` **`GooglePlusStrategy.java`** ```java package com.howtodoinjava.designpattern.strategy.impl; import com.howtodoinjava.designpattern.strategy.ISocialMediaStrategy; public class GooglePlusStrategy implements ISocialMediaStrategy { public void connectTo(String friendName) { System.out.println("Connecting with " + friendName + " through GooglePlus"); } } ``` **`TwitterStrategy.java`** ```java package com.howtodoinjava.designpattern.strategy.impl; import com.howtodoinjava.designpattern.strategy.ISocialMediaStrategy; public class TwitterStrategy implements ISocialMediaStrategy { public void connectTo(String friendName) { System.out.println("Connecting with " + friendName + " through Twitter"); } } ``` **`OrkutStrategy.java`** ```java package com.howtodoinjava.designpattern.strategy.impl; import com.howtodoinjava.designpattern.strategy.ISocialMediaStrategy; public class OrkutStrategy implements ISocialMediaStrategy { public void connectTo(String friendName) { System.out.println("Connecting with " + friendName + " through Orkut [not possible though :)]"); } } ``` ## 演示 現在看看如何在運行時中使用這些策略。 ```java package com.howtodoinjava.designpattern.strategy.demo; import com.howtodoinjava.designpattern.strategy.SocialMediaContext; import com.howtodoinjava.designpattern.strategy.impl.FacebookStrategy; import com.howtodoinjava.designpattern.strategy.impl.GooglePlusStrategy; import com.howtodoinjava.designpattern.strategy.impl.OrkutStrategy; import com.howtodoinjava.designpattern.strategy.impl.TwitterStrategy; public class Demo { public static void main(String[] args) { // Creating social Media Connect Object for connecting with friend by // any social media strategy. SocialMediaContext context = new SocialMediaContext(); // Setting Facebook strategy. context.setSocialmediaStrategy(new FacebookStrategy()); context.connect("Lokesh"); System.out.println("===================="); // Setting Twitter strategy. context.setSocialmediaStrategy(new TwitterStrategy()); context.connect("Lokesh"); System.out.println("===================="); // Setting GooglePlus strategy. context.setSocialmediaStrategy(new GooglePlusStrategy()); context.connect("Lokesh"); System.out.println("===================="); // Setting Orkut strategy. context.setSocialmediaStrategy(new OrkutStrategy()); context.connect("Lokesh"); } } ``` 輸出: ```java Connecting with Lokesh through Facebook ==================== Connecting with Lokesh through Twitter ==================== Connecting with Lokesh through GooglePlus ==================== Connecting with Lokesh through Orkut [not possible though :)] ``` ## 流行實現 1. Java `Collections.sort(list, comparator)`方法,客戶端根據運行時的要求實際將適當的比較器傳遞給該方法,并且該方法通用以接受任何比較器類型。 根據傳遞的比較器,可以對同一集合進行不同的排序。 2. [Log4j](//howtodoinjava.com/log4j2/) 中的附加器,布局和過濾器。 3. UI 工具箱中的布局管理器。 ## 總結 * 此模式定義了一組相關算法,并將它們封裝在單獨的類中,并允許客戶端在運行時選擇任何算法。 * 它允許添加新算法而無需修改使用算法或策略的現有算法或上下文類 * 策略是“GOF”列表中的一種行為型模式。 * 策略模式基于 SOLID 主體的開放式封閉設計原則。 * `Collections.sort()`和`Comparator`接口的組合是策略模式的可靠示例。 這就是有關策略設計模式的全部內容。 將我的問題放在評論部分。 [下載源碼](//howtodoinjava.com/wp-content/downloads/strategyDesignPattern.zip) 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看