今天学习了策略者模式,在此做下学习笔记,有什么问题请大家帮忙指出来,不胜感激,谢谢~
策略者模式(Strategy)是一种定义一系列算法的方法。从概念上来看,所有这些算法完成的都是 相同的工作,只是实现不同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合[DPE] 策略者模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出 这些算法中的公共功能[DP]。
当不同的行为放在一个类时,该类就包含了很多不同的算法,就需要要if或者switch语句来选择适应的行为,因此,策略者模式选择将这不同算法的类封装为不同的类,每一个算法对应一个类来消除分支判断,这样可以提高系统的维护。
就商场收银系统来说,需要有很多种情况,有时候商场要做活动打折,有时候是满100送10,有时候是满一百送100积分等等一系列情况,为了避免大量的判断需要把各种不同的算法放在各自不同的类。“策略者模式封装了变化”——策略者模式就是用来封装算法的,但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
uml图如下:
示例代码如下:
StrategyDemo主类:
public class StrategyDemo {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//每件物品打7.5折
final double rad=0.75;
final double price = 123;
CashContext cnt = new CashContext(new CashRebate(rad));
System.out.println("打完折后的价钱是:"+cnt.AlgrothmCash(price));
}
}
CashSuper接口 public interface CashSuper { public double GetCash(double price);//定义获取做完活动后的价格 }
//以下是不同的活动
CashContext类,来调用对应的对象CashNormal类 public class CashNormal implements CashSuper{ @Override public double GetCash(double price) { //没做活动,返回原来值 return price; } } CashRebate类: public class CashRebate implements CashSuper{ //打折活动 private double radio; public CashRebate(double rad) { radio = rad; } @Override public double GetCash(double price) { return radio*price; } } CashReturn类: public class CashReturn implements CashSuper{ private int ShoppingCash; private int ReturnCash; //现金返还,满几百返还几百 public CashReturn(int ShoppingCash,int ReturnCash) { this.ReturnCash = ReturnCash; this.ShoppingCash = ShoppingCash; } @Override public double GetCash(double price) { if(price>=ShoppingCash) { price -= ReturnCash; } return price; } }
CashContext类: public class CashContext { CashSuper Cash; public CashContext(CashSuper cashSuper) { Cash = cashSuper; } public double AlgrothmCash(double price) { return Cash.GetCash(price); } }
想想策略模式与简单工厂模式有什么不同呢?
仔细的比对了一下,发现策略模式降低了耦合度,封装得更彻底,只需要知道CashContext类就可以了,而简单工厂模式则相对耦合度要比策略模式高。