首页 > 编程语言 >现实中的 JAVA (一)

现实中的 JAVA (一)

时间:2023-06-22 22:55:10浏览次数:40  
标签:Snack JAVA String 现实 private snack snackWrappers public

买零食

描述

本例子主要是通过 JAVA 语言来描述,平时父母带我们去买零食的场景。

买零食流程图

  • 从家里出发,选择一种出行方式达到零食店然后我们就可以开始购物了,选择对应的零食随后进行买单

家庭成员 UML 图

1、Person 做为顶级的抽象类
2、Male 作为男 CLass 的描述类
3、Female 作为女 CLASS 的描述类

Person

@Data
public  abstract class Person {

    protected String name;


    protected int age;

    /**
     * 单位 cm
     */
    protected int height;

    /**
     * 单位 kg
     */
    protected int weight;

}

Male

@Data
public class Male extends Person{

    private String gender = GenderEnum.MALE.name();

    protected String education;

}

Female

@Data
public class Female extends Person{

    private String gender = GenderEnum.FEMALE.name();

    protected String education;
}

1、以上代码通过枚举类 GenderEnum 来对性别进行描述从而使代码的可读性更高


家庭描述实体类

Mother

@Data
@Accessors(chain =true)
public class Mother extends Female {

    private String identity = FamilyEnum.FATHER.name();

    private String profession;
}

Father

@Data
@Accessors(chain =true)
public class Father extends Male {

    private String identity = FamilyEnum.FATHER.name();

    private String profession;

}

Child

@Data
@Accessors(chain =true)
public class Child extends Person {

    private String identity = FamilyEnum.FATHER.name();

    private String profession;
}

  • @Accessors(chain =true) 注解作用是使类的属性可以进行链式调用

零食店 UML

Snack


@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain =true)
@ToString
public class Snack {

    /**
     * 零食名称
     */
    public String name;

    /**
     * 零售价
     */
    public double retailPrice;

    /**
     * 生产日期
     */
    public Date ProductionDate;

    /**
     * 出厂价
     */
    public double factoryPrice;


    // TODO 更多属性稍后补充

}

SnackWrapper

@Accessors(chain =true)
@NoArgsConstructor
@Data
public class SnackWrapper {

    int amount;

    Snack snack;

    public static SnackWrapper build(int amount , Snack snack) {
        SnackWrapper snackWrapper = new SnackWrapper();
        snackWrapper.setSnack(snack);
        snackWrapper.setAmount(amount);
        return snackWrapper;
    }
}

SnackShop

@Component
public class SnackShop implements InitializingBean {

    /**
     * 零食集合 - 存货 使用 List <Map> 结构
     * volatile 保证多线程环境下的可见性
     */
    public volatile Set<SnackWrapper> snackSet = Sets.newHashSet();

    private Faker faker = new Faker();


    public void setSnackSet(Set<SnackWrapper> snackSet) {
        this.snackSet = snackSet;

    }

    public void show() {
        snackSet.forEach(each -> {
            System.out.println("当前商品 :" + each.getAmount() + "---现有存货: " + each.getSnack().getName());
        });
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        List<Snack> snacks = new ArrayList<>(32);
        /**
         * 初始化零食
         */
        Faker faker = new Faker();
        Snack snack = new Snack();
        snack.setName("milt");
        snack.setFactoryPrice(5.00d);
        snack.setRetailPrice(8.00d);
        snack.setProductionDate(faker.date().birthday());

        snacks.add(snack);

        Snack snack2 = new Snack();
        snack2.setName("mackerel");
        snack2.setFactoryPrice(9.00d);
        snack2.setRetailPrice(15.00d);
        snack2.setProductionDate(faker.date().birthday());
        snacks.add(snack2);
        Snack snack3 = new Snack();
        snack3.setName("japaneseseabass");
        snack3.setFactoryPrice(20.00d);
        snack3.setRetailPrice(32.00d);
        snack3.setProductionDate(faker.date().birthday());
        snacks.add(snack3);

        /**
         * 构建 SnackWrapper
         */
        for (int i = 0 ; i < snacks.size() ; i ++ ) {
            SnackWrapper snackWrapper = SnackWrapper.build(5 , snacks.get(i));
            snackSet.add(snackWrapper);
        }
    }


    /**
     * 买单
     * @param snackWrappers 购物商品集合 - 数量
     * @return
     */
    public SpendWrapper payBill(List<SnackWrapper> snackWrappers) {
        /**
         * 什么都没买直接走人把
         */
        if (CollUtil.isEmpty(snackWrappers)) {
            return new SpendWrapper();
        }

        double spendMoney = calcSpendMoney(snackWrappers);

        /**
         * 减库存 - 这里可以采取异步的操作
         */
        cutStock(snackWrappers);

        return SpendWrapper.builder().
                spendMoney(spendMoney)
                .waiterName(faker.name().name())
                .billingTime(DateUtil.date(System.currentTimeMillis()))
                .build();
    }


    /**
     * 扣减库存
     */
    public void cutStock(List<SnackWrapper> snackWrappers) {

        /**
         * TODO 该实现需要完善
         */
        Iterator<SnackWrapper> iterator = snackSet.iterator();

        for (int i = 0 ; i < snackWrappers.size() ; i ++ ) {
           while (iterator.hasNext()) {
               SnackWrapper next = iterator.next();
               if (next.getSnack().getName().equals(snackWrappers.get(i).getSnack().getName())) {
                   Preconditions.checkArgument((next.getAmount() - snackWrappers.get(i).getAmount()) > 0 , "\n" +
                           "Inventory shortage");
                   next.setAmount(next.getAmount() - snackWrappers.get(i).getAmount());
               }
           }
        }
    }

    private double calcSpendMoney(List<SnackWrapper> snackWrappers) {
        double spendMoney = 0.00d;
        for (SnackWrapper snackWrapper : snackWrappers) {
            double price = snackWrapper.getAmount() * snackWrapper.getSnack().retailPrice;
            Preconditions.checkArgument(price > 0 , "calc snack price can not less than 0");
            spendMoney = spendMoney + price;
        }
        return spendMoney;
    }
}

标签:Snack,JAVA,String,现实,private,snack,snackWrappers,public
From: https://www.cnblogs.com/ayizzz/p/17498518.html

相关文章

  • JAVA博客3
     一.前言第三次写Blog,相比较上一次而言自己的经验更加的丰富了,这次blog的书写相对来说要更为轻松些。内容上题目较少,只需要分析有关课程成绩统计系统,但是说容易也并不容易,每一道题都是刺头中的刺头,这一次写博客,不仅仅是以完成任务的目的,更多的,让自己重新对那些打击过自己,折磨过......
  • java中的各种锁
    java中的各种锁一、概述乐观锁CAS悲观锁synchronized自旋锁CAS可重入锁synchronized、Reentrantlock、Lock读写锁ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet公平锁Reentrantlock(true)非公平锁synchronized、reentrantlock(false)共享锁......
  • Java Web自定义MVC框架详解
    最近给学生讲JavaWeb,希望他们能够在学完这部分内容后自己实现一个MVC框架。但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码......
  • 字符编码和Java中的乱码问题
    ASCII码  在计算机内部,所有的信息最终都表示为一堆二进制形式的数据。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,称为一个字节(byte),从0000000到11111111。上世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系做了统一规定,称之为ASCII......
  • Java Web项目中使用Freemarker生成Word文档
    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob、ApachePOI、Java2Word、iText等各种方式,其实在从Office2003开始,就可以将Office文档转换成XML文件,这样只要将需要填入的内容放上${}占位符,就可以使用像Freemarker这样的模板引擎将出现占位符的地......
  • [连载]Java程序设计(05)---任务驱动方式:简单的加密/解密系统
    任务:还是上一家公司,现在该公司在全国各地都设立了自己的分公司以拓展其核心业务,那么就需要利用互联网在全国各地的公司之间传递信息(我们假定这些信息就是文字信息),这些信息可能涉及一些商业机密,为此公司需要一套简单的加密和解密系统来避免直接在互联网上传递明文信息。目前拟定了两......
  • 历史最全Java资源大全中文版整理分享
       很多程序员应该记得GitHub上有一个Awesome-XXX系列的资源整理。本资源对Java相关的资源列表进行翻译和整理,内容包括:构建工具、数据库、框架、模板、安全、代码分析、日志、第三方库、书籍、Java站点等。分享给需要的朋友。目录内容截图......
  • 第三次java博客
    在Java编程领域中,掌握如何读取和处理用户输入数据是非常基础和重要的一步。我们需要从用户那里获取输入数据,并根据输入数据进行相应的操作或计算。在这篇博客中,我们将会探讨如何在Java程序中读取和处理用户输入数据,以及如何利用这些数据来完成一些常见的任务,比如计算平均分和总成......
  • java Condition类的详细介绍
    一、condition介绍及demoCondition是在java1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列......
  • JAVA:Collections类的shuffle()方法
    Java.util.Collections类下有一个静态的shuffle()方法,如下:1)staticvoidshuffle(List<?>list)使用默认随机源对列表进行置换,所有置换发生的可能性都是大致相等的。2)staticvoidshuffle(List<?>list,Randomrand)使用指定的随机源对指定列表进行置换,所有置换发生的可能性......