JAVA算法策略模式之商品打折 满x送x

时间:2021-11-01 13:11:43

场景:某超市收银台,营业员根据客户购买的商品和数量向客户收费.

问题:超市某段时间会有打折活动(例如打8折),满XXX元送XXX元活动,满XXX元送XXX积分活动等等.


算法类,可能是打折,满XX送XX等等

package com.hebo.test.designmode.strategy;

public abstract class Strategy {
//算法方法
public abstract void AlgorithmInterface();
}


打折算法实现

package com.hebo.test.designmode.strategy;
/**
* 模拟打折类
* @author HeBo
*
*/
public class ConcreteStrategyA extends Strategy {

@Override
public void AlgorithmInterface() {
System.out.println("打折算法实现..");
}

}

模拟满xx送xx元活动

package com.hebo.test.designmode.strategy;
/**
* 模拟满xx送xx元活动
* @author HeBo
*
*/
public class ConcreteStrategyB extends Strategy {

@Override
public void AlgorithmInterface() {
System.out.println("满XX送XX元算法实现..");
}

}

模拟满XX元送XX积分

package com.hebo.test.designmode.strategy;
/**
* 模拟满XX元送XX积分
* @author HeBo
*
*/
public class ConcreteStrategyC extends Strategy {

@Override
public void AlgorithmInterface() {
System.out.println("满XX元送XX积分算法实现..");
}

}

上下文

package com.hebo.test.designmode.strategy;

public class Context {
Strategy strategy;

public Context(String type){
if(type.equals("打折")){
strategy = new ConcreteStrategyA();
return;
}
if(type.equals("满就送")){
strategy = new ConcreteStrategyB();
return;
}
if(type.equals("送积分")){
strategy = new ConcreteStrategyC();
return;
}
}

//不使用工厂模式的构造函数
public Context(Strategy strategy){
this.strategy = strategy;
}
//上下文接口
public void ContextInterface(){
strategy.AlgorithmInterface();
}
}

测试类

package com.hebo.test.designmode.strategy;
/**
* 模拟收银台
* @author HeBo
*
*/
public class Test {

static Context context;

public static void main(String[] args) {

context = new Context("打折");
context.ContextInterface();

context = new Context("满就送");
context.ContextInterface();

context = new Context("送积分");
context.ContextInterface();

/*Context不使用工厂模式的测试代码
* context = new Context(new ConcreteStrategyA());
context.ContextInterface();

context = new Context(new ConcreteStrategyB());
context.ContextInterface();

context = new Context(new ConcreteStrategyC());
context.ContextInterface();*/

}

}

总结:策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。

策略模式的Strategy类为Context定义了一系列的可供重用的算法和行为。另外一个优点是简化了单元测试,每个算法都有自己的类,可以通过自己单独接口进行测试。