策略模式(Strategy):它定义了算法家族,分别进行了封装,让他们之间可以相互转换,这种变化不会影响到使用算法的用户。
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式就是用来封装算法的,在实践中,可以用它来封装几乎任何类型的规则,在分析过程中需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
类图:
举一个商场打折的例子(老套路),打折,返现,原价收费。
//package com.dlut.designpattern.strategy;
abstract class MarketStrategy {
public abstract void discount();
}
class NormalPay extends MarketStrategy{
@Override
public void discount() {
System.out.println("不打折,正常价.");
}
}
class DiscountPay extends MarketStrategy{
@Override
public void discount() {
System.out.println("有折扣,打8折.");
}
}
class CashBackPay extends MarketStrategy{
@Override
public void discount() {
System.out.println("有返现,返100.");
}
}
class CustomContext{
private MarketStrategy marketStrategy=null;
public void setStrategy(MarketStrategy m){
this.marketStrategy=m;
}
public void pay(){
marketStrategy.discount();
}
}
测试类:
//package com.dlut.designpattern.strategy;
public class Test {
public static void main(String[] args) {
CustomContext c=new CustomContext();
c.setStrategy(new NormalPay());
c.pay();
c.setStrategy(new DiscountPay());
c.pay();
c.setStrategy(new CashBackPay());
c.pay();
}
}
运行结果:
不打折,正常价.
有折扣,打8折.
有返现,返100.
到这里,大家可能会发现一个问题:这个策略模式貌似和我们上一篇介绍的《设计模式_状态模式(Java)》极其相似。确实,要想恰当的使用状态模式和策略模式,必须要搞清楚他们之间的区别。
策略模式与状态模式的区别
- 它们的意图不同。状态模式帮助对象管理状态,强调的是运行时根据状态来改变行为;而策略模式允许Client程序员(Test类)选择不同的行为。
- 是谁促使了行为的改变?策略模式中,是Client(Test类)提供了不同的策略给Context(CustomContext类);在状态模式中,状态转移一般由Context来管理。
只要遵循这两个区别的方法,我想能够很快地分辨出策略模式和状态模式。其中,尤其要注意第二条“是谁促使了行为的改变”。如果不太懂这句话,那移步到《设计模式_状态模式(Java)》温习一下状态模式。
参考:
- 《大话设计模式》
- http://www.cnblogs.com/wenjiang/archive/2013/02/28/2937623.html
- http://blog.csdn.net/wulingmin21/article/details/6712684
- http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
- http://blog.csdn.net/hguisu/article/details/7558249/
- http://www.ciaoshen.com/2016/06/30/strategyStatePattern-md/