面向对象编程经典例题 --- 收银系统设计

本文介绍了一个收银系统的实现,涉及销售税、进口税的计算以及不同商品的税率处理。通过面向对象编程设计,包括Tax接口、FixedRateTax和CompositeTax类来处理各种税种。同时,提出了ProductCategory、CatalogItem、OrderItem和Order等类来管理商品信息和购买记录。OrderManager和TaxManager接口用于处理订单和税收,Catalog接口用于获取商品信息。整个系统通过具体的类和接口相互协作,完成购物篮的结算过程。
摘要由CSDN通过智能技术生成

SALES TAXES

 

Basic sales tax is applicable at a rate of 10% on all goods, except books, food, and medical products that are exempt. Import duty is an additional sales tax applicable on all imported goods at a rate of 5%, with no exemptions.

 

When I purchase items I receive a receipt which lists the name of all the items and their price (including tax), finishing with the total cost of the items, and the total amounts of sales taxes paid. The rounding rules for sales tax are that for a tax rate of n%, a shelf price of p contains (np/100 rounded up to the nearest 0.05) amount of sales tax.

 

Write an application that prints out the receipt details for these shopping baskets...

 

INPUT:

 

Input 1:

1 book at 12.49

1 music CD at 14.99

1 chocolate bar at 0.85

 

Input 2:

1 imported box of chocolates at 10.00

1 imported bottle of perfume at 47.50

 

Input 3:

1 imported bottle of perfume at 27.99

1 bottle of perfume at 18.99

1 packet of headache pills at 9.75

1 box of imported chocolates at 11.25

 

OUTPUT

 

Output 1:

1 book : 12.49

1 music CD: 16.49

1 chocolate bar: 0.85

Sales Taxes: 1.50

Total: 29.83

 

Output 2:

1 imported box of chocolates: 10.50

1 imported bottle of perfume: 54.65

Sales Taxes: 7.65

Total: 65.15

 

Output 3:

1 imported bottle of perfume: 32.19

1 bottle of perfume: 20.89

1 packet of headache pills: 9.75

1 imported box of chocolates: 11.85

Sales Taxes: 6.70

Total: 74.68

 

首先我们看,税种这里有三种:

1. 免消费税;

2. 消费税;

3. 进口税。

则税种组合有以下两种:

1.免消费税+进口税

2.消费税+进口税

因此,我们可以设计一个Tax接口,里头包含一个方法名叫getTax,这个getTax方法作用就是返回纳税值,但是我们需要有哪些类来实现这个接口呢?

1.FixedRateTax,它拥有一个成员变量叫做rate,因此针对不同的实例,它拥有不同的rate,每一个实例对应某一种固定税率,因此其getTax传入的参数便为对应商品价格,返回值即为在此税率之下的相应税收。

2.CompositeTax,它拥有一个成员函数叫做addTax,因此它的作用就是整合某一商品它所包含的所有税收类型,因此其getTax同样传入的对应商品价格作为参数,返回值为某商品其对应的全部税收,事实上了就是一个对于税率类型的遍历,每一种税率类型对应一个FixedRateTax的实例,然后调用FixedRateTaxgetTax方法获得此税率之下的相应税收加入当前税收总和之中,最后返回当前价格下的全部税收总和。

UML图如下:

 

 

对应的代码实现如下:

Tax.java

package main.java.com.thoughtworks.demo.taxes;

import java.math.BigDecimal;

/**
 * This interface provides unified access to different taxation kinds.
 * 
 */
public interface Tax {
	
	/**
	 * Calculates the tax value for the given price.
	 * @param price the price
	 * @return the tax value
	 */
	BigDecimal getTax(BigDecimal price);

}
FixedRateTax.java
package main.java.com.thoughtworks.demo.taxes.impl;

import java.math.BigDecimal;
import java.math.RoundingMode;

import main.java.com.thoughtworks.demo.taxes.Tax;

/**
 * A fixed rate implementation of the {@link Tax} interface. It rounds taxes up
 * to the nearest 0.05.
 * 
 */
public class FixedRateTax implements Tax {
	
	private static final BigDecimal TICK_SIZE = new BigDecimal("0.05");
	
	private final BigDecimal rate;
	
	/**
	 * Creates a tax with the specified rate.
	 * @param rate the tax rate
	 */
	public FixedRateTax(BigDecimal rate) {
		this.rate = rate;
	}

	@Override
	public BigDecimal getTax(BigDecimal price) {
		return roundOff(price.multiply(rate));
	}
	
	private static BigDecimal roundOff(BigDecimal value) {
		return value.divide(TICK_SIZE).setScale(0, RoundingMode.UP).multiply(TICK_SIZE);
	}

}
CompositeTax.java

package main.java.com.thoughtworks.demo.taxes.impl;

import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.List;

import main.java.com.thoughtworks.demo.taxes.Tax;

/**
 * An implementation of the {@link Tax} interface that works as a superposition
 * of multiple taxes.
 * 
 */
public class CompositeTax implements Tax {
	
	private final List<Tax> taxes = new LinkedList<Tax>();
	
	/**
	 * Adds another tax to this composite.
	 * @param tax the tax to add
	 */
	public void addTax(Tax tax) {
		taxes.add(tax);
	}

	@Override
	public BigDecimal getTax(BigDecimal price) {
		BigDecimal result = BigDecimal.ZERO;
		for (Tax tax : taxes) {
			result = result.add(tax.getTax(price));
		}
		return result;
	}

}

说完了税收部分的设计,接下来的重点便是如何设计商品清单,

很显然如上输入所示,不同产品种类的货物对应不同的税率,因此首先我们要想到我们必须创建一个对应不同产品种类的类,使得这个类能够承载不同的产品类别及其对应的税率,这就是ProductCategory的由来。

有了ProductCategory之后,接下来我们需要考虑的就是针对每一件商品,我们都必须给予它一个条目详情,该条目详情包含四个属性,分别为商品ID,商品条目名称,商品价格,商品是否进口以及商品的类别(即为ProductCategory),通过这样的方式,我们就对每一条商品进行了登记,我们称之为CatalogItem

有了CatalogItem还不够,因为CatalogItem只是对商品的总体信息进行了登记,并没有记录用户实际买卖的信息,因此对于用户实际的某一条购买记录,我们创建一个类叫做OrderItem,显然每一条这个记录对应于某一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值