JAVASE语法零基础——图书系统小练习

Java系列文章目录


在这里插入图片描述

Write once,Runanywhere.🔥🔥🔥

💥 💥 💥如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!!
💥 💥 💥

版权声明:本文由【马上回来了】原创、在CSDN首发、需要转载请联系博主。
版权声明:本文为CSDN博主「马上回来了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

在这里插入图片描述

🚀🚀🚀 新的知识开始喽🚀🚀🚀
在这里插入图片描述


1.最终效果

管理员功能菜单:
在这里插入图片描述

普通用户菜单:
在这里插入图片描述
这里重点讲解的是这个图书系统的搭建框架,至于每个业务的具体的实现逻辑每个人可以根据自己的想法来写,因为此时此刻自己就是这个项目的产品经理。
这里是我上传到码云这个项目的代码,点击此处可转到

2.面向对象开发

2.1 bookpackage

2.1.1 Book类

对于这个系统首先得自定义一个Book类,这个类里包含了一本书的基本信息:书名、作者、类型、价格、书籍状态(是否借出)。用private对这些成员变量进行封装,然后通过提供公开的接口(set、get)来和Book类外的对象进行交互。
注意点:
1.
在这里插入图片描述
2.
在这里插入图片描述

public class Book {
  private String name;
  private String athuor;
  private String type;
  private double price;
  private boolean isBorrowed;

    public Book(String name, String athuor, String type, double price) {
        this.name = name;
        this.athuor = athuor;
        this.type = type;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", athuor='" + athuor + '\'' +
                ", type='" + type + '\'' +
                ", price=" + price +
                ", " + ((isBorrowed==false)?"未借出":"已经借出") +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAthuor() {
        return athuor;
    }

    public void setAthuor(String athuor) {
        this.athuor = athuor;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
}

2.1.2 Booklist类

Booklist类定义为一个书架,在此处定义了一个Book[]数组用于表示可以存放的书籍数,usedsize用来计数书架里的书籍,构造方法里先初始化了三本书,还定义了拿到书籍与放入书籍的方法。当然对于封装的usedsize还得提供对外公开的接口。
对于这个书架还提供了getBook()拿到一本书、setBook()放入一本书的方法。

public class Booklist {
    //书库
    Book[] books = new Book[10];
    //计数器
    private int usedsize;
    //书架最先 先放三本书

    public Booklist() {
        books[0]=new Book("三国演义","吴承恩","小说",19.0);
        books[1]=new Book("红楼梦","曹雪芹","小说",29.0);
        books[2] = new Book("水浒传","施耐庵","小说",19.0);
        usedsize = 3;
    }



    //拿到一本书
   public Book getBook(int pos){//pos下标必须合法
        Book book = books[pos];//从数组的pos下标处拿到这本书
        return book;//返回这本书
    }
    //放入一本书
    public void setBook(int pos,Book book){//pos下标值必须合法,将这本书放入下标为pos处
        books[pos] = book;
    }
//获取当前书籍数量
    public int getUsedsize() {
        return usedsize;
    }
//设置当前书籍数量
    public void setUsedsize(int usedsize) {
        this.usedsize = usedsize;
    }
}

2.2 Operationpackage

对于书架的操作逻辑方法本可以直接写在书架类Booklist类里,这里我们将各个逻辑方法抽象层接口,当然接口还是对书架Booklist直接进行操作。
然后每个具体的实现这个接口的类都需要重写work方法。

public interface Ioperation {
    void work(Booklist booklist);//抽象方法work的操作对象还是Booklist类,
}

2.2.1 FindOperation:

实现逻辑:根据书名来查找。

public class FindOperation implements Ioperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("查找书籍");
        System.out.println("请输入书籍名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentsize = booklist.getUsedsize();//通过get接口获取Usedsize的值
        for (int i = 0; i < currentsize; i++) {
            if(booklist.getBook(i).getName().equals(name)){//调用Booklist里的getBook方法拿到下标为i的书,然后又调用Book类里的getName方法得到书的名字,然后再通过equals来和要添加的书名进行比较
                System.out.println("找到了");
                System.out.println(booklist.getBook(i));//调用Booklist类里的getBook()方法拿到这本书,然后再打印这本书
                return;
            }
        }
        //i>= currentsize 找不到
        System.out.println("没有这本书");
    }
}

2.2.2DisplayOperationOperation:

实现逻辑:遍历所有的Booklist数组,并且打印数组里的每一本书。

public class DisplayOperationOperation implements Ioperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("显示书籍");
        int currentsize = booklist.getUsedsize();
        for (int i = 0; i < currentsize; i++) {
            System.out.println(booklist.getBook(i));

        }
    }
}

2.2.3DelOperation:

实现逻辑:根据书名来删除一本书。

在这里插入图片描述

public class DelOperation implements Ioperation {
    @Override
    public void work(Booklist booklist) {
        System.out.println("删除一本书");
        System.out.println("请输入你要删除的书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentsize=booklist.getUsedsize();
        int index = -1;//index用来记录目标书籍的下标
        int i = 0;
        for (; i < currentsize; i++) {
            if(booklist.getBook(i).getName().equals(name)){
                index = i;
                break;
            }

        }
        //1.找到了书籍,将书籍的下标保存在index里

      if(index != -1){
          for ( i = index; i < currentsize-1; i++) {//i必须小于currentsize-1
              Book book =booklist.getBook(i+1);
              booklist.setBook(i,book);

          }
          booklist.setUsedsize(currentsize-1);//书的数量-1
          booklist.setBook(currentsize-1,null);//将空出来数组位置置为空
          System.out.println("删除成功");
        
          return;
      }

        //2.i>=currentsize 没哟找到这本书
        if(i>=currentsize){
            System.out.println("找不到这本书");
        }
    }
}

2.2.4 AddOperation

实现逻辑:根据输入Book类的成员属性,new一个新类型,然后调用Booklist里的setBook方法来添加一本书。

public class AddOperation implements Ioperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("添加一本书");
        System.out.println("请输入书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入作者");
        String author = scanner.nextLine();
        System.out.println("请输入类型");
        String type = scanner.nextLine();
        System.out.println("请输入价格");
        double price = scanner.nextDouble();
        Book book = new Book(name,author,type,price);
        int currentsize = booklist.getUsedsize();
        booklist.setBook(currentsize,book);
        booklist.setUsedsize(currentsize+1);//书的数量+1
        System.out.println("添加成功");
    }
}

2.2.5BorrowedOperation

实现逻辑:将要借出去的书的isBorrowed的值改为true。

public class BorrowedOperation implements Ioperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("借阅书籍");
        System.out.println("请输入书籍名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentsize = booklist.getUsedsize();
        for (int i = 0; i < currentsize; i++) {
            if(booklist.getBook(i).getName().equals(name)){
                booklist.getBook(i).setBorrowed(true);//在Booklist里拿到下标为i的书,然后根据setBorrowed()方法来修改
                System.out.println("借阅成功");
                System.out.println(booklist.getBook(i));
                return;
            }
        }
        //i>= currentsize 找不到
        System.out.println("没有这本书");
    }

2.2.6 ReturnOperation

实现逻辑:和BorrowedOperation一致,将isBorrowed的值改为false。

public class ReturnOperation implements Ioperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("归还书籍");
        System.out.println("请输入书籍名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentsize = booklist.getUsedsize();
        for (int i = 0; i < currentsize; i++) {
            if(booklist.getBook(i).getName().equals(name)){
                booklist.getBook(i).setBorrowed(false);
                System.out.println("归还成功");
                System.out.println(booklist.getBook(i));
                return;
            }
        }
        //i>= currentsize 找不到
        System.out.println("没有这本书");
    }

}

2.2.7ExitOperation

实现逻辑:直接调用exit方法,参数0表示正常退出。

public class ExitOperation implements Ioperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("退出系统");
        System.exit(0);
    }
}

2.3 userpackage

2.3.1User类

对于用户有NormalUser普通用户和AdminUser管理员用户,这两个用户有相同的属性也有不相同的地方,因此可以将相同的共性抽取出来放在父类User类里,这样简化了代码实现了代码的复用。
对于menu()因为两个子类里的实现不同,而具体实现menu()方法的又是子类,因此可以将这个方法写成抽象方法,所以父类又可以写成抽象类,抽象类与普通类相比,在子类重写父类方法时多了一层检验父类方法是否重写的检验机制,更利于我们排错。
对于操作数组IOperation[]父类里也并没有实例化出对象,因为两个子类里对应的IOperation[]成员不一样。
对于doOperation()方法是执行多态之后根据不同的子类对象执行的具体的方法。

package user;

import Operation.Ioperation;
import book.Booklist;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2022-07-04
 * Time: 22:51
 */
public abstract class User {
    protected String name;//类名相同
    Ioperation[] ioperations;//这里没有创建数组对象,而是在子类里创建了子类对象

    public User(String name) {//构造方法
        this.name = name;
        this.ioperations = ioperations;
    }

    public abstract int menu();//抽象方法,子类必须重写此抽象方法
    public void doOperation(int chioce, Booklist booklist){
        this.ioperations[chioce].work(booklist);
    }
}

2.3.2 AdminUser类

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperationOperation()
        };
    }

    public int menu(){
        System.out.println(name+"你好"+"欢迎来到图书小练习");
        System.out.println("请输入一下操作序号:");
        System.out.println("1.查找图书");
        System.out.println("2.添加图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;

    }
}

2.3.3 NormalUser类

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperation(),
                new ReturnOperation(),
                new DisplayOperationOperation()
        };
    }
    public int menu(){
        System.out.println(name+"你好"+"欢迎来到图书小练习");
        System.out.println("请输入一下操作序号:");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;

    }
}

3.将所有的类进行整合

public class Main {
    public static User login(){
        System.out.println("请输入姓名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1——》管理员,2——》普通用户");
        int choice = scanner.nextInt();
        if(choice==1){
           return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        Booklist booklist = new Booklist();//先准备书籍
        User user = login();//打印主菜单,根据输入选择不同的用户对象实例化了不同的对象并且用父类进行接收实现多态
        while (true){
            int choice = user.menu();//多态调用menu方法,AdminUser与NormalUser产生的效果不同,可以根据实际需求选择不同的操作逻辑
            user.doOperation(choice,booklist);//关键一步,在这行代码之前就已经选择好了AdminUser或者NormalUser对象里的具体实现逻辑,这行代码会调用子类AdminUser或者NormalUser对象里的具体实现逻辑
        }

    }
}

关键三步:
在这里插入图片描述



🌏🌏🌏今天的你看懂这里又学到了很多东西吧🌏🌏🌏

在这里插入图片描述

🌔 🌔 🌔下次见喽🌔 🌔 🌔
在这里插入图片描述

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马上回来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值