策略模式之商场促销

每到5.1 10.1等节日,都会看到商场里人山人海。商场之所以如此吸引人,是因为疯狂的折扣。

下面以商场打折为例,谈谈策略模式。

商品的折扣算法:

算法一:对于有的商品,没有折扣。

算法二:对于有的商品,采取固定金额的折扣。

算法三:对于有的商品,采取百分比的折扣。

解决方案:

方案一:将所有的业务逻辑放在客户端。客户端根据参数选择具体的算法,但是这样客户端会变得复杂而且难以维护。

方案二:客户端利用不同层次的继承在子类中实现不同的行为。但这样使算法跟客户端紧密耦合在一起。

方案三:策略模式。把策略算法和客户端分隔开。这样都新的打折算法也不必修改客户端。

模式的实现:

类图:

uml_1

抽象折扣类:

image

抽象折扣类代码:

无折扣策略类:

image

无折扣策略类代码:

固定折扣策略类:

image

固定折扣策略类代码:

百分比折扣策略类:

image

百分比折扣策略代码:

  

测试代码:

商品类——图书:

商品类——水果:

商品类——玩具:

主类:

策略模式的使用情况:

(1) 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

(2) 一个系统需要动态地在集中算法中选择一种。那么这些算法可以包装到一个个的具体算法里面,而这些具体算法都都是一个抽象算法类的子类。

(3) 一个系统的算法使用的数据不可以上客户端知道,策略模式可以避免让客户端涉及到不必要接触的复杂的和只与算法有关的数据。

(4) 如果一个对象有很多的行为,如果不使用恰当的模式,这些行为只好使用多重的条件选择语句来实现。此时,使用侧路模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象的设计概念。

策略模式的优点:

(1) 提供了管理相关算法足的办法。

(2) 避免了难以维护的多重条件选择语句的使用。

(3) 提供了可以代替继承关系的办法。

策略模式的缺点:

(1) 客户端必须提前知道所有的策略类,并且自己决定使用那一个策略类。

(2) 策略模式造成很多的策略类。

另外在java语言内部也有好多策略模式的例子:如comparator,AWT中的LayoutManager,Swing中的Border等。有兴趣的可以研究研究。

工程实例下载:http://cid-2c8a0dc7c1eb1d71.skydrive.live.com/self.aspx/soft/Design%20Pattern/Strategy.7z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解你的问题。下面是一个使用策略模式解决商场促销商品问题的Java示例: 假设商场有一个满减活动,如果购买的商品总价超过100元,可以减去10元;如果购买的商品总价超过200元,可以减去30元。我们可以使用策略模式来实现这个活动。 首先,我们创建一个接口`DiscountStrategy`来表示折扣策略: ```java public interface DiscountStrategy { double getDiscount(double totalPrice); } ``` 然后,我们创建两个实现类`TenOffStrategy`和`ThirtyOffStrategy`来分别表示满100减10和满200减30的折扣策略: ```java public class TenOffStrategy implements DiscountStrategy { @Override public double getDiscount(double totalPrice) { return totalPrice >= 100 ? 10 : 0; } } public class ThirtyOffStrategy implements DiscountStrategy { @Override public double getDiscount(double totalPrice) { return totalPrice >= 200 ? 30 : 0; } } ``` 最后,我们创建一个`DiscountContext`类来管理折扣策略,根据购买商品的总价来选择合适的折扣策略: ```java public class DiscountContext { private DiscountStrategy strategy; public DiscountContext(double totalPrice) { if (totalPrice >= 200) { strategy = new ThirtyOffStrategy(); } else if (totalPrice >= 100) { strategy = new TenOffStrategy(); } else { strategy = null; } } public double getDiscount() { return strategy == null ? 0 : strategy.getDiscount(); } } ``` 这样,我们就可以通过`DiscountContext`类来获取购买商品所能享受的折扣了。例如,如果购买了总价为150元的商品,可以这样使用: ```java DiscountContext context = new DiscountContext(150); double discount = context.getDiscount(); // discount = 10 ``` 这就是一个使用策略模式解决商场促销商品问题的Java示例。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值