赞
踩
目录
Java是一门面向对象的语言,那我们在通过Java设计图书管理系统的时候,可以按照一下顺序来进行编程:
找对对象
创建对象
使用对象
关于构建图书管理系统,首先你得弄清楚一共有哪几个部分:图书,用户,操作。
对于这几个部分你可以分别创建对应的包来进行存储,有利于类的管理。
图书管理系统首先要有图书,书单,那我们先创建一个包用来存储图书类和书单类:
关于图书有这几项属性:书名,作者,价格,类型,是否借出;所以在Book这个类中先定义这几项成员变量:
定义完成员变量之后,由于我们所定义的成员变量均是被 private 所修饰的,所以我们还需要定义对应的 get 和 set 方法 以及构造方法,这个可以直接根据IDEA的 Generate 快捷方法直接构建(方法如下)
构建完这些 get 和 set 方法后重载一个 toString 方法 ------ 打印数组
此时,我们的 Book 类就构建得差不多了:
- package Book;
-
- public class Book {
-
- private String name;
- private String author;
- private double price;
- private String type;
- private boolean isBorrowed=false;
-
- public Book(String name, String author, double 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 double getPrice() {
- return price;
- }
-
- public void setPrice(double 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;
- }
-
- @Override
- public String toString() {
- return "Book{" +
- "name='" + name + '\'' +
- ", author='" + author + '\'' +
- ", price=" + price +
- ", type='" + type + '\'' +
- ", " + ((isBorrowed==false)?"未被借出":"已经借出" )+
- '}';
- }
- }
构建完图书类之后,我们就要开始构建书单用来存储书籍:
首先,构建一个存储图书的数组 -- Book[ ] 以及 书架使用情况 --- usedSize
构建完成员变量之后,就可以定义一些方法来实现 BookList 书架的功能:
1. 构造方法:创建一个把构造方法 ,对成员变量进行初始化。
2.成员方法:可以参考上面书类创建的 get 和 set 方法来创建对 usedSize 的get、set方法;由于 BookList 中存在一个 private 修饰的 Book[ ] books(类似于数组),所以我们可以创建 get 方法来得到 pos 位置的书,以及创建 set 方法在 pos 位置设置一本书籍.
按照以上步骤,便可创建一个较为简单的书架 BookList 类,整体代码如下:
- package Book;
-
- public class BookList {
-
- private Book[] books;
- private int usedSize;
-
- public BookList(){
- this.books=new Book[10];
- books[0]=new Book("三国演义","罗贯中",19.9,"小说");
- books[1]=new Book("西游记","吴承恩",29.9,"小说");
- books[2]=new Book("红楼梦","曹雪芹",39.9,"小说");
- usedSize=3;
- }
-
- public Book getBooks(int pos){
- return books[pos];
- }
-
- public void setBooks(int pos,Book book){
- books[pos]=book;
- }
- public int getUsedSize() {
- return usedSize;
- }
-
- public void setUsedSize(int usedSize) {
- this.usedSize = usedSize;
- }
- }
-
图书管理系统共有这些操作:查找图书、借阅图书、归还图书、显示图书、增加图书、删除图书、退出系统 。
此时,我们可以建立一个 Operate 的包将这些操作存储进去。
在这些操作里面先写一个 work 方法 ,用来等会进行测试。由于这些操作都是对书架里面的书进行的,我们可以对work 传一个 BookList booklist 的 参数,方便后续操作。
这里可以直接设置一个 IO 接口,方便后续类继承拓展。
接口设置完成之后,可以先简单的完善一下这写操作类,就比如下面的 Find 类:
此时我们对操作进行了简单的编写,具体详细的功能可以等后面在写。
在用户这个包里面,可以先创建一个 User 的类,而 User 又分为管理员(AdmiUser)和普通用户(NomlUser),所以可以 将 User 设置成抽象类,然后分别创建一个 AdmiUser 类 和 NomlUser 类 继承 User 这个抽象类,分别用来存储 管理员操作和普通用户操作。
在 User 这个抽象类中,我们可以先设置用户名字 name ,在设置一个IO的数组 IO[ ] ios 用来存储不同用户的操作。
User 这个抽象类中,我们先重载一个构造方法,其次由于用户权限不同,我们所得到的菜单可能也不同,因此,我们可以在 User 类中定义一个抽象方法 menu ,再在子类中进行重写来实现不同的菜单。
User 这个类差不多编写完成了,现在来编写他的子类 AdmiUser 类 和 NomlUser类。
先来完善 AdmiUser 类 。
1. 父类重写了构造方法,子类也要重写
2. 父类中存在抽象方法,子类要重写,在 AdmiUser 这个管理员类中,可供管理员选择的菜单操作有这些: 1.查询书籍 2.新增书籍 3.删除书籍 4.显示图书 0.退出系统 ,我们要把他们打印在屏幕上,当然我们还要存储用户的选项:
3. 父类 User 定义了一个 IO 的数组用来存储不同的操作所以在构造方法中,我们也可以对 IO 数组进行初始化(我们可以按照菜单中的操作将其对应的方法对应起来,比如:用户选0时,IO数组中下标为0时,刚好是Exit()操作):
综上AdmiUser 类的整体代码如下:
- package User;
- import Book.BookList;
- import Operate.*;
- import User.*;
-
- import java.util.Scanner;
-
-
- public class AdmiUser extends User{
- public AdmiUser(String name) {
- super(name);
- this.ios=new IO[]{
- new Exit(),
- new Find(),
- new Add(),
- new Delete(),
- new Show()};
- }
- @Override
- 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 sc=new Scanner(System.in);
- int choice =sc.nextInt();
- return choice;
-
- }
-
- }
NomlUser 类
NomlUser 类跟AdmiUser 类的构建形式差不多,只不过NomlUser的menu方法中的操作变成了这些:1.查询书籍 2.借阅书籍 3.归还书籍 0.退出系统;以及将IO数组中的初始化值进行的简单的修改,所以,NomlUser 类的整体代码如下:
- package User;
- import Book.BookList;
- import Operate.*;
- import User.*;
-
- import java.util.Scanner;
-
- public class NomlUser extends User{
-
- public NomlUser(String name) {
- super(name);
- this.ios=new IO[]{
- new Exit(),
- new Find(),
- new Borrow(),
- new Return()};
- }
-
- 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 sc=new Scanner(System.in);
- int choice =sc.nextInt();
- return choice;
- }
-
-
- }
以上包都进行了简单的创建,现在来实现我们的 Main 类
在Main 类中,我们要实现登录界面,并对其进行操作,我们可以在 Main 类中创建一个 login---登录方法,用来实现下面的操作:
当我们输入我的身份之后,我们就会跳转到相应的用户的 menu 方法来打印对应的菜单,此时我们可以构建一个 if--else 语句,当输入值为 0 时,返回 AdmiUser 中;反之,则返回 NomlUser 中。代码如下:
那么在我们的 main 方法中,我们就可以直接通过 login 方法的返回值直接创建一个 User 的对象user ,再通过 menu 的返回值来了解用户的选项,那么我们该如何将用户和操作联系起来呢:
由于我们之前在 BookList 中创建了一个成员变量 --- IO[ ],这时我们可以在书架 BookList 中创建一个 operate 方法,将用户和操作进行联系起来:
用 ios[ choice ] 调用 ios中构建的操作对象,在引用work方法,达到操作的目的。
所以,我们在 Main 类中的 main 方法中就可以这样写:
- import Book.BookList;
- import User.*;
- import Operate.*;
-
- import java.util.Scanner;
-
- public class Main {
-
- public static User login(){
- Scanner sc=new Scanner(System.in);
-
- System.out.println("请输入你的姓名");
- String name=sc.nextLine();
-
- System.out.println("请输入你的身份:0->管理员 1->用户");
- int n=sc.nextInt();
-
- if(n==0){
- return new AdmiUser(name);
- }else{
- return new NomlUser(name);
- }
- }
-
-
-
- public static void main(String[] args) {
- BookList bookList=new BookList();
- User user=login();
-
- while(true) {
- int n=user.menu();
- user.operate(n, bookList);
- }
-
- }
- }
综上:大致框架以及构建完毕,现在只需要将操作包中的各个类功能进行完善即可。
1. 增加图书(Add 类):
由于图书有以上几个属性,所以我们要输入这些属性:
输入完属性之后,我们首先要确定书架中是否含有该图书,通过遍历 booklist 这个数组中的成员就可以判断是否存在该图书;没有则需要增加图书,将图书插在 booklist 的尾部,同时 used Size要增加:
- package Operate;
-
- import Book.Book;
- import Book.BookList;
-
- import java.util.Scanner;
-
- public class Add implements IO{
- public void work(BookList bookList) {
-
- System.out.println("增加图书!!");
- Scanner sc=new Scanner(System.in);
-
- System.out.println("请输入你增加的书名:");
- String name=sc.nextLine();
-
- System.out.println("请输入书的作者:");
- String author=sc.nextLine();
-
- System.out.println("请输入书的类型:");
- String type=sc.nextLine();
-
- System.out.println("请输入书的价格:");
- double price=sc.nextDouble();
-
-
-
- Book book=new Book(name,author,price,type);
- int currentSize=bookList.getUsedSize();
-
- //还要检查书架中是否已经存在这本书
- for (int i = 0; i < currentSize; i++) {
- Book book2= bookList.getBooks(i);
- if(book2.equals(book)){
- System.out.println("已经存在了!!");
- return ;
- }
- }
- bookList.setUsedSize(currentSize+1);
- bookList.setBooks(currentSize,book);
-
- }
- }
2. 借阅图书 ( Borrow 类 ):
借阅图书,首先要判断用户输入的图书是否在书架存在,如若存在,则使用将该图书的成员变量 --- isBorrowed 设置成借阅状态,代码如下:
- package Operate;
-
- import Book.Book;
- import Book.BookList;
-
- import java.util.Scanner;
-
- public class Borrow implements IO{
- public void work(BookList bookList) {
- System.out.println("借阅图书!!");
- System.out.println("请输入你要借阅的书籍:");
- Scanner sc=new Scanner(System.in);
- String name=sc.nextLine();
-
- int currentSize=bookList.getUsedSize();
- int i = 0;
- for (; i < currentSize ; i++) {
- Book book=bookList.getBooks(i);
- if(book.getName().equals(name) && book.isBorrowed()==false){
- book.setBorrowed(true);
- System.out.println("借阅成功!!");
- return ;
- }
- }
- if(i == currentSize) {
- System.out.println("你借阅的图书不存在!!");
- }
- }
- }
3. 归还图书 ( Return 类 )
Return 类 跟 Borrowed 类差不多,将借阅图书的 isBorrowed 修改成” 未借阅 “即可,代码如下:
- package Operate;
-
- import Book.Book;
- import Book.BookList;
-
- import java.util.Scanner;
-
- public class Return implements IO{
- @Override
- public void work(BookList bookList) {
- System.out.println("归还图书!!");
- System.out.println("请输入你要归还的书籍:");
- Scanner sc=new Scanner(System.in);
- String name=sc.nextLine();
-
- int currentSize=bookList.getUsedSize();
- for (int i = 0; i < currentSize ; i++) {
- Book book=bookList.getBooks(i);
- if(book.getName().equals(name)&& book.isBorrowed()==true){
- book.setBorrowed(false);
- System.out.println("归还成功!!");
- }
- }
- }
- }
4. 查找图书 ( Find 类 )
原理跟 增加图书 --- Add 类差不多
- package Operate;
-
- import Book.Book;
- import Book.BookList;
-
- import java.util.Scanner;
-
- public class Find implements IO{
- public void work(BookList bookList) {
- System.out.println("查找图书!!");
- System.out.println("请输入你要查找的图书;");
- Scanner sc=new Scanner(System.in );
- String name=sc.nextLine();
-
- int currentSize=bookList.getUsedSize();
- int i=0;
- for (; i < currentSize; i++) {
- Book book1=bookList.getBooks(i);
- if(name.equals(book1.getName())){
- System.out.println("找到了!!你查找的图书信息如下:");
- System.out.println(book1);
-
- break;
- }
- }
- if(i==currentSize){
- System.out.println("没找到该图书!!");
- }
-
- }
- }
5. 删除图书 ( Delete 类 )
删除图书,简单来讲,就是将要删除的图书的后一位覆盖前一位,最后将 booklist 中最后一位置空,然后将 usedSize -1 即可,代码如下:
- package Operate;
-
- import Book.Book;
- import Book.BookList;
-
- import java.util.Scanner;
-
- public class Delete implements IO{
- public void work(BookList bookList) {
- System.out.println("删除图书!!");
- Scanner sc=new Scanner(System.in);
- System.out.println("请输入你要删除的图书:");
- String name=sc.nextLine();
-
- int pos=0;
- int i = 0;
- int currentSize=bookList.getUsedSize();
- //先要看书架里面有没有这本书
- for (; i < currentSize; i++) {
- Book books=bookList.getBooks(i);
- if(books.equals(name)){
- pos=i;
- break;
- }
- }
-
- int j = pos;
- for (; j <currentSize-1; j++) {
- //先获取j+1 位置的书籍,在将j+1的书覆盖在j位置
- Book book2=bookList.getBooks(j+1);
- bookList.setBooks(j,book2);
- }
-
- bookList.setBooks(j,null);
- bookList.setUsedSize(currentSize-1);
-
- }
- }
6. 显示图书 ( Show 类 )
将图书打印出来,将 booklist 进行遍历 ,在实现打印即可,代码如下:
- package Operate;
-
- import Book.Book;
- import Book.BookList;
-
- public class Show implements IO{
- public void work(BookList bookList) {
- System.out.println("打印书单!!");
- int currentSize= bookList.getUsedSize();
- for (int i = 0; i < currentSize; i++) {
- Book book=bookList.getBooks(i);
- System.out.println(book);
- }
- }
- }
7. 退出系统 ( Exit 类 )
可以直接通过 Java 本身的 exit 方法进行编写,代码如下:
- package Operate;
-
- import Book.BookList;
-
- public class Exit implements IO{
- public void work(BookList bookList) {
- System.out.println("退出系统!!");
- System.exit(0);
- }
- }
以上实现的图书管理系统也存在些许缺陷:就比如 不能做到持久化的保存;用来存储书的是数组……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。