還在使用 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 編寫測試程式碼
- 使用 intern 編寫測試程式碼
- 還在美化部落格嗎?試試一鍵更換部落格主題吧!
- 還在擔心資料丟失和洩密?試試企業雲盤吧
- 策略模式+工廠模式取代if{}else{}模式
- 還在寫CURD?試試這款基於mybatis-plus的springboot程式碼生成器MyBatisSpring Boot
- 程式碼寫作測試
- 還在用Jenkins?試試Gitlab的CI/CD功能吧JenkinsGitlab
- 還在為Android表情開發煩惱嗎,快來試試Android Emoji吧Android
- 還在用shape、selector,試試自定義圓角元件吧元件
- JS 筆試手寫程式碼JS筆試
- 寫 Laravel 測試程式碼 (五)Laravel
- 寫 Laravel 測試程式碼 (二)Laravel
- 別隻知道策略模式+簡單工廠,試試更香的策略模式+抽象工廠!模式抽象
- 寧願編寫程式碼?還是把事情都寫下來吧!
- 還在記git命令?快試試SourceTreeGit
- 還在用nohup? 來試試Supervisor吧 -Linux後臺執行Linux
- 程式設計師可以自己寫測試?還需要測試人員嗎?程式設計師
- 前端筆試之手寫程式碼(一)前端筆試
- 在持續測試中使用哪種測試?談談DevOps在測試策略中的實踐!dev
- 還在用 RedisTemplate?試試 Redis 官方 ORM 框架吧,用起來夠優雅!RedisORM框架
- 策略模式在PHP業務程式碼的實踐模式PHP
- dart系列之:還在為編碼解碼而煩惱嗎?用dart試試Dart
- 總是在聊執行緒Thread,試試協程吧!執行緒thread
- 《快樂碼農》第7期 嘗試在帳篷中寫程式碼
- 你們現在編寫程式碼是從先寫測試開始嗎?
- [譯]來試試這個真正的 JavaScript 偵錯程式吧!JavaScript
- 前端進階-編寫測試程式碼前端
- 編寫可測試的 JavaSript 程式碼Java
- 編寫可測試的 JavaScript 程式碼JavaScript
- 如何編寫優秀的測試程式碼|單元測試
- 編寫可測試的Javascript程式碼(1):反模式及其解決方案JavaScript模式
- 你還在這樣寫SQL嗎?趕緊改改吧SQL
- 測試報告在發版前還是發版後寫測試報告