Java从零单排 -- 小练习 小卖铺

179 阅读6分钟

这章节我们用学过的知识做个小卖铺的功能。

需求: 
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}]


本章小结

根据需求、场景合理的设计类,场景的模拟就是逻辑的实现。