還在使用 if else 寫程式碼?試試 “策略模式” 吧!
public void Share{
public void shareOptions(String option){
if(option.equals("微博")){
//function1();
//...
}else if(option.equals("微信")){
//function2();
//...
}else if(option.equals("朋友圈")){
//function3();
//...
}else if(option.equals("QQ")){
//function4();
//...
}
//...
}
策略模式(Strategy Design Pattern)
策略指的是計策、謀略,而模式一般指人為整理而成的,在某種場景下重複發生的問題的解決辦法。在程式設計中,我們可以把策略看做是“演算法”,而策略模式,按照GoF的定義,就是我們設計一些演算法,把它們封裝起來,讓它們可以相互替換,這樣就可以輕鬆地切換不同的演算法來解決同一個問題。
Strategy(策略)Strategy角色負責決定實現策略所必需的介面(API)。在示例程式中,由strategy介面扮演此角色。
ConcreteStrategy(具體的策略)ConcreteStrategy角色負責實現Strategy角色的介面(API),即負責實現具體的策略(戰略、方向、方法和演算法)。
Context(上下文)負責使用Strategy角色。Context角色儲存了ConcreteStrategy角色的例項,並使用ConcreteStrategy角色去實現需求(總之,還是要呼叫Strategy角色的介面(API))。
//定義策略介面
public interface DealStrategy{
void dealMythod(String option);
}
//定義具體的策略1
public class DealSina implements DealStrategy{
@override
public void dealMythod(String option){
//...
}
}
//定義具體的策略2
public class DealWeChat implements DealStrategy{
@override
public void dealMythod(String option){
//...
}
}
//定義上下文,負責使用DealStrategy角色
public static class DealContext{
private String type;
private DealStrategy deal;
public DealContext(String type,DealStrategy deal){
this.type = type;
this.deal = deal;
}
public DealStrategy getDeal(){
return deal;
}
public boolean options(String type){
return this.type.equals(type);
}
}
public void Share{
private static List<DealContext> algs = new ArrayList();
//靜態程式碼塊,先載入所有的策略
static {
algs.add(new DealContext("Sina",new DealSina()));
algs.add(new DealContext("WeChat",new DealWeChat()));
}
public void shareOptions(String type){
DealStrategy dealStrategy = null;
for (DealContext deal : algs) {
if (deal.options(type)) {
dealStrategy = deal.getDeal();
break;
}
}
dealStrategy.dealMythod(type);
}
}
//策略介面
public interface Comparator<T> {
int compare(T o1, T o2);
}
//需要我們來定義具體的策略
public class sorter implements Comparator{
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
}
//一般我們會用更簡潔的Lambda表示式來實現
一個專案中有許多類,它們之間的區別僅在於它們的行為,希望動態地讓一個物件在許多行為中選擇一種行為時;
一個專案需要動態地在幾種演算法中選擇一種時;
一個物件有很多的行為,不想使用多重的條件選擇語句來選擇使用哪個行為時。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31499124/viewspace-2690732/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用策略模式優化過多 if else 程式碼模式優化
- if else與策略模式模式
- 還在手寫SQL實現?試試MyBatis-Plus同款IDEA外掛吧!提示太全了,還能一鍵生成程式碼!SQLMyBatisIdea
- 還在用AIDL嗎?試試EasyMessenger吧AIMessenger
- 使用 xunit 編寫測試程式碼
- 還在寫CURD?試試這款基於mybatis-plus的springboot程式碼生成器MyBatisSpring Boot
- 策略模式+工廠模式取代if{}else{}模式
- 面試還問redux?那我從頭手擼原始碼吧(核心程式碼)面試Redux原始碼
- 還在美化部落格嗎?試試一鍵更換部落格主題吧!
- 還在為Android表情開發煩惱嗎,快來試試Android Emoji吧Android
- 還在擔心資料丟失和洩密?試試企業雲盤吧
- 還在用Jenkins?試試Gitlab的CI/CD功能吧JenkinsGitlab
- 程式碼寫作測試
- 還在用shape、selector,試試自定義圓角元件吧元件
- JS面試手寫程式碼JS面試
- 前端面試之手寫程式碼前端面試
- JS 筆試手寫程式碼JS筆試
- 別隻知道策略模式+簡單工廠,試試更香的策略模式+抽象工廠!模式抽象
- 還在用nohup? 來試試Supervisor吧 -Linux後臺執行Linux
- 策略模式在PHP業務程式碼的實踐模式PHP
- 前端筆試之手寫程式碼(一)前端筆試
- 在持續測試中使用哪種測試?談談DevOps在測試策略中的實踐!dev
- 在 Laravel 中編寫簡潔的程式碼的策略Laravel
- 「譯」使用策略設計模式來簡化程式碼設計模式
- 程式設計師可以自己寫測試?還需要測試人員嗎?程式設計師
- 還在記git命令?快試試SourceTreeGit
- 你還在這樣寫SQL嗎?趕緊改改吧SQL
- 總是在聊執行緒Thread,試試協程吧!執行緒thread
- 前端進階-編寫測試程式碼前端
- dart系列之:還在為編碼解碼而煩惱嗎?用dart試試Dart
- ??Mybatis原始碼我搞透了,面試來問吧!寫了134個原始碼類,1.03萬行程式碼!MyBatis原始碼面試行程
- 面試還問redux?那我從頭手擼原始碼吧(中介軟體)面試Redux原始碼
- 還在用 RedisTemplate?試試 Redis 官方 ORM 框架吧,用起來夠優雅!RedisORM框架
- 如何編寫優秀的測試程式碼|單元測試
- 記一次重構,策略模式替換if else模式
- 面試官:來寫個程式碼求一下兩個數的最大公約數吧面試
- 測試報告在發版前還是發版後寫測試報告
- 不用寫程式碼,也能做好介面測試