设计一个图书管理系统,根据管理员和普通用户分类,实现不同的功能菜单,对图书系统进行管理。(通过代码实现简单登录,以及客户端,用户端功能的设计。)
1,项目主体大致分为三类,和书相关的类,和操作相关的类,和用户相关的类。(因此需要定义三个包:book,operation,User)
2.因为图书管理系统书是主要的元素,所以需要定义一个Book类,来表示书。定义一个Booklist类(顺序表:本质是数组)来存储书籍。
3.关于操作包内需要根据需求,具体定义类来实现具体要求的功能
3.用户包中,定义一个抽象user类,通过对user的继承实现管理员(Admin)类,和普通用户(NormalUser)类进行具体功能的实现。
package book;
//书是一个主体(对象),是图书馆中的组成部分
public class Book {
private String name;
private String author;
private int price;
private String type;
private boolean isBorrowed;
//构造方法用于初始化
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
//getter,setter接口也是用于对成员变量初始化,但是可以对变量任意赋值和使用,
//比构造方法更加方便
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;
}
//打印图书内容
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
package book;
import java.util.Arrays;
//顺序表(数组)存储所有图书
public class BookList {
//顺序表本来就是数组,定义一个Book类的数组对书进行存储,容量为100
Book [] books=new Book[100];
//usedSize:书的数量的有效长度
public int usedSize=0;
public BookList(){
//初始化存储三本书
books[0]=new Book("三国演义","罗贯中",20,
"小说");
books[1] = new Book("水浒传", "施耐庵", 100,
"小说");
books[2] = new Book("西游记", "吴承恩", 100,
"小说");
this.usedSize=3;
}
//setBook和getBook不一定要随机生成,要自己设立内容,来满足需求
//设置图书:将pos位置的元素设为指定的书book
public void setBook(int pos,Book book)
{
this.books[pos]=book;
}
//获得pos位置的图书
public Book getBooks(int pos) {
return this.books[pos];
}
//可以根据实际情况更改UsedSize
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
}
package operation;
//导入book类下的Book类和booklist类
import book.Book;
import book.BookList;
import java.util.Scanner;
//类实现Ioperation:在下面的接口部分会说
public class AddOperation implements IOperation{
@Override
//输入新增图书的信息
public void work(BookList bookList) {
//输入添加新书的信息
System.out.println("新增图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入图书的名字");
String name=scanner.next();
System.out.println("请输入图书的作者");
String author=scanner.next();
System.out.println("请输入图书的价格");
int price=scanner.nextInt();
System.out.println("请输入图书的类型");
String type=scanner.next();
//根据输入信息生成一本书book
Book book=new Book(name,author,price,type);
//获取目前顺序表的有效长度
int curSize=bookList.getUsedSize();
//利用steBook在相应位置存入图书
bookList.setBook(curSize,book);
//有效长度加一
bookList.setUsedSize(curSize+1);
System.out.println("新增成功!");
}
}
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation {
@Override
public void work(BookList bookList) {
Scanner scanner =new Scanner(System.in);
System.out.println("请借阅图书的名字");
String name=scanner.next();
for (int i = 0; i <bookList.getUsedSize() ; i++) {
Book book=bookList.getBooks(i);
if (book.getName().equals(name))
{
//借阅图书就是将图书的状态改为已经借出,即通过setBorrowed接口
//将isBorrowed改为true
book.setBorrowed(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("查无此书!");
}
}
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
Scanner scanner =new Scanner(System.in);
System.out.println("请输入删除图书的名字");
String name=scanner.next();
int i=0;
for (; i <bookList.getUsedSize() ; i++) {
Book book=bookList.getBooks(i);
if (book.getName().equals(name))
{
break;
}
}
if (i==bookList.getUsedSize())
{
System.out.println("查无此书!");
}
else {
//删除图书和前面说到的顺序表删除元素的原理一样,就是让后面的元素前进一位覆盖掉要删除的元素
for (int pos=i;pos<bookList.getUsedSize()-1;pos++)
{
//pos位置的书改为pos+1位置的书。覆盖要删除的元素
bookList.setBook(pos,bookList.getBooks(pos+1));
System.out.println("删除成功");
}
//有效长度减一
bookList.setUsedSize(bookList.getUsedSize()-1);
}
}
}
package operation;
import book.Book;
import book.BookList;
public class DisplayOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("显示图书");
for (int i = 0; i <bookList.getUsedSize() ; i++) {
Book book=bookList.getBooks(i);
System.out.println(book.toString());
}
}
}
package operation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(1);
}
}
package operation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(1);
}
}
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void work(BookList bookList) {
Scanner scanner =new Scanner(System.in);
System.out.println("请输入归还图书的名字");
String name=scanner.next();
for (int i = 0; i <bookList.getUsedSize() ; i++) {
Book book=bookList.getBooks(i);
if (book.getName().equals(name))
{
//将是否借出改为false(未借出)
book.setBorrowed(false);
System.out.println("归还成功!");
return;
}
}
System.out.println("查无此书!");
}
}
因为上述功能都有一个work方法,所以干脆将work定义在一个类中,通过类对接口的实现,重写work方法,实现具体的功能。
package operation;
import book.BookList;
public interface IOperation {
public void work(BookList bookList);
}
package user;
import book.BookList;
import operation.IOperation;
public abstract class User {
//图书管理/借阅人的姓名
protected String name;
//因为管理员和普通用户可以执行的功能不同,所以父类需要一个执行数组,
// 然后子类根据实际情乱况进行初始化
protected IOperation [] operations;
public User(String name) {
this.name = name;
}
//客户端和普通用户的菜单不一样,所以父类不做具体的处理,方法定义为abstract类型。所以类也应为abstract类型,仅用作被继承的作用
public abstract int menu();
/**
* IOperation写在这里的好处
* 1.IOperation数组本身就在这个类中。可以直接使用
* 2.子类继承User也可以直接调用IOperation
* 3.主函数可以直接通过user调用IOperation;
* @param bookList
* @param choice
*/
public void IOperation(BookList bookList,int choice)
{
//选中数字指令后,执行对应类下的work
this.operations[choice].work(bookList);
}
}
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
//帮助父类完成构造方法
public NormalUser(String name) {
super(name);
//初始化对应序列需要实现的功能(对应菜单)
this.operations=new IOperation[]{
//“0”号下标对应退出
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
new DisplayOperation()
};
}
@Override
public int menu() {
System.out.println("=============================");
System.out.println("Hello " + this.name + ", 欢迎使用图书管理系统!");
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 scanner = new Scanner(System.in);
return scanner.nextInt();
}
}
package user;
import operation.*;
import java.util.Scanner;
public class Admin extends User{
public Admin(String name) {
super(name);
this.operations =new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation(),
};
}
@Override
public int menu() {
System.out.println("=============================");
System.out.println("Hello " + this.name + ", 欢迎使用图书管理系统!");
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 scanner=new Scanner(System.in);
return scanner.nextInt();
}
}
//导包
import book.BookList;
import user.Admin;
import user.NormalUser;
import user.User;
import javax.jws.soap.SOAPMessageHandlers;
import java.util.List;
import java.util.Scanner;
public class TestBook {
//简单的登录系统
public static User Login()
{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你的姓名");
String name=scanner.next();
System.out.println("请输入信息,1.管理员,2.普通用户");
int choice=scanner.nextInt();
//判断是管理员还是普通用户
if (choice==1)
{
//向上转型的三种形式之一
return new Admin(name);
}
return new NormalUser(name);
}
public static void main(String[] args) {
//获得书架
BookList bookList=new BookList();
//向上转型
User user= Login();
//多态+运行时绑定
while (true) {
//Admin和NormalUser都有menu方法,所以user.menu会发生运行时绑定,
//调用自己的menu方法
//调用menu后返回用户选中的指令
int choice = user.menu();//menu返回选中的指令
//IOperation父类特有的方法
//调用执行方法
user.IOperation(bookList, choice);
}
}
}
1.ヾ(≧▽≦*)o顺序表多项功能的实现
2.ヾ(≧▽≦*)o深入浅出“多态与接口
3.java类的继承