策略模式
為什么要使用策略模式?
解答:當一個介面中有三種判斷,引數傳入month月,是一種結果,傳入year是一種結果,傳入day又是另一種結果,如果使用傳統的代碼業務邏輯如下:
if(x == month){
System.out.println("-----回傳月的資料----");
}else if(x == year){
System.out.println("-----回傳年的資料----");
}else if(x == day){
System.out.println("-----回傳天的資料---");
}
使用大量的if else會很難維護,這時候如果使用策略模式就非常方便,
什么是策略模式?
解答:1.諸葛亮的錦囊妙計,每一個錦囊都是一個策略,2.如上面的判斷,每一種結果都是一個策略,
怎么使用?
解答:將上面的年月日的判斷封裝成一個Judge介面,然后新建三個類實作MonthJudge,YearJudge,DayJudge,
代碼演示:
1.新建一個judge介面,里面只有一個方法,判斷方法
public interface Judge {
void judge();
}
2.新建三個類MonthJudge,YearJudge,DayJudge 實作 judge介面
public class MonthJudge implements Judge{
@Override
public void judge() {
System.out.println("這里是月份判斷的結果");
}
}
public class YearJudge implements Judge{
@Override
public void judge() {
System.out.println("這里是年份進來的結果");
}
}
public class DayJudge implements Judge{
@Override
public void judge() {
System.out.println("這里是日子的結果");
}
}
3.建立一個物體類
public class DateClass {
Judge judge;
public DateClass(Judge judge) {
this.judge = judge;
}
public void judge(){
if(judge !=null){
judge.judge();
}
}
}
4.這里就是判斷,可以使用demo的main方法
public class Demo {
public static void main(String[] args) {
//1.如果前端傳遞的是month條件,那就呼叫month,如果是day,那就使用new DayJudge().
DateClass dateClass = new DateClass(new MonthJudge());
dateClass.judge();
}
}
------------以上就是自己總結的,類圖如下-------------

如果大家覺得太簡單,那接下來,咱們在來一個
案例2:商品促銷行為:購物立減,購物滿減,購物返現,無促銷活動
思路:1.首先建促銷的介面(Promotion),然后建4個策略(ManjianPromotion滿減),(FanxianPromotion返現),(LijianPromotion立減),(NoPromotion無任何活動)
2.建立一個類PromotionActivity(行為)里面有執行行為,構造器里也是促銷的介面
3.demo測驗
代碼如下:
//促銷的介面
public interface Promotion {
public void doPromotion();
}
//返現
public class FanxianPromotion implements Promotion{
@Override
public void doPromotion() {
System.out.println("購物滿100返現20元,返現金額存入商戶中");
}
}
//立減
public class LijianPromotion implements Promotion{
@Override
public void doPromotion() {
System.out.println("立減促銷,購物立減200元");
}
}
//滿減
public class ManjianPromotion implements Promotion{
@Override
public void doPromotion() {
System.out.println("購物滿減促銷,滿1000-200元");
}
}
//無活動
public class NoPromotion implements Promotion {
@Override
public void doPromotion() {
System.out.println("無任何活動");
}
}
//行為類
public class PromotionActivity {
private Promotion promotion;
public PromotionActivity(Promotion promotion) {
this.promotion = promotion;
}
public void executePromotion(){
promotion.doPromotion();
}
}
demo測驗類:第一種情況
public class Test {
public static void main(String[] args) {
//618 活動,立減策略
PromotionActivity promotionActivity618 = new PromotionActivity(new LijianPromotion());
//雙十一 返現
PromotionActivity promotionActivity1111 = new PromotionActivity(new FanxianPromotion());
promotionActivity618.executePromotion();
promotionActivity1111.executePromotion();
}
}
demo測驗類:第二種情況(如果是前端傳遞引數為LIJIAN或者FANXIAN)
就只能用if else了
//main方法
public static void main(String[] args) {
PromotionActivity promotionActivity = null;
String promotionKey = "LIJIAN";
if(promotionKey.equals("LIJIAN")){
//618 活動,立減策略
promotionActivity = new PromotionActivity(new LijianPromotion());
}else if(promotionKey.equals("FANXIAN")){
//雙十一 返現
promotionActivity = new PromotionActivity(new FanxianPromotion());
}
promotionActivity.executePromotion();
}
當然機智的你,肯定不想要這種if else判斷了,如果用這種判斷,那學了那么多的策略模式還有何意義,這時候咱們可以使用策略模式+工廠模式組合來搞,
//策略工廠類
public class PromotionActivityFactory {
private static Map<String,Promotion> promotionMap = new HashMap<>();
static {
promotionMap.put(PromotionKey.LIJIAN,new LijianPromotion());
promotionMap.put(PromotionKey.FANXIAN,new FanxianPromotion());
promotionMap.put(PromotionKey.MANJIAN,new ManjianPromotion());
}
private static final Promotion no_promotion = new NoPromotion(); //無活動策略
private PromotionActivityFactory(){
}
public static Promotion getPromotion(String promotionKey){
Promotion promotion = promotionMap.get(promotionKey);
return promotion == null ? no_promotion : promotion;
}
private interface PromotionKey{
String LIJIAN = "LIJIAN";
String FANXIAN = "FANXIAN";
String MANJIAN = "MANJIAN";
}
}
測驗方法如下:
public static void main(String[] args) {
String promotionKey="LIJIAN";
PromotionActivity promotionActivity = new PromotionActivity(PromotionActivityFactory.getPromotion(promotionKey));
//雙十一 返現
promotionActivity.executePromotion();
}
完美搞定!UML圖如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/246885.html
標籤:其他
上一篇:Codeforces Round #695 (Div. 2)
下一篇:XDOJ期末考試題
