`
Will_Turner
  • 浏览: 68066 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

折扣计算策略--设计模式应用

阅读更多

折扣计算,策略模式和装饰模式的具体应用。

 

package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;

public abstract class AbstractDiscountStrategy {
	/**
	 * 单价
	 */
	protected BigDecimal price;
	/**
	 * 数量
	 */
	protected int copies;

	protected AbstractDiscountStrategy() {
	}

	/**
	 * @param price 单价
	 * @param copies 数量
	 */
	public AbstractDiscountStrategy(BigDecimal price, int copies) {
		this.price = price;
		this.copies = copies;
	}

	/**
	 * 计算折扣额度
	 * 
	 * @return
	 */
	public abstract BigDecimal calculateDiscount();
}

 

package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;
/**
 * 零折扣策略
 * @author Tang
 *
 */
public class NoDiscountStrategy extends AbstractDiscountStrategy {

	@Override
	public BigDecimal calculateDiscount() {
		return new BigDecimal(0);
	}

}

 

package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;

/**
 * 单位固定折扣额策略
 * @author Tang
 *
 */
public class FlatRateDiscountStrategy extends AbstractDiscountStrategy {
	/**
	 * 单位折扣额
	 */
	private BigDecimal discount;
	
	/**
	 * 
	 * @param price 单价
	 * @param copies 数量
	 * @param discount 单位折扣额
	 */
	public FlatRateDiscountStrategy(int copies, BigDecimal discount) {
		super.copies = copies;
		this.discount = discount;
	}
	
	@Override
	/**
	 * 总折扣额 = 数量 * 单位折扣额
	 */
	public BigDecimal calculateDiscount() {
		return new BigDecimal(copies).multiply(this.discount);
	}

}

 

package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;
/**
 * 折扣率策略
 * @author Tang
 *
 */
public class PercentageDiscountStrategy extends AbstractDiscountStrategy {
	/**
	 * 单位折扣率
	 */
	private BigDecimal percent;
	
	/**
	 * 
	 * @param price 单价
	 * @param copies 数量
	 * @param percent 单位折扣率
	 */
	public PercentageDiscountStrategy(BigDecimal price, int copies, BigDecimal percent) {
		super(price, copies);
		this.percent = percent;
	}

	@Override
	/**
	 * 总折扣额 = 单价 * 数量 * 单位折扣率
	 * 
	 */
	public BigDecimal calculateDiscount() {
		return price.multiply(new BigDecimal(copies)).multiply(this.percent);
	}

}

 

package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;
/**
 * 限制折扣额策略
 * @author Tang
 *
 */
public class RestrictedDiscountStrategy extends AbstractDiscountStrategy {
	/**
	 * 折扣额度上限
	 */
	private BigDecimal limit;
	private AbstractDiscountStrategy strategy;
	
	/**
	 * 
	 * @param strategy 宿主策略
	 * @param limit 折扣限制额度
	 */
	public RestrictedDiscountStrategy(AbstractDiscountStrategy strategy, BigDecimal limit) {
		this.limit = limit;
		this.strategy = strategy;
	}

	@Override
	/**
	 * 当折扣额超过折扣限制额度时,总折扣额变为限制折扣额
	 */
	public BigDecimal calculateDiscount() {
		BigDecimal preDiscount = this.strategy.calculateDiscount();
		if (this.limit.doubleValue() > 0 && preDiscount.compareTo(this.limit) > 0) {
			return this.limit;
		}
		return preDiscount;
	}

}

 

package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;

public class DiscountCalculator {
	/**
	 * 折扣策略
	 */
	private AbstractDiscountStrategy strategy;
	
	public DiscountCalculator(){}
	
	/**
	 * 
	 * @param strategy 具体折扣策略
	 */
	public DiscountCalculator(AbstractDiscountStrategy strategy){
		this.strategy = strategy;
	}
	
	
	public AbstractDiscountStrategy getStrategy() {
		return strategy;
	}

	public void setStrategy(AbstractDiscountStrategy strategy) {
		this.strategy = strategy;
	}

	public BigDecimal calculate(){
		return null;
	}
	
	public static void main(String[] args){
		BigDecimal price = new BigDecimal("99.99");
		int copies = 9;
		BigDecimal percent = new BigDecimal("0.12");
		BigDecimal discount = new BigDecimal("10");
		BigDecimal limit = new BigDecimal("100");
		
		AbstractDiscountStrategy noDiscount = new NoDiscountStrategy();
		AbstractDiscountStrategy percentStrategy = new PercentageDiscountStrategy(price, copies, percent);
		AbstractDiscountStrategy flatRateStrategy = new FlatRateDiscountStrategy(copies, discount);
		AbstractDiscountStrategy restrictedStrategy = new RestrictedDiscountStrategy(percentStrategy, limit);
		
		System.out.println("折扣前总额:"+price.multiply(new BigDecimal(copies)));
		System.out.println("零折扣策略总折扣额:"+noDiscount.calculateDiscount());
		System.out.println("折扣率策略总折扣额:"+percentStrategy.calculateDiscount());
		System.out.println("固定折扣额策略总折扣额:"+flatRateStrategy.calculateDiscount());
		System.out.println("限制折扣额策略总折扣额:"+restrictedStrategy.calculateDiscount());
	}
	
}
 
分享到:
评论

相关推荐

    java实验:设计模式2.doc

    java实验: 设计模式(单子、工厂、策略、组合、观察者模式)练习 在上次作业基础上,设计一个贩卖各类书籍的电子商务网站的购物车系统。该系统包括 的模块有: 模块1:图书目录的添加模块,实现对书本信息的增加。 ...

    二十三种设计模式【PDF版】

    3.J2EE 只是适合企业计算应用的框架软件,但是 GoF 的设计模式几乎可以用于任何应用!因此 GoF 的设计模式应该是 J2EE 的重要理论基础之一。 所以说,GoF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一座隐性...

    NextGen-POS:这是我们为第六学期课程所做的一个小项目,名为“软件分析和设计”

    包括计算税收(常规和按项目)以及对不同类型的策略应用折扣。 CustomerDiscounts.txt 此txt为VIP客户提供折扣 Day,Discount_Amount =>每行格式,这意味着将在DAY对VIP客户应用DISCOUNT_AMOUNT%的折扣。 客户.txt...

    Java经典编程源码基础例程300.zip

    实例064 策略模式的简单应用 98 实例065 适配器模式的简单应用 100 实例066 普通内部类的简单应用 102 实例067 局部内部类的简单应用 103 实例068 匿名内部类的简单应用 104 实例069 静态内部类的简单应用 105 实例...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例117 策略模式的简单应用 148 实例118 适配器模式的简单应用 149 实例119 普通内部类的简单应用 151 实例120 局部内部类的简单应用 152 实例121 匿名内部类的简单应用 153 实例122 静态内部类的简单应用 154 第2...

    购物商城系统源代码--004

    能为使用者提供各种有利的营销手段,实现网站经营者的营销策略,加强促销手段方式、会员等级折扣、虚拟货币、预付款、组合商品、套餐商品、点卡商品、赠品、定单的管理设置,实现访客下单等功能。最终为经营者带来...

    中顶洗浴管理系统 v8.7.zip

    4.强大的账单打印功能:支持账单的自设计,根据客户的多样需求自设计出符合客户自身的账单格式。 5.支持多种付款方式:如现金、刷卡等,用户还可根据需要增加设置其它的付款方式。 6.支持部分挂账:通常是对会员或...

    中顶足浴管理系统 v8.3.zip

    4.强大的账单打印功能:支持账单的自设计,根据客户的多样需求自设计出符合客户自身的账单格式。 5.支持多种付款方式:如现金、刷卡等,用户还可根据需要增加设置其它的付款方式。 6.支持部分挂账:通常是对会员或...

    移动营销策划方案设计.doc

    独立WAP网站模式 无线应用协议(wireless application protocol,WAP)向移动终端提供互联网内容和先进增值服务的协议标准,是简化了的无 线互联网协议。WAP将互联网和移动电话技术结合起来,使使用移动终端设备(如...

    移动营销策划方案设计(1).doc

    独立WAP网站模式 无线应用协议(wireless application protocol,WAP)向移动终端提供互联网内容和先进增值服务的协议标准,是简化了的无 线互联网协议。WAP将互联网和移动电话技术结合起来,使使用移动终端设备(如...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    综上所述,“认我测”在线认证检测系统,率先填补了认证检测领域移动端的空缺,提供了Web浏览器+移动端的双端访问模式,给用户提供了多种访问途径,真正实现了用户和检测机构的随时随地在线下单检测。 关键词:...

    开源基于STC15W4K61S4的微型四旋翼-电路方案

    经过试验这种控制策略应用在小四轴效果不太理想,因此我们通常采用的串级PID控制小四轴,即引入了角速度环,通常内环使用PD(对象角速度)外环使用PI(对象角度&内环输出)这样的控制策略在测试中效果较好,但理想的...

    siebel工作流管理指南

    计划工作流程规则的方案:30% 以上折扣通知 142 计划工作流程规则的方案:大量已打开的服务请求通知 143 定义工作流程规则的测试和迁移策略 144 关于创建工作流程规则 144 关于“工作流程规则”视图 144 定义工作...

Global site tag (gtag.js) - Google Analytics