`
Will_Turner
  • 浏览: 69494 次
  • 性别: 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设计模式例程-策略模式

    在这个“JAVA设计模式例程-策略模式”的压缩包中,我们可以深入探讨策略模式的原理及其应用。 策略模式的核心思想是定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略对象的使用让算法的变化独立...

    java设计模式--策略模式

    在HeadFirst的《设计模式》第一章中,作者可能会通过一个生动的场景来解释策略模式,比如购物车计算折扣的例子。在这个例子中,`DiscountStrategy`是策略接口,`FixedDiscount`, `PercentageDiscount`和`NoDiscount`...

    C++设计模式课件4_策略模式.pdf

    ### C++设计模式课件4_策略模式.pdf #### 知识点概览 - **设计模式概述** - **策略模式动机分析** - **模式定义与结构解析** - **策略模式应用实例** - **策略模式优缺点分析** #### 设计模式概述 设计模式是一种...

    设计模式之策略模式,商场收银,封装算法

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式就是为了解决这类问题而提出的,它将每种算法封装到具有共同接口...

    java设计模式-策略模式

    策略模式是设计模式中的一种行为模式,它的主要目的是使算法可以在运行时动态选择。在这个“java设计模式-策略模式”的示例中,我们将深入探讨如何使用策略模式来实现一个简单的超市促销系统。 策略模式的核心思想...

    软件设计模式大作业

    二、 设计模式应用 1. 简单工厂模式 简单工厂模式用于实现蛋糕订购系统的工厂类,负责创建不同的蛋糕对象。 2. 工厂方法模式 工厂方法模式用于实现蛋糕订购系统的工厂接口和工厂实现类,负责创建不同的蛋糕对象...

    策略模式在实际项目中的应用一

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通过定义一系列算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户。这种模式的主要优点是增加了灵活性...

    设计模式大作业-蛋糕预定系统实验报告.pdf

    1. 设计模式在蛋糕预定系统中的应用。 2. Java编程语言的使用。 3. MyEclipse开发环境的使用。 4. MySQL数据库的应用。 5. JDK版本的应用。 6. 软件开发流程(如从需求分析、系统设计到编码实现)。 7. 接口与实现类...

    Java设计模式教程-策略模式Java开发Java经验技

    5. 策略模式在实际问题中的应用示例,如价格计算策略、排序策略等。 6. 策略模式的优点和适用场景,以及可能存在的缺点和注意事项。 文件名"赚钱项目"可能与实际的项目案例有关,资料中可能包含如何运用策略模式...

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种灵活的方式来处理这种情况,通过将每种算法封装为一个...

    设计模式教程-策略模式

    策略模式是一种设计模式,它将特定情境下的行为或算法封装为独立的对象,使得这些行为可以在运行时动态地互换而不影响整体系统结构。这种模式强调的是将策略对象和使用策略的上下文对象解耦,从而提高了代码的灵活性...

    策略模式-电影订票程序

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在电影订票程序中,策略模式的应用能够灵活地处理不同的定价策略,比如普通票价、会员优惠价、节假日特惠等。通过这种方式,我们可以避免硬编码各种...

    java的Strategy模式设计应用--小型电子商务系统简单模拟

    在软件设计领域,Strategy模式是一种行为设计模式,它使你能在运行时改变对象的行为。...通过学习和实践这样的设计模式,开发者可以更好地理解和掌握如何在实际项目中应用设计模式,提升软件设计的质量和效率。

    设计模式策略模式demo

    标题"设计模式策略模式demo"指的是我们将通过一个实际的示例来演示如何在代码中应用策略模式。这个示例可能是基于Java或C#等语言的一个小项目,用于帮助开发者更好地理解和掌握策略模式的运用。 描述中的"参考...

    设计模式—策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并让它们之间可以互相...

    设计模式系列之策略模式

    在实际应用中,策略模式可以结合其他设计模式,比如工厂模式来创建策略对象,或者组合模式来管理多个策略。此外,策略模式也可以与其他行为模式(如职责链模式、命令模式)结合,以解决更复杂的问题。 总的来说,...

    [行为模式] head first 设计模式之策略模式(strategy)

    例如,订单处理系统中,根据不同的促销活动策略,选择不同的折扣计算方式;在图形用户界面中,根据用户的操作行为,选择不同的事件处理策略等。 Head First 设计模式的文档中,会详细讲解策略模式的类图、实例代码...

    设计模式浅谈1——策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件工程中,我们经常遇到需要根据不同条件或场景动态地改变算法的情况。策略模式就是为了解决这类问题而诞生的,它允许我们用不同的策略(即算法)...

    策略模式.doc之java 设计模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通过定义一个策略接口和一系列实现这个接口的具体策略类,使得系统可以在运行时选择并应用不同的策略。这种模式的主要优点是提高了...

    02策略模式.zip

    6. **策略模式-商场管理软件05简单工厂和策略模式**:结合了简单工厂和策略模式,可能说明如何在实际应用中同时使用这两种模式,以更灵活地创建和切换不同的计算策略。 7. **策略模式-商场管理软件06反射**:反射是...

Global site tag (gtag.js) - Google Analytics