设计模式-Strategy模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式-Strategy模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 一個例子
- 傳統做法
- 策略模式
- 總結
策略模式(Strategy Pattern),屬于行為型模式,指的是定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化。
一個例子
前一陣子忙活落戶的事,發現不同人群落戶的政策也不太一樣,如果要寫一段程序針對不同人群做不同的處理該是什么樣呢。
傳統做法
一般在工作中遇到這種不同情況不同處理的時候首先會想到if-else結構(當然也會有switch)。
落戶處理類
public class SettleHandler {/*** 處理戶口* @param crowdType 人群類型:大學生,創業者,其他*/public static void handleSettle(String crowdType) {if (CrowdTypeEnum.COLLEGESTUDENT.getCode().equals(crowdType)) {//一系列處理操作System.out.println("全國高等院校在校學生(教育部學信網在冊人員),均可遷入本市落戶。");} else if (CrowdTypeEnum.PIONEER.getCode().equals(crowdType)) {//一系列處理操作System.out.println("凡在我市依法注冊登記并正常經營的市場主體,其法定代表人、員工和個體經營者可遷入本市落戶。");} else if (CrowdTypeEnum.OTHER.getCode().equals(crowdType)) {//一系列處理操作System.out.println("詳訊本地公安局");}} }根據人群類型選擇不同的處理策略
//大學生String myCrowdType = CrowdTypeEnum.COLLEGESTUDENT.getCode();System.out.print("大學生落戶政策:");SettleHandler.handleSettle(myCrowdType);//創業者String myCrowdType1 = CrowdTypeEnum.PIONEER.getCode();System.out.print("創業者落戶政策:");SettleHandler.handleSettle(myCrowdType1); 大學生落戶政策:全國高等院校在校學生(教育部學信網在冊人員),均可遷入本市落戶。 創業者落戶政策:凡在我市依法注冊登記并正常經營的市場主體,其法定代表人、員工和個體經營者可遷入本市落戶。可以發現上面寫法的弊端:如果要增加一個人群類型,就要對應增加一個處理規則,也就是要多加一個if判斷,如果規則變得很多,這將變得非常麻煩。
策略模式
策略模式核心是將算法策略獨立出來以便達到易擴展的目的。
落戶處理策略基類
大學生落戶處理策略
public class CollegeStudentStrategy implements Strategy {/*** 策略處理類**/@Overridepublic void handle() {System.out.println("全國高等院校在校學生(教育部學信網在冊人員),均可遷入本市落戶。");} }創業者落戶處理策略
public class PioneerStrategy implements Strategy {/*** 策略處理方法**/@Overridepublic void handle() {System.out.println("凡在我市依法注冊登記并正常經營的市場主體,其法定代表人、員工和個體經營者可遷入本市落戶。");} }其他落戶處理策略
public class OtherStrategy implements Strategy {/*** 策略處理方法**/@Overridepublic void handle() {System.out.println("詳訊本地公安局。");} }策略處理上下文
public class StrategyContext {private Strategy strategy;public StrategyContext(Strategy strategy) {this.strategy = strategy;}public void handle() {strategy.handle();} }不同情況不同策略處理
//大學生落戶Strategy strategy = new CollegeStudentStrategy();StrategyContext context = new StrategyContext(strategy);System.out.print("大學生落戶政策:");context.handle();//創業者落戶Strategy strategy1 = new PioneerStrategy();StrategyContext context1 = new StrategyContext(strategy1);System.out.print("大學生落戶政策:");context1.handle();//其他落戶Strategy strategy2 = new OtherStrategy();StrategyContext context2 = new StrategyContext(strategy2);System.out.print("其他落戶政策:");context2.handle(); 大學生落戶政策:全國高等院校在校學生(教育部學信網在冊人員),均可遷入本市落戶。 大學生落戶政策:凡在我市依法注冊登記并正常經營的市場主體,其法定代表人、員工和個體經營者可遷入本市落戶。 其他落戶政策:詳訊本地公安局。總結
- 很明顯能感覺到將算法單獨拆分出來之后更容易應對后續增加不同算法的問題。
- 策略模式并不決定在何時使用何種算法。在什么情況下使用什么算法是由客戶端決定的。
- 策略模式主要解決的是不同算法之間如何組織如何調度算法。
- 它遵循了多用組合,少用繼承、針對接口編程,不針對實現編程兩個設計原則。
當然把使用什么算法交給用戶,就意味著用戶必須理解這些算法的區別,才能恰當選擇算法。后續可以結合工廠模式來解決這個問題。
你可以在這里獲取相關代碼:設計模式-Strategy模式
轉載于:https://www.cnblogs.com/xuxiaojian/p/11475120.html
總結
以上是生活随笔為你收集整理的设计模式-Strategy模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络基础 + 简易服务端和客户端
- 下一篇: python 内置函数__name__的