目标:我们需要一个计算价格的类,有时候会打折
1.我们先设计一个接口
public interface PriceCalculationStrategy {
public double calculatePrice(double price , double copies);
public boolean match(double price , double copies);
}
2.我们有一些计算实现
public class DefaultDiscountPriceCalStrategy implements PriceCalculationStrategy{
public double rate = 0.1;
public double calculatePrice(double price, double copies) {
return price * copies * rate;
}
@Override
public boolean match(double price, double copies) {
return false; //这是不可能的
}
}
public class NoDiscountPriceCalStrategy implements PriceCalculationStrategy{
public double calculatePrice(double price, double copies) {
return price * copies;
}
public boolean match(double price, double copies) {
return price < 300;
}
}
public class DiscountPriceCalStrategy implements PriceCalculationStrategy{
public double rate ;
public double calculatePrice(double price, double copies) {
return price * copies * rate;
}
public void setDiscount(double rate) {
this.rate = rate;
}
public boolean match(double price, double copies) {
boolean match = false;
if(price >= 300 && price <1000){
setDiscount(0.9);
match = true;
}else if( price >=1000){
setDiscount(0.8);
match = true;
}
return match;
}
}
3.计算工具类,发现我们根本不要自己判断,每个策略自己判断执不执行
public class PriceCalculationUtil {
public static List<PriceCalculationStrategy> priceCalculationStrategys = new ArrayList<PriceCalculationStrategy>();
static{ //等价于 容器内查找所有策略
PriceCalculationStrategy pcs = new NoDiscountPriceCalStrategy();
PriceCalculationStrategy pcs1 = new DiscountPriceCalStrategy();
DefaultDiscountPriceCalStrategy defaultD =new DefaultDiscountPriceCalStrategy();
priceCalculationStrategys.add(pcs);
priceCalculationStrategys.add(pcs1);
priceCalculationStrategys.add(defaultD);
}
public static double priceCalculation(double price , double copies) {
for (PriceCalculationStrategy strategy : priceCalculationStrategys) {
if( strategy.match(price, copies)){
return strategy.calculatePrice(price, copies);
}
}
//优先其他策略,我不会告诉你我打的广告“ 1折 商品 ” 是假的,你看我有这个策略的
DefaultDiscountPriceCalStrategy defaultD = new DefaultDiscountPriceCalStrategy();
return defaultD.calculatePrice(price, copies);
}
}
4.测试
public class PriceCalculationUtilTest {
@Test
public void testPriceCalculation(){
assertEquals(200,PriceCalculationUtil.priceCalculation(100, 2),0);
assertEquals(360,PriceCalculationUtil.priceCalculation(400, 1),0);
assertEquals(800,PriceCalculationUtil.priceCalculation(1000, 1),0);
}
}
分享到:
相关推荐
自己模拟实现struts的dispatcherAction 模拟struts DispatcherAction 反射 xml
使用servlet模拟struts1的工作原理,解析xml,处理请求,自动封装数据
用sevrlet模拟Struts2的简单功能。从拦截请求、解析自定义xml数据文件以及动态生成action的代理去执行目标方法,并实现了简单的日志拦截【interceptor】
MVC模式和Struts框架
模拟struts2框架的功能,用java模拟实现struts2的基础功能。
模拟STRUTS的小项目模拟STRUTS的小项目
模拟Struts2拦截器代码,模拟struts2拦截器的实现
struts2 自定义框架 struts2框架模拟-教学示范代码
模拟struts2代码+文档
使用servlet模拟struts1的工作原理,解析xml,处理请求,自动封装数据
简单的struts2模拟代码,建议初学者可以看看。
模拟Struts框架
这是一个用servlet模拟struts_mvc框架的一个案例,通过案例可以让我们更好的懂得MVC框架的运行原理(面试经常考)。
模拟Struts责任链工作流及简单AOP实现
我手写的struts,有什么不足请各位大虾多多指教~~
模拟Struts的工作原理编程实现模拟技术
Struts+DAO+工厂模式+委托模式+值对象模式!
struts1.1+ejb模拟项目 struts1.1+ejb模拟项目 struts1.1+ejb模拟项目 struts1.1+ejb模拟项目 struts1.1+ejb模拟项目
模拟struts1写的代码+文档分析
讲述基于MVC模式的Struts框架中Ajax研究与应用..........