策略模式
考虑一个场景,顾客买东西计算商品的总金额。如果活动的计算方式不同,应该如何写? 比如打折,满减,积分活动。
思路一:简单工厂模式,把打折的模式进行分类抽象。满减,打折等等传参不同归为不同的计算模式,然后工厂类去根据参数生产对应的实例。 实例返回的参数可以用多态思想
例如不同模式返回的对象是不同的,我们可以让这些不同的对象类型继承一个类,这样返回的时候进行多态的转换之后即可。
工厂类:
CashSuper cs = null; 多态的父类//
switch(打折模式){
case:满减
cs = new cashNormal()
break;
case:满300返10
CashReturn cs = new cashReturn("300",100)
cs = cr1;
break;
.....
这里在工厂类,定义了具体的打折细节参数,以至于我们如果对打折的具体改动就需要改工厂类。
}
思路二:策略模式。在简单工厂的外面再封装一层Context类,用处是接受传入的模式,并调用其重写的方法。因为所有的模式都是继承了一个接口并重写一个公共方法。
这样我们不用每次去改工厂类
在业务逻辑代码中
CashContext cc = null;
switch(打折模式){
case:满减
cc = new cashContext(new cashNormal())
break;
case:满300返10
CashReturn cs = new cashContext(new CashReturn("300",100))
cs = cr1;
break;
思路三:策略+简单工厂
把模式选择从业务代码移动到策略Context类里面。
public class CashContext{ private CashSuper cs; //通过构造方法,传入具体的收费策略 public CashContext(int cashType){ switch(cashType){ case 1: this.cs = new CashNormal(); break; case 2: this.cs = new CashRebate(0.8d); break; case 3: this.cs = new CashRebate(0.7d); break; case 4: this.cs = new CashReturn(300d,100d); break; } } public double getResult(double price,int num){ //根据收费策略的不同,获取计算结果 return this.cs.accpetCash(price,num) } }
这样在业务逻辑代码中直接调用即可。
总结:策略模式和简单工厂模式的不同之处在于。 策略模式是用来对一系列算法抽象,得出不同的策略。 简单工厂方法,对于不同的参数,去生产不同实例,生产的不同实例之间更具有各自的特异性。
策略模式的精髓在于Context层。
返利计算,普通计算,积分计算等等都是一系列的算法,我们把这些算法通过继承思想继承到CashSuper接口,这是简单工厂方法:工厂类去调用CashSuper
再到策略模式,加入Context
Context用switch选择具体的策略,根据多态思想实例化出来不同算法相同的父类对象。然后再去调用不同算法重写的实现方法。
策略模式的应用场景是:可以把一类算法进行抽象归纳,继承同一个父类,重写同一个方法。
标签:case,策略,模式,break,cs,new From: https://www.cnblogs.com/dwj-ngu/p/17781018.html