https://www.cnblogs.com/xiufengchen/p/11609691.html
策略模式:
使用常用,支付,之前做了微信支付,支付寶支付,然后另外一個同事寫了一個銀聯支付,那么如果代碼方法一起就會導致代碼不是很好操作所以,采用策略模式進行,同事只需要寫一個實現類,就可以了,
在協作過程中比較容易。
在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬於行為型模式。
在策略模式中,我們創建表示各種策略的對象和一個行為隨着策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法
意圖:定義一系列的算法,把它們一個個封裝起來, 並且使它們可相互替換。
主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。
何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。
如何解決:將這些算法封裝成一個一個的類,任意地替換。
關鍵代碼:實現同一個接口。
應用實例: 1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略。 2、旅行的出游方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。 3、JAVA AWT 中的 LayoutManager。
優點: 1、算法可以自由切換。 2、避免使用多重條件判斷。 3、擴展性良好。
缺點: 1、策略類會增多。 2、所有策略類都需要對外暴露。
使用場景: 1、如果在一個系統里面有許多類,它們之間的區別僅在於它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。 2、一個系統需要動態地在幾種算法中選擇一種。 3、如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
使用案例代碼:
策略接口:執行的方法
package com.cxy.ssp.strategy; public interface Strategy { String getVpcList(DemoPojo demoPojo); }
實體類:
package com.cxy.ssp.strategy; public class DemoPojo { private String poolid; private String orderId; private String name; public String getPoolid() { return poolid; } public void setPoolid(String poolid) { this.poolid = poolid; } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public DemoPojo(String poolid, String orderId, String name) { this.poolid = poolid; this.orderId = orderId; this.name = name; } public DemoPojo() { } }
實現類:
1
package com.cxy.ssp.strategy.impl; import com.cxy.ssp.strategy.DemoPojo; import com.cxy.ssp.strategy.Strategy; import org.springframework.stereotype.Component; @Component("A") public class SA implements Strategy { @Override public String getVpcList(DemoPojo demoPojo) { System.out.println("A,getVpcList ==========="+demoPojo); return demoPojo.getName(); } }
2
package com.cxy.ssp.strategy.impl; import com.cxy.ssp.strategy.DemoPojo; import com.cxy.ssp.strategy.Strategy; import org.springframework.stereotype.Component; @Component("B") public class SB implements Strategy { @Override public String getVpcList(DemoPojo demoPojo) { System.out.println("b,getVpcList ==========="+demoPojo); return demoPojo.getName(); } }
3
package com.cxy.ssp.strategy.impl; import com.cxy.ssp.strategy.DemoPojo; import com.cxy.ssp.strategy.Strategy; import org.springframework.stereotype.Component; @Component("C") public class SC implements Strategy { @Override public String getVpcList(DemoPojo demoPojo) { System.out.println("c"+demoPojo); return demoPojo.getName(); } }
策略context
package com.cxy.ssp.strategy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /***、 *通過Spring將實現Strategy的實現類都自動注入到strategyMap類中, * 當用戶傳入選擇的資源池時,自動根據資源池id去對應的資源池實現中查找資源。 * */ @Service public class SimpleContext { @Autowired private final Map<String, Strategy> strategyMap = new ConcurrentHashMap<>(); public SimpleContext(Map<String, Strategy> strategyMap) { this.strategyMap.clear(); strategyMap.forEach((k, v)-> this.strategyMap.put(k, v)); } public String getResource(DemoPojo demoPojo){ return strategyMap.get(demoPojo.getPoolid()).getVpcList(demoPojo); } }
策略服務L:
package com.cxy.ssp.controller; import com.cxy.ssp.strategy.DemoPojo; import com.cxy.ssp.strategy.SimpleContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController public class TestController { @Autowired private SimpleContext simpleContext; @PostMapping("/choose") public String choose(@RequestBody DemoPojo demoPojo){ return simpleContext.getResource(demoPojo); } }
外加一個核心啟動類:
package com.cxy.ssp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SspApplication { public static void main(String[] args) { SpringApplication.run(SspApplication.class, args); }