策略模式(Strategy Pattern)

策略模式 (Strategy Pattern)

定义

它是将定义的算法家族、分别封装起来,让它们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。

可以避免多重分支的 if-else、switch语句。

属于行为型模式。

适用场景

  1. 如果系统中有很多类,而他们的区别仅在于它们的行为不同。
  2. 一个系统需要动态地在几种算法中选择一种。
  3. 需要屏蔽算法规则。

标准示例

IStrategy:策略抽象类

java 复制代码
public interface IStrategy{
	void algorithm()
}

ConcreteStrategyA:具体策略A

java 复制代码
public class ConcreteStrategyA implements IStrategy{
	public void algorithm(){
		System.out.println("Strategy A");
	}
}

ConcreteB: 具体策略B

java 复制代码
public class ConcreteStrategyB implements IStrategy{
	public void algorithm(){
		System.out.println("Strategy B");
	}
}

Context:上下文,用来操作策略的决策层面,会开放给客户端。

java 复制代码
public class Context{
	private IStrategy strategy;
	public Context(IStrategy strategy){
		this.strategy = strategy;
	}
	public void algorithm(){
		strategy.algorithm();
	}
}

ClientTest

java 复制代码
public class ClientTest{
	public static void main(String[] args){
		//选择具体策略
		IStrategy strategy = new ConcreteStrategyA();
		//上下文
		Context context = new Context(strategy);
		//执行上下文的算法
		context.algorithm();		
	}
}	

策略模式封装了算法,在实际中,各种电商的优惠活动,经常会有不同的计算方法。我们就通过一个优惠的例子来看一下,策略模式的应用。

我们先提供一个抽象的优惠策略类 PromotionStrategy

然后创建4个优惠策略实现类:
CouponStrategyGroupBuyStrategyCashRefundStrategyDefaultStrategy

最后,通过 策略的上下文,来实现策略的调用:StrategyContext

java 复制代码
public abstract class PromotionStrategy {
    abstract void promotionCalculate();
}
java 复制代码
public class CouponStrategy extends PromotionStrategy{
    void promotionCalculate() {
        System.out.println("coupon strategy ...");
    }
}
java 复制代码
public class GroupBuyStrategy extends PromotionStrategy{
    void promotionCalculate() {
        System.out.println("group buy strategy ...");
    }
}
java 复制代码
public class CashRefundStrategy extends PromotionStrategy{
    void promotionCalculate() {
        System.out.println("cash refund strategy...");
    }
}
java 复制代码
public class DefaultStrategy extends PromotionStrategy{
    void promotionCalculate() {
        System.out.println("default strategy ...");
    }
}
java 复制代码
public class StrategyContext {
    private static Map<String, PromotionStrategy> PROMOTIONS = new HashMap<String, PromotionStrategy>();
	//对算法进行了封装
    static {
        PROMOTIONS.put("COUPON", new CouponStrategy());
        PROMOTIONS.put("GROUPBUY", new GroupBuyStrategy());
        PROMOTIONS.put("CASHREFUND", new CashRefundStrategy());
    }
	//使得调用方通过传入String,即可选择相应的算法
    public PromotionStrategy getPromotion(String promotion) {
        PromotionStrategy strategy = PROMOTIONS.get(promotion);
        return strategy == null ? new DefaultStrategy() : strategy;
    }
}

客户端调用类:

java 复制代码
public class ClientTest {
    public static void main(String[] args) {
        StrategyContext context = new StrategyContext();
        PromotionStrategy strategy = context.getPromotion("COUPON");
        strategy.promotionCalculate();
    }
}

输出结果:

java 复制代码
coupon strategy ...

以上就是策略模式的全部内容,感谢阅读。

相关推荐
张小姐的猫17 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
杨充20 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充20 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充20 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充20 小时前
2.面向对象的特性
设计模式
杨充20 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充20 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充20 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法