java—设计模式_策略模式

 

 

1 package strategy;
  2 /*
  3  * 具体策略角色:高级会员
  4  */
  5 public class AdvancedMemberStrategy implements MemberStrategy{
  6 
  7     @Override
  8     public double discount(double booksPrice) {
  9         
 10         System.out.println("对于高级会员的折扣为20%");
 11         return booksPrice * 0.8;
 12     }
 13 
 14 }
 15 package strategy;
 16 /*
 17  * 具体策略角色:中级会员
 18  */
 19 
 20 public class IntermediateMemberStrategy implements MemberStrategy {
 21 
 22     @Override
 23     public double discount(double booksPrice) {
 24 
 25         System.out.println("中级会员的折扣:10%");
 26         return booksPrice * 0.9;    }
 27 
 28 }
 29 package strategy;
 30 /*
 31  * 抽象策略
 32  */
 33 public interface MemberStrategy {
 34     
 35      public double discount(double booksPrice);
 36 
 37 }
 38 package strategy;
 39 /*
 40  * 实体类
 41  */
 42 public class OnlinePrice extends Price {
 43 
 44     @Override
 45     public void show() {
 46         System.out.println("OnlinePrice");
 47         
 48     }
 49     
 50 }
 51 package strategy;
 52 /*
 53  * 抽象类
 54  * 目的:抽取相似代码,减少冗余
 55  */
 56 public abstract class Price {
 57     private MemberStrategy strategy;
 58 
 59     public MemberStrategy getStrategy() {
 60         return strategy;
 61     }
 62 /*
 63  * 提供setter方法可以动态调节折扣类型
 64  */
 65     public void setStrategy(MemberStrategy strategy) {
 66         this.strategy = strategy;
 67     }
 68     public double discountedPrice(double booksPrice){
 69         return this.strategy.discount(booksPrice);
 70     }
 71     public abstract void show();
 72     
 73 }
 74 package strategy;
 75 /*
 76  * 具体策略角色:初级会员
 77  */
 78 
 79 public class PrimaryMemberStrategy implements MemberStrategy {
 80     
 81     @Override
 82     public double discount(double booksPrice) {
 83         System.out.println("初级会员没有折扣");
 84         return booksPrice;
 85     }
 86 
 87 }
 88 package strategy;
 89 /*
 90  * 实体类
 91  */
 92 public class StorePrice extends Price {
 93 
 94     @Override
 95     public void show() {
 96         System.out.print("StorePrice");
 97 
 98     }
 99 
100 }
101 package strategy;
102 /*
103  * 测试类
104  */
105 public class Test {
106 public static void main(String[] args) {
107     Price price=new OnlinePrice();
108     price.setStrategy(new PrimaryMemberStrategy());
109     price.show();
110     System.out.println("打折后价格:"+price.discountedPrice(1000));
111 }
112 }
源代码

网上看到的关于策略模式的介绍:

 策略(Strategy)模式:又名Policy,它的用意是定义一组算法,把它们一个个封装起来,并且使他们可以相互替换。策略模式可以独立于使用他们的客户端而变化。GOF策略模式静态结构类图如下:

通过上图可以看出策略模式有以下角色构成:

1、抽象策略(Strategy)角色:抽象策略角色由抽象类或接口来承担,它给出具体策略角色需要实现的接口;

2、具体策略(ConcreteStrategy)角色:实现封装了具体的算法或行为;

3、场景(Context)角色:持有抽象策略类的引用。

策略模式重点是封装不同的算法和行为,不同的场景下可以相互替换。策略模式是开闭原则的体现,开闭原则讲的是一个软件实体应该对扩展开放对修改关闭。策略模式在新的策略增加时,不会影响其他类的修改,增加了扩展性,也就是对扩展是开放的;对于场景来说,只依赖于抽象,而不依赖于具体实现,所以对修改是关闭的。

使用场景

  假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。

  根据描述,折扣是根据以下的几个算法中的一个进行的:

  算法一:对初级会员没有折扣。

  算法二:对中级会员提供10%的促销折扣。

  算法三:对高级会员提供20%的促销折扣。

 

    如果仅仅实现上述需求,可以能略简单,现在再加一个条件:会员购买方式可能为网购或实体店购买,需要展示购买方式。

 原则:考虑到以后可能会有其它打折策略(出现个至尊VIP),所以我们要让代码好维护,这就要求我们要面向接口编程,而不是面向实现编程。

    为了减少代码冗余,固定的代码就要抽取封装。

    少用继承,多用组合。

    提供setter方法可以保证对象的封装性,

    

运行结果:

 

 

 

posted @ 2018-03-01 15:29  王者峡谷的码农  阅读(144471)  评论(1编辑  收藏  举报