买水果

买水果

class TestClass {

	static String FRUIT_MANGO = "MANGO";
	static String FRUIT_APPLE = "APPLE";
	static String FRUIT_Berry = "Berry";

	public static void main(String[] args) {
		
		
		
		//要买的水果,硬编码
		Fruit [] fruits = {
		GeneFruit.getFruit(FRUIT_MANGO, 50d, 3),
		GeneFruit.getFruit(FRUIT_APPLE, 30d, 5),
		GeneFruit.getFruit(FRUIT_Berry, 10d, 10)};
		
		//参与满减
		boolean flag = true;
		
		try{

		//买单,导包原因此处未使用BigDecimal,会导致精度丢失
		double sum = payBill(fruits);

		System.out.println("原价须付"+sum+"元");
		
		
		//当有折扣和减免时,硬编码
		double discount = 0.8d;
		double reduction = 5d;
		

		System.out.println("参加折扣和直接见面后须付"
						   + String.format("%.2f",
						   CountPrice.getPrice(sum,discount,
							   reduction))
						   +"元 (原价:" + sum +
						   "元,折扣:" + discount
						  +"元,直接减免:" + reduction
						  +"元。)");
			
		//有折扣、减免、满减的情况	
		if(flag){
			System.out.println("参与满100减10活动后须付"+
							   String.format("%.2f",
						   CountPrice.getPriceA(sum,discount,
							   reduction,flag))
							  + "元。");
		}
			
			
		}catch(Exception e){
			
			System.out.println("计算价格抛出异常,此处进行异常处理!");
		}
		
	}

	/**
	 * 买单
	 */
	static double payBill(Fruit [] fruits) throws Exception{
		double sum = 0d;
		for(Fruit f : fruits){
			sum += f.sumPrice();
		}

		return sum;
	}


}

/**
 * 计价类
 * 业务逐渐复杂化,添加了折扣或者减免时,为提高代码可读性,将计价逻辑单独提	出来
 * */
class CountPrice{
	static double sumPrice = 0d;

	//参与折扣和减免
	static double getPrice(
		double oriPrice, 
		double discount, 
		double reduction){

		sumPrice = oriPrice*discount-reduction;
		return sumPrice;

	}
	
	/**
	 * 参与折扣、减免、满减
	 * 假设是在打完折和减去减免的基础上再满减
	 * */
	static double getPriceA(
		double oriPrice, 
		double discount, 
		double reduction,
		boolean flag){
		
		//满减次数
		int ct = 0;
		//参与满减前的总价
		sumPrice = oriPrice*discount-reduction;
		
		// 此处硬编码,满100减10元
		 
		if(flag){
			ct = (int)sumPrice / 100;
			if(ct >= 1)
			sumPrice -= ct*10;	
		}
			
		return sumPrice;

	}
	
}

/**
 *水果类
 */
abstract class Fruit{
	public double price;
	public int weight;

	//计算单种水果总价格
	public double sumPrice()throws Exception{
		
		return price*weight;
	}

}

/**
 * 芒果类
 * */
class Mango extends Fruit{

	Mango(double price, int weight){
		this.price = price;
		this.weight = weight;
	}


}

/**
 * 苹果类
 * */
class Apple extends Fruit{

	Apple(double price, int weight){
		this.price = price;
		this.weight = weight;
	}


}

/**
 * 草莓类
 * */
class Berry extends Fruit{

	Berry(double price, int weight){
		this.price = price;
		this.weight = weight;
	}


}

/**
 * 工厂模式:工厂类
 * */
class GeneFruit{
	static Fruit getFruit(String name, double price, int weight){
		Fruit fruit = null;
		switch(name){
			case "MANGO":
				fruit = new Mango(price, weight);
				break;

			case "APPLE":
				fruit = new Apple(price, weight);
				break;

			case "Berry":
				fruit = new Berry(price, weight);
				break;
		}
		return fruit;	
	}


}

相关文章

买水果
比较全面的redis工具类
gson 反序列化到多态子类
java 版本的 mb_strwidth
JAVA 反转字符串的最快方法,大概比StringBuffer.reverse()性...
com.google.gson.internal.bind.ArrayTypeAdapter的实例源码...