-
Strategy:抽象策略类,它定义了一些通用的、具体策略类必须实现的公共处理方法。它通常是一个接口或者抽象类。 -
Concrete Strategy:具体策略类,它实现了抽象策略类定义的方法。 -
Context:上下文,它持有一个策略类的引用,委托策略变量来调用具体策略中的算法。
-
非会员不打折。
-
普通会员只要超过购买金额超过200元,就打九折优惠。
-
银牌会员统一打八折,如果购买金额超过300元,折后再立减20元(不累积计算)。
-
金牌会员统一打七折,如果购买金额超过300元,则直接按六折计算。
public long calculate(String userType, long amount){
if("ordinary".equals(userType)){
if(amount>200){
return amount/100*90;
}
return amount;
}
if("silver".equals(userType)){
if(amount>300){
return amount/100*80-20;
}
return amount/100*80;
}
if("golden".equals(userType)){
if(amount>300){
return amount/100*60;
}
return amount/100*70;
}
return amount;
}
package com.sample.patterns.strategy;
public interface PromotionStrategy {
// 计算促销后的金额
long calculate(long amount);
}
package com.sample.patterns.strategy;
// 非会员的计算策略
public class NonMemberStrategy implements PromotionStrategy{
// 看起来有点多余,但主要是考虑:1.统一性;2.扩展性
@Override
public long calculate(long amount) {
return amount;
}
}
package com.sample.patterns.strategy;
// 普通会员的计算策略
public class OrdinaryMemberStrategy implements PromotionStrategy{
// 购买金额超过200元,就打九折
@Override
public long calculate(long amount) {
if(amount>200){
return amount/100*90;
}
return amount;
}
}
package com.sample.patterns.strategy;
// 银牌会员的计算策略
public class SilverMemberStrategy implements PromotionStrategy{
// 八折,如果金额超过300元,再折后立减20元
@Override
public long calculate(long amount) {
if(amount>300){
return amount/100*80-20;
}
return amount/100*80;
}
}
package com.sample.patterns.strategy;
// 金牌会员的计算策略
public class GoldenMemberStrategy implements PromotionStrategy{
// 打七折,如果金额超过300元,则直接按六折计算
@Override
public long calculate(long amount) {
if(amount>300){
return amount/100*60;
}
return amount/100*70;
}
}
package com.sample.patterns.strategy;
// 促销策略的上下文
public class PromotionContext {
// 促销策略接口
private PromotionStrategy promotionStrategy;
public PromotionContext(PromotionStrategy promotionContext){
this.promotionStrategy = promotionContext;
}
// 计算促销后的金额
public long calculate(long amount){
return promotionStrategy.calculate(amount);
}
}
package com.sample.patterns.strategy;
// 客户端测试类
public class PromotionClient {
public static void main(String[] args) {
// 四种促销策略的上下文
PromotionContext nonMemberContext = new PromotionContext(new NonMemberStrategy());
PromotionContext ordinaryMemberContext = new PromotionContext(new OrdinaryMemberStrategy());
PromotionContext silverMemberContext = new PromotionContext(new SilverMemberStrategy());
PromotionContext goldenMemberContext = new PromotionContext(new GoldenMemberStrategy());
// 以购买金额500为例,输出各种会员类型促销后的金额
System.out.println(nonMemberContext.calculate(500));
System.out.println(ordinaryMemberContext.calculate(500));
System.out.println(silverMemberContext.calculate(500));
System.out.println(goldenMemberContext.calculate(500));
}
}
-
它对扩展开放,对修改关闭,可以灵活地新增或者修改算法实现逻辑。 -
把算法的实现细节与使用算法的代码分隔开。 -
使用策略模式可以避免使用多重条件转移语句。
-
可能会产生大量的策略类,且功能单一、可复用性较低。 -
客户端必须知道所有的策略类,并知道它们之间的差异以便选择合适的那个。 -
增加了Context这个中间层,可能会带来设计上的复杂性和性能的一些损耗。
推荐阅读:
原文始发于微信公众号(互联网全栈架构):这个设计模式的用法,一般人我不告诉他
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/173663.html