场景:某超市收银台,营业员根据客户购买的商品和数量向客户收费.
问题:超市某段时间会有打折活动(例如打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定义了一系列的可供重用的算法和行为。另外一个优点是简化了单元测试,每个算法都有自己的类,可以通过自己单独接口进行测试。