今天要写一个基于字符界面的简易收银台小程序。首先来分析一下我们都需要创建哪些类。
既然是收银台,那必不可少的就是货物和订单啦。因此我们首先必须将货物和订单分别抽象出一个类来,同时还需一个货物中心和商品中心分别对货物和商品进行管理。为了增加其灵活可扩展性,我们决定用接口的方式来实现货物中心和商品中心这两个类。最后我们需要一个主类来对订单中心和商品中心进行一系列的操作调度。因此我们的类结构就很清晰了。
类结构图示如下:
每个类之间的关系如图:
接下来,我们来分析各部分代码的功能及实现:
(1)商品类
对于一个商品,我们需知道他的基本属性:商品id、商品名称、商品价格。结构较简单
代码实现如下:
/**
* 名称:商品表
**/
public class Goods {
private String name;
private double price;
private String id;
public Goods( String id, String name, double price) {
this.name = name;
this.price = price;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//对每个商品的输出格式加以规定
public String toString(){
return String.format("[%2s] %s %.2f",this.getId(),this.getName(),this.getPrice());
}
}
(2)订单类
对于每个订单,必须要有其相应的订单编号,同时还应有该张订单上的产品信息,以及这些产品的总价钱。因为每张订单上都不只有一个产品,因此我们需要用一个Map的集合来存储这些产品信息,key和value分别代表产品id和产品数量。同时,订单还必须提供添加一定数量的商品,取消一定数量的商品,清空订单这3个基本功能·。
代码实现如下:
/**
* 名称:订单表
**/
public class Order {
private final String orderId; //订单编号
private final Map<String,Integer> goodsInfo=new HashMap<>();//产品信息
private double countMoney=0.0D;
public Order(String orderId) {
this.orderId = orderId;
}
public String getOrderId() {
return orderId;
}
public Map<String, Integer> getOrderInfo() {
return goodsInfo;
}
public double getCountMoney() {
return countMoney;
}
//添加商品及数量
public void add(String id, Integer n){
int sum=0;
if(goodsInfo.containsKey(id)){
sum=goodsInfo.get(id)+n;
}else{
sum=n;
}
this.goodsInfo.put(id,sum);
}
//取消商品及数量
public void cancle(String id,Integer n){
if(goodsInfo.containsKey(id)){
int sum=goodsInfo.get(id);
sum-=n;
if(sum<0){
this.goodsInfo.remove(id);
}else{
this.goodsInfo.put(id,sum);
}
}
}
//清空订单商品
public void clear(){
this.goodsInfo.clear();
}
//计算订单总价
public double totleMoney(){
double summoney=0.00;
for(Map.Entry<String,Integer> entry:goodsInfo.entrySet()){
summoney+=entry.getValue()*getCountMoney();
}
return summoney;
}
}
(3)商品中心接口及其实现类
//商品中心接口
interface GoodsCenter {
public void addGoods(Goods goods); //添加商品
public void removeGoods(String goodsid);//移除商品
public void updateGoods(Goods goods);//更新商品
public boolean isExistGoods(String goodsid);//判断商品是否存在
public Goods getGoods(String goodsid);//获取商品
public String listGoods();//列举所有商品
public void store();//存储商品信息
public void load(); //加载商品信息
}
实现代码如下:
/**
* 商品中心
**/
public class SimpleGoodsCenter implements GoodsCenter {
private final Map<String,Goods> goodsmap=new HashMap<String,Goods>();
private String goodsFilePath=System.getProperty("user.dir")+File.separator+"goods.txt";
//添加商品
public void addGoods(Goods goods) {
this.goodsmap.put(goods.getId(),goods);
}
//删除商品
public void removeGoods(String goodsid) {
this.goodsmap.remove(goodsid);
}
//更新商品
public void updateGoods(Goods goods) {
if(goodsmap.containsKey(goods.getId())){
goodsmap.put(goods.getId(),goods);
}
}
//判断商品是否存在
public boolean isExistGoods(String goodsid) {
if(this.goodsmap.containsKey(goodsid))
return true;
else
return false;
}
public Goods getGoods(String goodsid) {
return this.goodsmap.get(goodsid);
}
//商品清单
public String listGoods(){
StringB