哈喽,大家好,我是无敌小恐龙。
写一个图书管理系统,可以回顾以前所学习是知识:数据类型,变量,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(),
};
}
//重写自己的菜单方法
@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("********************");
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 不能出现在构造方法中,书的借出是要看有人借了才是借出状态,且全局变量初始就是false
public 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方法,输出时更看得懂,更好看些,用来展示书本的功能!
@Override
public 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{
@Override
public 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 {
//存在就删除这本我不想要的书
//以下为从数组删除这本书的方法
//如果为最后一本图书,特判,直接置为null
if(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{
@Override
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()) ) {
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{
@Override
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("归还"+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);
}
}
}
五、拓展
怎么进行数据的保存,数据库。
功能拓展:书名,价格,作者名排序
感谢铁子能看到这里。希望有所收获,如果有哪些不对的地方还请大方指正!