前言:
这里只是基本的实现了一些功能,主要的我要说的还是框架是怎么搭出来,业务逻辑就是填写的事了,下面是实现展示和主目录:
管理员身份:
![](https://img-blog.csdnimg.cn/direct/18e19e5fe4504f7b888d348e72e6c0a6.png)
普通用户身份:
![](https://img-blog.csdnimg.cn/direct/edc0db5d591c4b8181ddc03c433a7d04.png)
![](https://img-blog.csdnimg.cn/direct/41dbb7f688e64b42a805147d52ccf2a3.png)
一、搭建框架
1.1书和书架:
首先我们要目前目标,我们需要对什么进行操作,明显是书,所以我们就必须要有书的类,书要怎么管理?我们可以定义一个书架类。书的类很好定义,填写书的属性就好,没有什么特殊的什么方法或者属性。书架也是一样,只需要将书为属性作为书架的成员就好了,还需要有一个书的数量,不然不方便后面的遍历。
书的代码:
package book;
public class Book {
private String name;
private String author;
private int price;
private String type;
private boolean state;
//初始化书m,boolean类型默认初始化为false,
// false我们当作未借出的状态,
// 所以也不需要利用构造方法初始了
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 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 isState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
//用三目运算符来表示状态,true为借出,false为未借出
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", state=" +'\''+ (state==true?"借出":"未借出") +'\'' +
'}';
}
}
书架的代码:
package book;
public class BookList {
//数组管理书
private Book[] book = new Book[3];
//获取书的数组
public Book[] getBook() {
return book;
}
//修改书的数组,后面扩容要用到
public void setBook(Book[] book) {
this.book = book;
}
//根据下标获取书对象
public Book getBook(int pos) {
return book[pos];
}
//根据下标修改书的对象
public void setBook(int pos,Book book) {
this.book[pos] = book;
}
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
//初始化书架,一开始就放入三本书
public BookList() {
book[0] = new Book("红楼梦","曹雪芹",60,"小说");
book[1] = new Book("活着","余华",20,"小说");
book[2] = new Book("三体","刘慈欣",168,"小说");
//书的数量改为3
this.size = 3;
}
}
1.2工具:
为了后面方便管理,减少代码量,我们可以创建一个接口,所以的工具类都实现一个接口,这样就是一个方法有多个不同的类,后面可以通过接口类型的数组来将所以类管理起来。
接口代码:
package tool;
import book.BookList;
public interface Operate {
public abstract void tool(BookList bookList);
}
其他类实现功能的代码:
package tool;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindBook implements Operate{
@Override
public void tool(BookList bookList) {
System.out.println("查找图书");
System.out.print("请输入您要查找的书名:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
for (int i = 0; i < bookList.getSize(); i++) {
Book book = bookList.getBook(i);
if(name.equals(book.getName())){
System.out.println("查询成功!!!");
System.out.println(book);
return;
}
}
System.out.println("暂无此书");
}
}
这里我展示一个,其他业务逻辑一一实现就好。
1.3普通用户和管理员:
可以看到上面展示的有两个身份访问的功能是不一样的,所以需要定义一个普通用户类和一个管理员用户类,但是两个类明显有共同的地方,比如属性,名字,所以可以抽取出来一个父类,用户类。
用户类:
package user;
import book.BookList;
import tool.*;
public class User {
//这里用protected修饰是为了继承下去又不想被其他类给调用
protected String name;
//接口类型的数组,来区别普通用户和管理员的功能区别
protected Operate[] operate;
protected int count ;
public User(String name) {
this.name = name;
}
//每个用户都有独特的菜单界面所以重写就好
public int menu(){
return 0;
}
//当所有子类填写完一个一个工具类对象,
// 就可以通过父类来调用不同子类,
// 所以后面可以用一行代码来调用所以工具类
public void tool(int pos, BookList bookList) {
operate[pos].tool(bookList);
}
}
普通用户类:
package user;
import tool.*;
import java.util.Scanner;
public class RegularUser extends User{
public RegularUser(String name) {
super(name);
operate = new Operate[]{
new OutSystem(),
new ShowBook(),
new FindBook(),
new BorrowBook(),
new ReturnBook()};
}
//普通用户菜单
@Override
public int menu() {
//只执行一次
if(count==0){
System.out.println(this.name+"您好,欢迎来到图书管理系统");
}
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.print("请输入您的操作:");
Scanner sc = new Scanner(System.in);
count++;
//返回选择功能的下标
return sc.nextInt();
}
}
管理员用户:
package user;
import tool.*;
import java.util.Scanner;
public class Admin extends User {
//初始化管理员用户的功能,将功能填入接口数组里管理
public Admin(String name) {
super(name);
operate = new Operate[]{
new OutSystem(),
new FindBook(),
new AddBook(),
new DeleteBook(),
new ShowBook()};
}
@Override
public int menu() {
//欢迎只执行一次
if(count==0){
System.out.println(this.name+"您好,欢迎来到图书管理系统");
}
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.print("请输入您的操作:");
Scanner sc = new Scanner(System.in);
count++;
//返回选择功能的下标
return sc.nextInt();
}
}
二、使用步骤
1.获取用户对象:
public static User userLogin(){
System.out.print("请输入您的姓名:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
while(true){
System.out.println("请输入您的身份,1:管理员 2:普通用户");
int state = sc.nextInt();
if(state==1){
return new Admin(name);
}
else if(state==2){
return new RegularUser(name);
}
else{
System.out.println("无效输入!!!");
}
}
}
User user = userLogin();
这里我加了些互动操作,如果不需要互动可以直接new用户对象就行。
2.获取书架对象:
BookList bookList = new BookList();
3.调用对象里的方法对书架进行操作
int pos = user.menu();
user.tool(pos,bookList);
总结
这里解释一下整个运行流程:
这里以普通用户为例,管理员用户也是一样的。
![](https://img-blog.csdnimg.cn/direct/5e6306b311a74675a30d1097d482ce7b.png)
首先进入main方法获取到用户的对象,这时候子类会先调用父类构造方法,所以父类也初始化完成了,接口类型数组继承到子类,子类的构造方法将子类的功能初始化到接口数组里为了后面父类调用方法。
![](https://img-blog.csdnimg.cn/direct/3e6ea57fba9841a29232bbfa9c6a1859.png)
![](https://img-blog.csdnimg.cn/direct/2457dbf5ccf844b39cee6fd8e794a112.png)
![](https://img-blog.csdnimg.cn/direct/6c1249fc0ba64f7fab370e044ab69fe9.png)
用户调用菜单方法获取选择的功能下标,因为是数组可以通过下标来访问,前面初始化数组的时候功能按照下标来排序。
![](https://img-blog.csdnimg.cn/direct/48235f43dbbe4d84873bb2f5eb4cb1f8.png)
![](https://img-blog.csdnimg.cn/direct/1ea5d62f1b2d49059c66c30fe873a78b.png)
![](https://img-blog.csdnimg.cn/direct/02c6c19e72554480959a6c4fbd85648e.png)
获取了功能的下标,又可以new出书架对象,就可以调用父类的功能方法来对书架就行操作,到达目的了。
![](https://img-blog.csdnimg.cn/direct/4d4f398053e94455bb24e48ca4b0cb6a.png)
![](https://img-blog.csdnimg.cn/direct/448f3670273b49759e5ff292f1901bd0.png)
![](https://img-blog.csdnimg.cn/direct/f83c09a3adc949e08a78bfc1edc4b9ad.png)
![](https://img-blog.csdnimg.cn/direct/f1d11418136f4ad9ae8950c80dcb5e66.png)
效果展示:
![](https://img-blog.csdnimg.cn/direct/7773775bfecc4cfd8c1c73f9e27fefdb.png)
![](https://img-blog.csdnimg.cn/direct/ff0e7b5716b14ef9a00ce949c838204d.png)