前言
前面,我们学习了类和对象,继承和多态,抽象类和接口等基础知识,那么,我们利用这些知识来实现一个图书馆管理系统,以此来巩固一下前面的知识。
设计思路:
- 首先,我们得定义一个BOOK类,这个类用来描述书的价格,书名,作者等属性。有了书,那便得有书架,书架上存放着书。定义BookList类,可以先把几本书存放在书架上,即初始化。
- 对于普通用户和管理员来说,所展示出来的界面是不同的,所以对两者所展示出来的菜单和可实现的功能是不同的。
- 对于管理员来说,我们需要实现添加书籍,查找书籍,删除书籍,显示书籍和退出系统。
- 对于普通用户来说我们可以查找书籍,借阅书籍,归还书籍和退出系统。
- 主要针对管理员和普通用户来一 一实现这些功能
代码的实现
User包
这个包有用户类和管理员类
User类
package user;
import Oper.IOperation;
import book.Booklist;
public abstract class User {
public String name;
public IOperation[] iOperation;
public User(String name) {
this.name = name;
}
public abstract int menu();
public void dowork(int coice, Booklist booklist){
this.iOperation[coice].work(booklist);
}
}
AdminUser类(管理员)
package user;
import Oper.*;
import book.Booklist;
import java.util.Scanner;
public class AdminsUer extends User{
public AdminsUer(String name) {
super(name);
this.iOperation=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
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.退出系统");
Scanner scanner=new Scanner(System.in);
int chioe=scanner.nextInt();
return chioe;
}
}
NormolUser类(用户)
package user;
import Oper.*;
import java.util.Scanner;
public class NormolUser extends User{
public NormolUser(String name) {
super(name);
this.iOperation=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BrrowOperation(),
new ReturnOperation(),
new ShowOperation()
};
}
public int menu(){
System.out.println("_________________");
System.out.println("hello,"+name+"~");
System.out.println("1.查找图书!");
System.out.println("2.借阅图书!");
System.out.println("3.归还图书!");
System.out.println("4.显示图书!");
System.out.println("0.退出系统!");
Scanner scanner=new Scanner(System.in);
int chioe=scanner.nextInt();
return chioe;
}
}
book包
这个包里存放着Book和Booklist类
BOOK类
创建一个book包,包里面存放Book和BookList类。
首先是book类,注意构造方法中不用为isBorrowed属性初始化,因为默认就是false状态,在这里,我们对toString方法做了一点小小的改动,将true和false分别改成对应的借出和未借出状态。我们还提供了get和set方法来获取被封装的成员属性。
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;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public int getPrice() {
return price;
}
public String getType() {
return type;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(int price) {
this.price = price;
}
public void setType(String type) {
this.type = type;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + (isBorrowed==true?"已借出":"未借出") +
'}';
}
}
BookList类
这是一个书架类,我定义了一个Book类型的数组,大小暂时定了10个。在书架上存放了三本书进去。usedsiae是用来记录书架上有几本书
package book;
import java.util.Arrays;
public class Booklist {
private Book[] books=new Book[10];
private int usedsiae;
public Booklist() {
books[0]=new Book("三国演义","罗贯中",40,"小说");
books[1]=new Book("西游记","吴承恩",60,"小说");
books[2]=new Book("红楼梦","曹雪芹",45,"小说");
this.usedsiae=3;
}
public int getUsedsiae() {
return usedsiae;
}
public void setUsedsiae(int usedsiae) {
this.usedsiae = usedsiae;
}
public Book getBooks(int pos) {
return books[pos];
}
public void setBooks(int i,Book books) {
this.books[i] = books;
}
public Book[] getBooks() {
return books;
}
public void setBooks(int i) {
this.books[i] = books[i+1];
}
}
Oper包
这个包用来存放对书架的各种操作,例如查找图书,新增图书,删除图书等多种操作。
IOperation接口
提供这个接口是对books数组的操作,后面通过传入数组下标来调用各种对应的功能。
package Oper;
import book.Booklist;
public interface IOperation {
void work(Booklist booklist);
}
Showoperation类(显示图书)
package Oper;
import book.Booklist;
public class ShowOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("显示图书:");
int length= booklist.getUsedsiae();
for (int i = 0; i <length ; i++) {
System.out.println(booklist.getBooks(i));
}
}
}
FindOperation类(查找图书)
查找功能和遍历类似,只要利用equals关键字比较字符串输出就可以了。 在Findioperation 类中,先输入要查找的书名,遍历所有的书,比较书名,书名一样输出即可。
package Oper;
import book.Book;
import book.Booklist;
import java.util.Arrays;
import java.util.Scanner;
public class FindOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("查找图书");
System.out.println("请输入书名:");
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
System.out.println(str);
int length=booklist.getUsedsiae();
int b=0;
for (int i = 0; i <length ; i++) {
Book book=booklist.getBooks(i);
if (book.getName().equals(str)){
System.out.println("找到了这本书");
System.out.println(book);
b++;
break;
}
}
if(b==0) {
System.out.println("没有找到");
}
}
}
Addoperation类(添加图书)
检查 booklist 数组中有没有即将新增的图书,如果有就不再添加,如果没有检查书架是否溢出,如果没有,添加成功。注意,代码里多了这样一行代码 scanner.nextLine();,这个并不是写错,是为了吸收前面在键盘上输入的回车键,如果没有这一行,那么后面的属性值将无法输入直接结束输入。可以采用另一种方法解决,将int类型的都放在String类型前面也可以解决。
package Oper;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class AddOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("新增图书");
System.out.println("请输入你要添加的图书名:");
Scanner scanner=new Scanner(System.in);
String str= scanner.nextLine();
System.out.println("请输入书的作者");
String str1= scanner.nextLine();
System.out.println("请输入书的价格");
int price= scanner.nextInt();
scanner.nextLine();
System.out.println("请输入书的属性");
String str3=scanner.nextLine();
Book book=new Book(str,str1,price,str3);
for (int i = 0; i < booklist.getUsedsiae() ; i++) {
Book book1=booklist.getBooks(i);
if (book1.getName().equals(str)){
System.out.println("已经有这本书了,不能存放");
return;
}}
if(booklist.getUsedsiae() == booklist.getBooks().length) {
System.out.println("书架满了,不能操作");
}
else{
int b=booklist.getUsedsiae();
booklist.setBooks(b,book);
System.out.println("添加成功");
booklist.setUsedsiae(booklist.getUsedsiae()+1);
}
}
}
Exitoperation类(退出系统)
这个功能实现就比较简单了,System.exit(0;即可。
package Oper;
import book.Booklist;
public class ExitOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("退出系统");
System.exit(0);
}
}
Deloperation类(删除图书)
思路:首先找到有没有这本书,然后数组后边的数据从后往前直接覆盖掉想要删除的数据,然后将最后一个数据置空就可以了。
package Oper;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class DelOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("删除图书");
System.out.println("请输入你要删除的图书名:");
Scanner scanner=new Scanner(System.in);
String str= scanner.nextLine();
int max=booklist.getUsedsiae();
int b=0;
for (int i = 0; i <max ; i++) {
Book book1 =booklist.getBooks(i);
if (book1.getName().equals(str)==false){
b++;
}
}
if (b==max){
System.out.println("没有你要删除的书");
}
for (int i = 0; i <max ; i++) {
Book book =booklist.getBooks(i);
if (book.getName().equals(str)){
for (int j = i; j <max ; j++) {
booklist.setBooks(j);
}
System.out.println("删除成功");
booklist.setBooks(max-1,null);
booklist.setUsedsiae(max-1);
break;
}
}
}
}
Browoperation类(借阅图书)
借阅图书实现起来相对比较容易,输入要借阅的书名,如果有这本书,将这本书的
isBorrowed 置为 true 就可以了。
import book.Booklist;
import java.util.Scanner;
public class BrrowOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("借阅图书");
System.out.println("你要借阅哪本书");
Scanner scanner=new Scanner(System.in);
String str= scanner.nextLine();
int b=0;
int max= booklist.getUsedsiae();
for (int j = 0; j <max ; j++) {
Book book1 =booklist.getBooks(j);
if (book1.getName().equals(str)==false){
b++;
}
}
if (b==max){
System.out.println("没有你要借阅的书");}
for (int i = 0; i <max ; i++) {
Book book =booklist.getBooks(i);
if (book.getName().equals(str)){
book.setBorrowed(true);
System.out.println("借阅成功");
break;
}
}
}
}
Returnoperation类(归还图书)
和借阅图书功能一样,将isBorrowed置为true就可以了
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("归还图书");
System.out.println("你要归还哪本书");
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
int max=booklist.getUsedsiae();
for (int i = 0; i < max; i++) {
Book book=booklist.getBooks(i);
if (book.getName().equals(str)){
book.setBorrowed(false);
System.out.println("归还成功");
break;
}
}
}
}
Main方法
mport user.User;
import user.AdminsUer;
import java.util.Scanner;
public class Test {
public static User login(){
System.out.println("请输入你的姓名:");
Scanner scanner=new Scanner(System.in);
String str= scanner.nextLine();
System.out.println(str);
System.out.println("请选择你的身份:1->管理员 2->普通用户");
int number= scanner.nextInt();
if (number == 1) {
return new AdminsUer(str);
}
else {
return new NormolUser(str);
}
}
public static void main(String[] args) {
Booklist booklist=new Booklist();
User user=login();
while(true) {
user.dowork(user.menu(), booklist);
}
}
}