前言
首先既然是管理系统,那咱们就要实现以下这几个功能了-->
分析
1.首先是用户分为两种,一个是管理员,另一个是普通用户,既如此,可以定义一个用户类(user),在定义管理员类,普通用户类去继承。
2.还有就是书这个对象,首先是书的属性(书名,作者,价格,种类,是否借出),这可以定义成一个Book类,其实就是存储这些新的容器-- 书架类(Booklist)
3.最后这些功能,仔细观察,由于身份不同,操作也不同,一般来讲,我们可以把对应的方法放到对应的类当中去,但这次用接口也可以巧妙实现
分模块进行编码
book包
为了方便查看,就把这两个类放进一个book的包里。
Book类
package book;
public class Book {
private String name;//姓名
private String author;//作者
private int price;//价格
private String type;//类型
private boolean isLead;//是否被借出
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 isLead() {
return isLead;
}
public void setLead(boolean lead) {
isLead = lead;
}
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isLead==true ? "已借出":" 未借出")+
//", isLead=" + isLead +
'}';
}
}
在这个类中,把书的属性成员定义为私有,通过公共成员函数去访问和调用,最后重写toString 方法来表示输出。
Booklist类
package book;
public class Booklist {
private Book[] books =new Book[10];
private int usedSize;//记录存放次数
public Booklist() {
books[0]=new Book("红楼梦","曹雪芹",25,"小说");
books[1]=new Book("月华","小明",27,"小说");
books[2]=new Book("多少","小花",20,"小说");
this.usedSize=3;
}
public boolean isFull(){//判断书架是否满
if(this.usedSize==books.length){
return true;
}else{
return false;
}
}
public int getUsedSize() {//获取存了多少本书
return usedSize;
}
//设定书的数量
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getBooks(int pos) {//获取书架中pos位置书的信息
return books[pos];
}
//把新增的图书信息放到pos位置上去
public void setBooks(int pos,Book book) {
books[pos]=book;
}
}
在这个书架类中,定义一个容量为10的对象数组来存储书的信息,事先存入三本书,同时usedSize 用来记录书的数量,而后面的方法则与实现对应的功能相关。且往后细看~接口类
package operater;
import book.Booklist;
public interface IOperation {
void work(Booklist booklist);
}
在这个接口里定义了一个方法 work,该方法需要一个 Booklist 对象作为参数。任何实现 IOperation 接口的类都必须提供 work 方法的具体实现。这样一来就方便不同的用户进行操作了。
User包
user类
package User;
import book.Booklist;
import operater.IOperation;
// 定义一个抽象类 user,表示用户
public abstract class user {
protected String name;
// 构造方法,初始化用户名称
public user(String name) {
this.name = name;
}
//抽象方法,显示菜单并返回用户选择的操作编号
public abstract int menu();
//存储用户可以执行的操作数组
protected IOperation[] iOperations;
//根据用户选择执行相应的操作
public void DoIoperation(int choice, Booklist booklist) {
//调用用户选择的操作的 work 方法
this.iOperations[choice].work(booklist);
}
}
因为身份不同,所以显示的菜单也不同,所以便声明一个抽象方法 menu(),同时定义一个操作数组,来进行对应的操作,如图
普通用户类(Normaluser)
package User;
import operater.*;
import java.util.Scanner;
public class Normaluser extends user{
//重写构造方法
public Normaluser(String name) {
super(name);
//根据不同的输入进行对应的操作,已经方法按顺序放入数组,所以位置别搞错了
this.iOperations=new IOperation[]{
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 scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
管理员类(Adminuser)
package User;
import operater.*;
import java.util.Scanner;
public class Adminuser extends user{
public Adminuser(String name) {
super(name);
this.iOperations=new IOperation[]{
new Exit(),
new Find(),
new Add(),
new Del(),
new Show()
};
}
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 scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
operater包
Add类
package operater;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class Add implements IOperation{
public void work(Booklist booklist1){
if(booklist1.isFull()){
System.out.println("书架已满,不能新增!");
}
System.out.println("新增图书");
System.out.println("请输入你要新增的图书的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
System.out.println("请输入你要新增的图书的作者:");
String bookAuthor= scanner.nextLine();
System.out.println("请输入你要新增的图书的价格:");
int bookPrice = scanner.nextInt();
scanner.nextLine();
System.out.println("请输入你要新增的图书的类型:");
String bookType = scanner.nextLine();
Book book=new Book(bookName,bookAuthor,bookPrice,bookType);
int currentSize=booklist1.getUsedSize();//新增图书的位置其实就是i本书的位置
booklist1.setBooks(currentSize,book);
booklist1.setUsedSize(currentSize+1);//书的数量+1
System.out.println("成功添加图书");
}
}
在新增图书的过程中,要分别添加书的属性才行,这时切不可直接用booklist,这时类对象,不是数组,创建一个对象数组book,之前Booklist中方法便派上用场, 看图就更好理解了~
Borrow类
package operater;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class Borrow implements IOperation{
public void work(Booklist booklist1){
System.out.println("借阅图书");
System.out.println("请输入你要借阅的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
//找到要借阅的书的下标
for (int i=0; i < booklist1.getUsedSize() ; i++) {
Book book1=booklist1.getBooks(i);
if(book1.getName().equals(bookName)) {
book1.setLead(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("借阅失败!");
}
}
借阅图书其实和删除差不多,只要改变状态为已借出。
Del类
package operater;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class Del implements IOperation{
public void work(Booklist booklist1){
System.out.println("删除图书");
System.out.println("请输入你要删除的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
int current=booklist1.getUsedSize();
int pos=-1;
int i = 0;
//找到要删除的书的下标
for (; i < current ; i++) {
Book book1=booklist1.getBooks(i);
if(bookName.equals(book1.getName())) {
//System.out.println("找到了");
pos=i;
}
}
if(pos>=current){
System.out.println("没有你要找的书!");
}
//开始删除
for (int j = pos; j <current-1; j++) {
// booklist1[j]=booklist1[j+1];不能直接用类对象
Book book= booklist1.getBooks(j+1);
booklist1.setBooks(j,book);
}
booklist1.setUsedSize(current-1);
booklist1.setBooks(current-1,null);
System.out.println("删除成功!");
}
}
删除图书,首先要找到要删除图书的下标pos, 找到后要把后面的图书全都往前移动一格,从pos位置开始遍历,将j+1位置的图书存放到book对象中去,在调用setBook方法传给j位置。后面的位置设置成null,同时更新书的数量~
Exit类
package operater;
import book.Booklist;
public class Exit implements IOperation{
public void work(Booklist booklist1){
System.out.println("退出系统");
//避免退出系统后内存被回收
int current=booklist1.getUsedSize();
for (int i = 0; i < current ; i++) {
booklist1.setBooks(i,null);
}
System.exit(0);
}
}
直接调用系统的退出即可~
Find类
package operater;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class Find implements IOperation{
public void work(Booklist booklist1){
System.out.println("查找图书");
System.out.println("请输入你要查找的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
int current=booklist1.getUsedSize();
for (int i = 0; i < current ; i++) {
Book book1=booklist1.getBooks(i);
if(bookName.equals(book1.getName())) {
System.out.println("找到了");
System.out.println(book1);
return;
}
}
System.out.println("没找到这本书!");
}
}
Return类
package operater;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class Return implements IOperation{
public void work(Booklist booklist1){
System.out.println("归还图书....");
System.out.println("请输入你要归还的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
//找到要归还的书的下标
for (int i=0; i < booklist1.getUsedSize() ; i++) {
Book book1=booklist1.getBooks(i);
if(book1.getName().equals(bookName)) {
book1.setLead(false);
System.out.println("归还成功!");
return;
}
}
System.out.println("归还失败!");
}
}
Show类
package operater;
import book.Book;
import book.Booklist;
public class Show implements IOperation{
public void work(Booklist booklist1){
System.out.println("展示图书");
int current=booklist1.getUsedSize();
for (int i = 0; i < current ; i++) {
Book book1=booklist1.getBooks(i);
System.out.println(book1);
}
}
}
这三个其实是大同小异的,都是循环遍历再进行对应的操作,这里主要记住的是String类型的数据比较不能直接用==,而是要用equals()方法。
看到最后,如果觉得文章写得还不错,++希望可以给我点个小小的赞++,您的支持是我更新的最大动力