策略模式
1.定义:定义了算法家族,分别封装起来,让它们之间可以互相替换,
此模式让算法的变化不会影响到使用算法的用户。
2.类型:行为型
3.适用场景:系统有很多类,而他们的区别仅仅在于他们的行为不同;
一个系统需要动态地在几种算法中选择一种。
4.优点:符合开闭原则;避免使用多重条件转移语句;提高算法的保密性和安全性。
5.缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类;产生很多策略类。
6.相关设计模式:工厂模式、状态模式。
7.实例目录package
8.实例UML类图
9.代码
1 package com.geely.design.pattern.behavioral.strategy; 2 3 public interface PromotionStrategy { 4 void doPromotion(); 5 }
1 package com.geely.design.pattern.behavioral.strategy; 2 3 public class LiJianPromotionStrategy implements PromotionStrategy { 4 @Override 5 public void doPromotion() { 6 System.out.println("立减促销,课程的价格直接减去配置的价格"); 7 } 8 }
1 package com.geely.design.pattern.behavioral.strategy; 2 3 public class ManJianPromotionStrategy implements PromotionStrategy { 4 @Override 5 public void doPromotion() { 6 System.out.println("满减促销,满200-20元"); 7 } 8 }
1 package com.geely.design.pattern.behavioral.strategy; 2 3 public class FanXianPromotionStrategy implements PromotionStrategy{ 4 @Override 5 public void doPromotion() { 6 System.out.println("返现促销,返回的金额存放到慕课网用户的余额中"); 7 } 8 }
1 package com.geely.design.pattern.behavioral.strategy; 2 3 public class EmptyPromotionStrategy implements PromotionStrategy{ 4 @Override 5 public void doPromotion() { 6 System.out.println("无促销活动"); 7 } 8 }
1 package com.geely.design.pattern.behavioral.strategy; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class PromotionStrategyFactory { 7 private static final PromotionStrategy NON_PROMOTION = new EmptyPromotionStrategy(); 8 private static Map<String,PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>(); 9 static{ 10 PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN,new LiJianPromotionStrategy()); 11 PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN,new ManJianPromotionStrategy()); 12 PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN,new FanXianPromotionStrategy()); 13 } 14 15 private PromotionStrategyFactory(){ 16 } 17 public static PromotionStrategy getPromotionStrategy(String promotionKey){ 18 PromotionStrategy promotionStrategy =PROMOTION_STRATEGY_MAP.get(promotionKey); 19 return promotionStrategy == null ? NON_PROMOTION : promotionStrategy; 20 } 21 22 private interface PromotionKey{ 23 String LIJIAN = "LIJIAN"; 24 String FANXIAN = "FANXIAN"; 25 String MANJIAN = "MANJIAN"; 26 } 27 }
1 package com.geely.design.pattern.behavioral.strategy; 2 3 public class PromotionActivity { 4 private PromotionStrategy promotionStrategy; 5 6 public PromotionActivity(PromotionStrategy promotionStrategy){ 7 this.promotionStrategy = promotionStrategy; 8 } 9 10 public void executePromotionStategy(){ 11 promotionStrategy.doPromotion(); 12 } 13 }
1 package com.geely.design.pattern.behavioral.strategy; 2 3 import org.apache.commons.lang.StringUtils; 4 5 public class Test { 6 /*public static void main(String[] args) { 7 PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy()); 8 PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy()); 9 PromotionActivity promotionActivity1212 = new PromotionActivity(new ManJianPromotionStrategy()); 10 11 promotionActivity618.executePromotionStategy(); 12 promotionActivity1111.executePromotionStategy(); 13 promotionActivity1212.executePromotionStategy(); 14 }*/ 15 16 /*public static void main(String[] args) { 17 PromotionActivity promotionActivity = null; 18 String promotionKey = "LIJIAN"; 19 if(StringUtils.equals(promotionKey,"LIJIAN")){ 20 promotionActivity = new PromotionActivity(new LiJianPromotionStrategy()); 21 }else if(StringUtils.equals(promotionKey,"MANJIAN")){ 22 promotionActivity = new PromotionActivity(new ManJianPromotionStrategy()); 23 }else if(StringUtils.equals(promotionKey,"FANXIAN")){ 24 promotionActivity = new PromotionActivity(new FanXianPromotionStrategy()); 25 } 26 promotionActivity.executePromotionStategy(); 27 }*/ 28 29 public static void main(String[] args) { 30 String promotionKey = "LIJIAN"; 31 PromotionActivity promotionActivity = 32 new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey)); 33 promotionActivity.executePromotionStategy(); 34 } 35 }