这章节我们用学过的知识做个小卖铺的功能。
需求:
1.小卖铺提供商品查询的功能,收费结账功能;
2.消费者付费,获取商品
虚拟场景:裤兜里只有100元的小马步行到天天向上小卖铺,查看小卖铺的所有商品(100件商品),从中间挑出几商品,价格合计接近100元。
小马拿者商品走到收银台结账,那么小马结完账后,兜里还有多少钱,买了几样什么商品?
代码实现
//首先,我们先创建商品实体,先简单的描述商品名称,价格
public class Good {
//商品名称
private String name;
//商品价格
private double price;
//构造函数,创建商品的同时给予赋值
public Good(String name, double price) {
this.name = name;
this.price = price;
}
//获取名称
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;
}
//打印商品时,可以直观的查看商品实体
@Override
public String toString() {
return "Good{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
补充: 一般来说,类中的属性都是私有变量,是不提供给其他类直接调用的,如果需要暴露私有变量,就要增加set 、get方法,这是Java里默认的规则,idea中可以通过alt+insert快捷键创建set,get方法。toString 方法是为了打印类似,可以格式化的显示出类的必要属性, @Override表示重写了默认的toString方法。
//小卖铺类
public class Shop {
//小卖铺名称
private String name ;
//小卖铺地址
private String address;
//小卖铺商品
private List<Good> goods;
//构造函数时,初始化
public Shop() {
//初始化,赋值名称
this.name = "天天向上小卖铺";
//初始化,赋值地
this.address = "深圳腾讯大夏隔壁的天天向上小卖铺";
this.goods = new ArrayList<>();
//随机函数
Random random = new Random();
for (int i = 0; i < 100; i++) {
//"A_" + i 通过字符串拼接来创建商品名称 random.nextInt 随机生成一个小于100的数值
goods.add(new Good("A_" + i, random.nextInt(100)));
}
}
}
//我们已经构建了一个小卖铺实体类
//接着我们要增加小卖铺的功能
/**
* 获取全部商品
*
* @return
*/
public List<Good> getGoods() {
return goods;
}
/**
* 根据商品名称获取商品
*
* @param name
* @return
*/
public List<Good> getGoods(String name) {
List<Good> newGoods = new ArrayList<>();
if (name != null) {
for (Good good : goods) {
//判断String是否相等要用equals 判断
if (good.getName().equals(name)) {
newGoods.add(good);
}
}
}
return newGoods;
}
/**
* 根据金额简单刷选商品
*
* @param money
* @return
*/
public List<Good> chooseGoods(double money) {
double totalMoney = 0;//用来记录已加入购物车的商品总价格
List<Good> newGoods = new ArrayList<>();//购物车
for (Good good : goods) {
if (good.getPrice() <= money) {
//当购物车的总价格大于输入的金额时,跳过这次循环
if ((totalMoney+good.getPrice()) > money) {
continue;
}
newGoods.add(good);
//totalMoney = totalMoney+good.getPrice() 可以简写成下面的格式
totalMoney += good.getPrice();
}
}
return newGoods;
}
商品,小卖铺基础设施已经构建好了,还差一个顾客小马
/**
* 顾客
*/
public class Customer {
//顾客名称
private String name;
//钱包
private double wallet;
//已购买的商品
private List<Good> purchasedGoods;
public Customer(String name, double wallet) {
this.name = name;
this.wallet = wallet;
}
}
//代码中省略了set get方法
创建一个Test类,来运行我们刚刚设计的场景:
//Scanner 在控制台输入后按enter结束输入
public class Test {
public static void main(String[] args) {
//获取输入类
Scanner sc = new Scanner(System.in);
Shop shop = new Shop();
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入钱包的金额:");
String wallet = sc.nextLine();
//Double.valueOf(wallet) 将string转换为double
Customer customer = new Customer(name, Double.valueOf(wallet));
System.out.println("顾客" + name + "创建了 " + customer);
System.out.println("查看所有商品请输入:ALL");
System.out.println("查询商品请输入:A_+商品序号");
String type = sc.nextLine();
if (type == null || "".equals(type)) {
System.out.println("输入有误!");
} else if (type.equals("ALL")) {
List<Good> goods = shop.getGoods();
for (Good good : goods) {
System.out.println("商品名称:" + good.getName() + "," + "商品价格:" + good.getPrice());
}
} else if (type.indexOf("A_") > -1) {
System.out.println(shop.getGoods(type));
} else {
System.out.println("输入有误!");
}
System.out.println(customer.getName() + "购买了:" + shop.chooseGoods(customer.getWallet()));
}
}
--------------------------------------------------------------
output
请输入你的姓名:
小马
请输入钱包的金额:
100
顾客小马创建了 Customer{name='小马', wallet=100.0, purchasedGoods=null}
查看所有商品请输入:ALL
查询商品请输入:A_+商品序号
ALL
商品名称:A_0,商品价格:53.0
商品名称:A_1,商品价格:86.0
商品名称:A_2,商品价格:90.0
商品名称:A_3,商品价格:58.0
商品名称:A_4,商品价格:10.0
商品名称:A_5,商品价格:8.0
商品名称:A_6,商品价格:65.0
商品名称:A_7,商品价格:44.0
商品名称:A_8,商品价格:54.0
商品名称:A_9,商品价格:86.0
商品名称:A_10,商品价格:82.0
商品名称:A_11,商品价格:67.0
商品名称:A_12,商品价格:38.0
商品名称:A_13,商品价格:95.0
商品名称:A_14,商品价格:13.0
商品名称:A_15,商品价格:64.0
商品名称:A_16,商品价格:99.0
商品名称:A_17,商品价格:98.0
商品名称:A_18,商品价格:34.0
商品名称:A_19,商品价格:53.0
商品名称:A_20,商品价格:69.0
商品名称:A_21,商品价格:19.0
商品名称:A_22,商品价格:85.0
商品名称:A_23,商品价格:85.0
商品名称:A_24,商品价格:20.0
商品名称:A_25,商品价格:61.0
商品名称:A_26,商品价格:66.0
商品名称:A_27,商品价格:12.0
商品名称:A_28,商品价格:62.0
商品名称:A_29,商品价格:60.0
商品名称:A_30,商品价格:41.0
商品名称:A_31,商品价格:87.0
商品名称:A_32,商品价格:85.0
商品名称:A_33,商品价格:16.0
商品名称:A_34,商品价格:26.0
商品名称:A_35,商品价格:93.0
商品名称:A_36,商品价格:57.0
商品名称:A_37,商品价格:10.0
商品名称:A_38,商品价格:83.0
商品名称:A_39,商品价格:67.0
商品名称:A_40,商品价格:81.0
商品名称:A_41,商品价格:99.0
商品名称:A_42,商品价格:82.0
商品名称:A_43,商品价格:66.0
商品名称:A_44,商品价格:1.0
商品名称:A_45,商品价格:42.0
商品名称:A_46,商品价格:66.0
商品名称:A_47,商品价格:70.0
商品名称:A_48,商品价格:32.0
商品名称:A_49,商品价格:62.0
商品名称:A_50,商品价格:15.0
商品名称:A_51,商品价格:66.0
商品名称:A_52,商品价格:17.0
商品名称:A_53,商品价格:14.0
商品名称:A_54,商品价格:66.0
商品名称:A_55,商品价格:83.0
商品名称:A_56,商品价格:29.0
商品名称:A_57,商品价格:38.0
商品名称:A_58,商品价格:83.0
商品名称:A_59,商品价格:86.0
商品名称:A_60,商品价格:24.0
商品名称:A_61,商品价格:75.0
商品名称:A_62,商品价格:38.0
商品名称:A_63,商品价格:79.0
商品名称:A_64,商品价格:92.0
商品名称:A_65,商品价格:42.0
商品名称:A_66,商品价格:45.0
商品名称:A_67,商品价格:32.0
商品名称:A_68,商品价格:19.0
商品名称:A_69,商品价格:75.0
商品名称:A_70,商品价格:76.0
商品名称:A_71,商品价格:15.0
商品名称:A_72,商品价格:33.0
商品名称:A_73,商品价格:33.0
商品名称:A_74,商品价格:38.0
商品名称:A_75,商品价格:4.0
商品名称:A_76,商品价格:2.0
商品名称:A_77,商品价格:58.0
商品名称:A_78,商品价格:20.0
商品名称:A_79,商品价格:35.0
商品名称:A_80,商品价格:78.0
商品名称:A_81,商品价格:40.0
商品名称:A_82,商品价格:28.0
商品名称:A_83,商品价格:43.0
商品名称:A_84,商品价格:82.0
商品名称:A_85,商品价格:90.0
商品名称:A_86,商品价格:84.0
商品名称:A_87,商品价格:96.0
商品名称:A_88,商品价格:61.0
商品名称:A_89,商品价格:58.0
商品名称:A_90,商品价格:35.0
商品名称:A_91,商品价格:42.0
商品名称:A_92,商品价格:57.0
商品名称:A_93,商品价格:53.0
商品名称:A_94,商品价格:9.0
商品名称:A_95,商品价格:31.0
商品名称:A_96,商品价格:51.0
商品名称:A_97,商品价格:78.0
商品名称:A_98,商品价格:54.0
商品名称:A_99,商品价格:70.0
小马购买了:[Good{name='A_0', price=53.0}, Good{name='A_4', price=10.0}, Good{name='A_5', price=8.0}, Good{name='A_14', price=13.0}, Good{name='A_27', price=12.0}, Good{name='A_44', price=1.0}, Good{name='A_76', price=2.0}]
本章小结
根据需求、场景合理的设计类,场景的模拟就是逻辑的实现。