策略模式

发布时间 2023-10-22 20:24:02作者: NobodyHero

策略模式

考虑一个场景,顾客买东西计算商品的总金额。如果活动的计算方式不同,应该如何写? 比如打折,满减,积分活动。

思路一:简单工厂模式,把打折的模式进行分类抽象。满减,打折等等传参不同归为不同的计算模式,然后工厂类去根据参数生产对应的实例。  实例返回的参数可以用多态思想

例如不同模式返回的对象是不同的,我们可以让这些不同的对象类型继承一个类,这样返回的时候进行多态的转换之后即可。

工厂类:

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选择具体的策略,根据多态思想实例化出来不同算法相同的父类对象。然后再去调用不同算法重写的实现方法。

策略模式的应用场景是:可以把一类算法进行抽象归纳,继承同一个父类,重写同一个方法。