策略模式

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 }

 

posted @ 2019-01-06 17:13  逢春  阅读(144)  评论(0编辑  收藏  举报