图书管理系统

目录

一、设计思路

二、书

1、书籍

2、书架

三、操作

1、显示图书

2、查找图书

3、新增图书

4、退出系统

5、删除图书

6、借阅图书

7、归还图书

四、用户

1、管理员

2、普通用户

五、Main类


一、设计思路

  图书管理系统是一种用于管理图书信息和流程的软件系统,对于图书系统中不同的对象和操作要创建不同的包来分别管理,最后将这些包中的方法组合起来,创建一个mian类来使用。

  对于图书管理系统,主要有书、使用者和管理使用图书的不同操作三个对象,因此需要创建三个包来分别管理这三个对象。

  在书中包含书籍本身的属性和将书放在书架上进行管理,所以有书籍和书架两个对象。

  在使用者中包含普通用户和管理员两个对象。

  在操作这个包中存放普通用户和管理员对图书系统的不同操作。


这是对图书管理系统的一个简单的思维导图。

使用我们要先创建三个包,创建一个Test类来进行测试。

二、书

  书分为书籍和书架,先创建一本书,将一本书封成一个个体,用书架对多个个体进行操作。

1、书籍

  书籍有书名、作者、价格、类型和是否被借出等属性,所以我们优先在书这个对象中创建这几个属性。

package book;

public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

//创建构造方法,可以在存储和调用书籍内容时提供参数
//boolean类型默认为false,只需在借阅和归还时进行修改,不需要调用构造方法

    public Book(String name, String author, int price, String type) { 
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

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

    public String getType() {
        return type;
    }

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

    public boolean isBorrowed() {
        return isBorrowed;
    }

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


//所以toString方法来打印一本书的属性
//boolean在打印时需要被选择是否被借出,用三目操作符来进行选择

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

2、书架

书架是图书系统的主要部分,普通用户和管理员的主要操作都是在书架上进行的

package book;

public class BookList {

    private Book[]books; //定义一个数组来存放书这个个体。对书的整理进行操作

    public BookList(){
        this.books=new Book[10]; //创建一个构造方法,在构造方法中定义数组中有多少个元素
                                 //表示存放多少本书
      
        this.books[0]=new Book("三国演义","罗贯中",10,"小说"); //先存三本书
        this.books[1]=new Book("西游记","吴承恩",11,"小说");
        this.books[2]=new Book("红楼梦","曹雪芹",12,"小说");


        this.usedSize=3;
    }                          


    private int usedSize;  //定义一个usedSize来记录存放了多少本书,默认为0

    public int getUsedSize() {  //usedSize的构造方法
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }



    public Book getBook(int pos){  //books的构造方法 Book[]books是Book类型所以返回为Book
        return books[pos];         //定义一个pos,返回pos下标所对应的这本书
    }


    public void setBooks(int pos,Book book){    //设置书籍,在pos下标对应的地方,
                                                //设置为book这本书
                                            
        books[pos]=book;
    }

    public Book[] getBooks(){
        return books;
    }
}

三、操作

  将普通用户和管理员的操作都存放在一个包中整理,所以不同的操作对不同的方法进行调用。

现在要明确普通用户和管理员的操作

管理员普通用户
查找图书查找图书
新增图书借阅图书
删除图书归还图书
显示图书退出系统
退出系统

对此我们需要创建不同的类来实现不同的操作


      其中定义一个IOperation的一个接口,让所以的操作都实现这个接口,就可以通过这个接口将普通用户和管理员不同的操作组织起来。

public interface IOperation {
    void work(BookList bookList);  //所有的操作都是对应书架进行
}

1、显示图书

package operation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOperation{

    public void work(BookList bookList){

        System.out.println("显示图书!");

        int currentSize=bookList.getUsedSize();  //遍历数组,小于总共多少本书

        for (int i = 0; i < currentSize; i++) {

            Book book=bookList.getBook(i); //原来的pos下标对应的书

            System.out.println(book);

        }

    }

}

2、查找图书

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{

        public void work(BookList bookList){

            System.out.println("查找图书!");

            Scanner scanner=new Scanner(System.in);

            String name=scanner.nextLine();

            int currentSize=bookList.getUsedSize();

            for (int i = 0; i < currentSize; i++) { //遍历数组查找

                Book book=bookList.getBook(i);

                if (book.getName().equals(name)){

                    System.out.println("找到了这本书,信息如下:");

                    System.out.println(book);

                    return;
                }
            }

            System.out.println("没有找到这本书");
        }
}

3、新增图书

import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{

        public void work(BookList bookList){

            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("请输入价格:");
            int price=scanner.nextInt();


            Book book=new Book(name,author,price,type);

            //检查数组中有没有这本书
            int currentSize= bookList.getUsedSize();

            for (int i = 0; i < currentSize; i++) {

                Book book1=bookList.getBook(i);

                if (book1.getName().equals(name)){

                    System.out.println("已经有这本书,不需要存放");

                    return;
                }
            }
            if (currentSize==bookList.getBooks().length){

                System.out.println("书架满了!");

            }else {

                bookList.setBooks(currentSize,book); //在currentSize位置放book这本书

                bookList.setUsedSize(currentSize+1); //数组长度+1
            }
        }

}

4、退出系统

package operation;

import book.BookList;

public class ExitOperation implements IOperation{

        public void work(BookList bookList){

            System.out.println("退出系统!");

            System.exit(0); //输入0退出系统

        }
}

5、删除图书

  删除图书就是找到要删除的图书,记录该图书的数组下标,将该数组下标的后一位覆盖该下标,该下标所对应的对象将被系统回收,依次类推,最后的一处空间将为空,将它置为null。

package operation;

import book.Book;

import book.BookList;

import java.util.Scanner;

public class DeleteOperation implements IOperation{

        public void work(BookList bookList){

            System.out.println("删除图书!");

            Scanner scanner=new Scanner(System.in);

            System.out.println("请输入你要删除的图书:");

            String name=scanner.nextLine();

            int pos=-1;  //只是用来记录

            int currentSize=bookList.getUsedSize();

            int i=0;
            for (;  i<currentSize ; i++) {

                Book book = bookList.getBook(i);

                if (book.getName().equals(name)) {

                    pos = i; //有这本书,记录下来

                    break;
                }

            }

            if (i==currentSize){ //i到达数组最后 没有找到

                System.out.println("没有你要删除的图书");

                return;
            }

            //开始删除

            int j=pos;

            for (; j <currentSize-1 ; j++) {

                Book book=bookList.getBook(j+1);//拿到j+1位置的书

                bookList.setBooks(j,book);//在j的位置放刚才拿到的书

            }

            bookList.setBooks(j,null);//当j来到最后的位置,置为null


            bookList.setUsedSize(currentSize-1);
        }
}

6、借阅图书

package operation;

import book.Book;

import book.BookList;

import java.util.Scanner;

public class BorroweOperation implements IOperation{

        public void work(BookList bookList){

            System.out.println("借阅图书!");

            Scanner scanner=new Scanner(System.in);

            System.out.println("请输入你要借阅的书:");

            String name=scanner.nextLine();


            int currentSize= bookList.getUsedSize();

            for (int i = 0; i < currentSize; i++) {

                Book book=bookList.getBook(i);

                if (book.getName().equals(name)){

                    book.setBorrowed(true); //默认为false,未被借出,置为ture,表示借出

                    System.out.println("借阅成功");

                    System.out.println(book);

                    return;
                }
            }

            System.out.println("你借阅的书,不存在!");
        }
}

7、归还图书

import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation{

        public void work(BookList bookList){

            System.out.println("归还图书!");

            Scanner scanner=new Scanner(System.in);

            System.out.println("请输入你要归还的书:");

            String name=scanner.nextLine();


            int currentSize= bookList.getUsedSize();

            for (int i = 0; i < currentSize; i++) {

                Book book=bookList.getBook(i);

                if (book.getName().equals(name)){

                    book.setBorrowed(false); //false表示未被借出,所以归还图书

                    System.out.println("归还成功");

                    System.out.println(book);

                    return;
                }
            }

            System.out.println("你归还的书,不存在!");

        }
}

四、用户

普通用户和管理员都属于用户,所以可以通过继承来实现共有的操作。

先创建用户

package abstract user;

public abstract class User { //包含抽象方法,所以是抽象类

    protected String name; //让name只在子类和同一个包下使用

    protected IOperation[]iOperations; //定义一个数组来整合要实现的方法


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

    public abstract int menu(); //没有具体的实现,所以是抽象方法

    public void doOperation(int choice, BookList bookList){

        iOperations[choice].work(bookList);//iOperations[choice].work(bookList);
                                           //choice是iOperation的选择
                                          //booList是作用于书架上的方法中的参数
                                          //只调用方法,没指定是谁的方法,需要user来指定
       }
                            

}

 这里的iOperation[choice].work(bookList)都是作用于子类的,choice代表子类中下标对应的对象,work(bookList)是对象所对应的方法。

其中管理员和普通用户看到的菜单是不一样的,需要对menu方法进行重写,发生多态。

1、管理员

package user;

import java.util.Scanner;

public class AdminUser extends User { 

    public AdminUser(String name) { //继承父类,先帮父类进行初始化

        super(name);

       this.iOperations=new IOperation[]{ //对父类中的IOperation进行初始化
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeleteOperation(),
                new ShowOperation(),
        };

    }

    public int menu() { //重写方法

        System.out.println("****************");
        System.out.println("1、查找图书!");
        System.out.println("2、新增图书!");
        System.out.println("3、删除图书!");
        System.out.println("4、显示图书!");
        System.out.println("0、退出系统!");
        System.out.println("***************");


        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");

        int choice = scanner.nextInt();

        return choice; //返回选择
    }
}

2、普通用户

package user;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {


         this.iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorroweOperation(),
                new ReturnOperation(),
        };

        super(name);
    }
    public int menu(){ //重写

        System.out.println("****************");
        System.out.println("1、查找图书!");
        System.out.println("2、借阅图书!");
        System.out.println("3、归还图书!");
        System.out.println("0、退出系统!");
        System.out.println("***************");

        Scanner scanner=new Scanner(System.in);

        System.out.println("请输入你的操作:");

        int choice=scanner.nextInt();

        return choice;
    }
}

五、Main类

创建一个Main类来实现所有操作

import java.util.Scanner;

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(); //调用login方法,获取身份
       
        while (true) { //循环操作

        int choice=user.menu(); //用choice来接收值

        System.out.println("choice:"+choice); //根据choice的选择来决定调用哪个方法


       user.doOperation(choice, bookList); // iOperations[choice].work(bookList);给上两个 
                                              参数就可以使用方法了,根据选择调用
                                               //user所代表的对象中菜单里面的方法
    }

 }






}

  这里的user.doOperation(choice,bookList)是作用于User的,User再作用于它的子类,就可以根据user来调用不同用户的菜单,然后choice来选择方法,bookList来作用方法,完成图书管理系统中的操作,将这些方法组合起来,实现了图书管理系统。

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
根据提供的引用内容,可以了解到图书管理系统系统架构是通过多种视图来描述系统的各个主要方面,并记录了设计人员对系统构架方面做出的重要决策。此外,还提到了使用面向对象的思想编程实现图书管理系统的功能,包括增删查找。 根据这些信息,可以给出以下回答: 图书管理系统系统架构是通过多种视图来描述系统的各个主要方面。这些视图可以包括逻辑视图、物理视图、过程视图等。逻辑视图描述了系统的功能和数据结构,物理视图描述了系统的硬件和网络配置,过程视图描述了系统的流程和交互。 设计人员在系统构架方面做出了重要决策,这些决策可能涉及到系统的模块划分、数据存储方式、通信协议等。这些决策的目标是确保系统的可靠性、可扩展性和性能。 使用面向对象的思想编程实现图书管理系统可以提供更好的代码组织和复用性。通过将系统的功能划分为不同的对象和类,可以更好地管理和维护系统的代码。同时,面向对象的编程还可以提供更好的封装性和抽象性,使系统的设计更加灵活和可扩展。 以下是一个简单的图书管理系统系统架构示例: - 逻辑视图:包括图书管理模块、用户管理模块、借阅管理模块等。 - 物理视图:包括服务器、数据库、网络设备等。 - 过程视图:包括用户登录流程、图书借阅流程、图书归还流程等。 通过这样的系统架构,可以实现图书管理系统的各项功能,并提供良好的用户体验和系统性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值