前言:
- 一、图书管理系统是什么样的?
- 二、准备工作
- 分析有哪些对象?
- 画UML图
- 三、实现三大模块
- 用户模块
- 书架模块
- 管理操作模块
- 管理员操作有这些
- 普通用户操作有这些
- 四、Test测试类
- 五、拓展
哈喽,大家好,我是无敌小恐龙。
写一个图书管理系统,可以回顾以前所学习是知识:数据类型,变量,if ,for,数组,方法,类和对象,封装,继承,多态,抽象类和接口。把这些知识串起来,不仅可以加深我们对知识的理解,还可以初步理解做一个系统是什么流程,资源包也上传了哦。
一、图书管理系统是什么样的?
请看如下动图:
程序一运行:开始先输入名字,在输入身份是否为管理员还是普通用户,最终就是一些操作了。这就是要做的简单图书管理系统了,心理暗自说:还是蛮简单的嘛,嘿嘿嘿。重点是学Java面向对象的开发思想哟!!!对象与对象之间的联系。
二、准备工作
分析有哪些对象?
用户: 管理员 普通用户
书:Book 书架
一些操作: 操作的是书架
画UML图
三大模块:用户模块,书架模块,管理操作模块
三、实现三大模块
用户模块
用户分为管理员和普通用户,可以抽象出一个公共的类:User(abstract) 其子类有Admin,NormalUser。放入一个包User中。
User
package User;import Book.Bookshelf;
import Operation.IOOperation;public abstract class User {//用户名protected String name;//用户的管理操作protected IOOperation[] operations;public User(String name) {this.name = name;}//抽象的菜单方法,应为不同的用户有不同的实现菜单方式,返回值为int 返回 你要选择那个?public abstract int menu();//不同的用户,不是也有不同的操作吗?//注意:操作的是书架//答:采用了多态public void doOperation(int option,Bookshelf bookshelf) {operations[option].work(bookshelf);}}
Admin
package User;import Operation.*;
import java.util.Scanner;
public class Admin extends User{public Admin(String name) {super(name);//不同的用户操作不同,直接在用户初始化时,就决定了有那些操作了--->直接赋值this.operations = new IOOperation[]{new ExitSystemOperate(),new FindBookOperate(),new AddBookOperate(),new DeleteBookOperate(),new ShowBookOperate(),};}//重写自己的菜单方法@Overridepublic 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("********************");System.out.println("请输入选项:");Scanner s = new Scanner(System.in);int option = s.nextInt();return option;}}
NormalUser:
package User;import Operation.*;
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.operations = new IOOperation[]{new ExitSystemOperate(),new FindBookOperate(),new BorrowBookOperate(),new BackBookOperate()};}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("********************");System.out.println("请输入选项:");Scanner s = new Scanner(System.in);int option = s.nextInt();return option;}}
书架模块
书类:
package Book;public class Book {private String name; //书名private String author; //作者private double price; //价格private String type; //类型private Boolean isBorrow; //是否借出//isBorrow 不能出现在构造方法中,书的借出是要看有人借了才是借出状态,且全局变量初始就是falsepublic Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;this.isBorrow = false;}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 getBorrow() {return isBorrow;}public void setBorrow(Boolean borrow) {isBorrow = borrow;}//重写toString方法,输出时更看得懂,更好看些,用来展示书本的功能!@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", "+(isBorrow==true?"已借出":"在馆")+'}';}
}
书架:
package Book;public class Bookshelf {//书架采用数组的形式存储书本,整个系统的操作都在维系着这个书数组!!!private Book[] bookList = new Book[10];//书数组已经使用的空间private int usedSize;//我们在这里,对书架初始化时就先放入了三本书了,这就是为什么上述动图,一查看书就有三本书了。public Bookshelf() {this.bookList[0] = new Book("三国演义","罗贯中",9.9,"小说");this.bookList[1] = new Book("西游记","吴承恩",19.9,"小说");this.bookList[2] = new Book("红楼梦","曹雪芹",29.9,"小说");this.usedSize = 3;}public Book[] getBookList() {return bookList;}//书是一本本存入public void setBook(Book book) {this.bookList[this.usedSize] = book;this.usedSize++;}//取书的话,要看书的位置(下标)public Book getBook(int pos) {return this.bookList[pos];}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}
管理操作模块
这么多的操作,就要用到接口IOOperation了has a 有这种操作work(),对书架的操作,书架里有书的数组work(Bookshelf bookshelf)!!!
IOOperation
package Operation;import Book.Bookshelf;public interface IOOperation {void work(Bookshelf bookshelf);}
管理员操作有这些
增加一本书
package Operation;
import Book.*;
import java.util.Scanner;public class AddBookOperate implements IOOperation{@Overridepublic void work(Bookshelf bookshelf) {Scanner s = new Scanner(System.in);System.out.println("新增图书........");System.out.println("请输入书名:");String name = s.nextLine();Book[] books = bookshelf.getBookList();//判断图书已满吗?if(bookshelf.getUsedSize()==bookshelf.getBookList().length) {System.out.println("馆里图书已满,不能新增图书!");return;}//判断书是否已经存在了for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {System.out.println("图书管已存在"+"《"+name+"》"+",新增失败!");return;}}//不存在,即可新增!System.out.println("请输入输入作者:");String author = s.nextLine();System.out.println("请输入输入价格:");double price = s.nextDouble();System.out.println("请输入输入书的类型:");s.nextLine();String type = s.nextLine();Book book = new Book(name,author,price,type);bookshelf.setBook(book);bookshelf.setUsedSize(bookshelf.getUsedSize()+1);System.out.println("新增图书"+name+"成功!");}
}
删除一本书
package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class DeleteBookOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("删除图书........");System.out.println("请输入你要删除的图书:");Scanner s = new Scanner(System.in);String name = s.nextLine();Book[] books = bookshelf.getBookList();Boolean isBook = false;int pos = -1;//判断图书是否存在for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {isBook = true;pos = i;}}//不存在if(isBook==false) {System.out.println("删除图书失败。"+"馆里还没有这本 "+name+" 书");} else {//存在就删除这本我不想要的书//以下为从数组删除这本书的方法//如果为最后一本图书,特判,直接置为nullif(pos==bookshelf.getUsedSize()-1) {books[pos] = null;}else{//不是最后一本,则按这种算法for (int i = pos; i < bookshelf.getUsedSize()-1; i++) {if(name.equals(books[i].getName())) {books[i] = books[i+1];}}}//最后修改使用的大小bookshelf.setUsedSize(bookshelf.getUsedSize()-1);}}
}
展示所有的书
package Operation;import Book.Book;
import Book.Bookshelf;public class ShowBookOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("显示图书........");Book[] books = bookshelf.getBookList();//遍历打印for (int i = 0; i < bookshelf.getUsedSize(); i++) {System.out.println(books[i]);}}
}
退出图书馆里系统
package Operation;import Book.Bookshelf;public class ExitSystemOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("退出图书系统........");System.exit(0);}
}
普通用户操作有这些
借一本书
package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class BorrowBookOperate implements IOOperation{@Overridepublic void work(Bookshelf bookshelf) {System.out.println("借阅图书........");Scanner s = new Scanner(System.in);System.out.println("请输入你要借阅的图书:");String name = s.nextLine();Book[] books = bookshelf.getBookList();for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName()) ) {if(books[i].getBorrow()==false) {//如果馆里有这本书,且还没被借走!System.out.println("借阅"+name+"成功!");books[i].setBorrow(true);return;}System.out.println("借阅失败。"+name+" 已被借出。");return;}}System.out.println("借阅失败。"+"馆里还没有这本 "+name+" 书");}
}
归还一本书
package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class BackBookOperate implements IOOperation{@Overridepublic void work(Bookshelf bookshelf) {System.out.println("归还图书........");Scanner s = new Scanner(System.in);System.out.println("请输入你要归还的图书:");String name = s.nextLine();Book[] books = bookshelf.getBookList();//遍历书架,看是否有归还的这本书。总不能不是我们管的书,我还收下吧!!!for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {System.out.println("归还"+name+"成功!");books[i].setBorrow(false);return;}}System.out.println("归还失败。"+"馆里还没有这本 "+name+" 书");}
}
查找一本书
package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class FindBookOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("查找图书........");Scanner s = new Scanner(System.in);System.out.println("请输入要查找的图书:");String name = s.nextLine();//遍历书架Book[] books = bookshelf.getBookList();for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {System.out.println(books[i]);return;}}System.out.println("馆里还没有这本 "+name+" 书");}
}
退出图书馆里系统,和Admin一样的。
四、Test测试类
整个系统都在围绕书数组,所以要先new Bookshelf()。
在根据用户是什么身份,给其new 什么身份,再获取用户要进行那个操作,穿个给doOperation(option,bookshelf)。
import Book.*;
import User.*;import java.util.Scanner;public class Test {public static User log() {System.out.println("请输入你的姓名:");Scanner s = new Scanner(System.in);String name = s.nextLine();System.out.println("请输入你的身份: 1:管理员 2:普通用户");int id = s.nextInt();System.out.println("欢迎"+name+"来到图书管理系统");if(id==1) {return new Admin(name);} else if(id==2) {return new NormalUser(name);} else {System.out.println("输入错误,请重新输入!");return null;}}public static void main(String[] args) {Bookshelf bookshelf = new Bookshelf();User user = log();while(true) {int option = user.menu();user.doOperation(option,bookshelf);}}
}
五、拓展
怎么进行数据的保存,数据库。
功能拓展:书名,价格,作者名排序
感谢铁子能看到这里。希望有所收获,如果有哪些不对的地方还请大方指正!