
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方法可以保证对象的封装性,
运行结果: