前面我们已经学习到了javase的基本语法结构-继承,多态,接口,接下来就让我们大家一起来利用这些来手动实现一个小项目——简洁的图书管理系统
目录
1.思路
1.book类
1.book
2.booklist
2.user类
user
AdminUser
NormalUser
3.ioperation类
Ioperation(方法的统一接口)
AddOperation
BorrowOperation
DelOperation
ExitOperation
FindOperation
ReturnOperation
ShowOperation
总结
1.思路
如图所示
我们这个系统1.首先需要输入姓名,2.然后要通过不同用户的选择来展现不同的菜单,3.然后再根据菜单来进行增删改查,显示等
我们前面学习并了解了JAVA是一个面向对象的语言,那我们现在就可以粗略的将图书管理分为三个大体的类:书,用户,操作,于是我们可以在idea上先建设三个软件包,分别表示book,user,iopration然后单独创建一个Main函数
1.book类
book类中我们可以再分为两类book以及booklist,book负责存放书籍的各种信息,booklist负责充当书架功能,将书籍的各种信息存放下来
1.book
package book;
public class Book {
private String bookname;//书名
private String autor;//作者
private double price;//价格
private String type;//类型
private boolean isBorrowed;//是否借出
public Book(String name, String autor, double price, String type) {
this.bookname = name;
this.autor = autor;
this.price = price;
this.type = type;
}
public String getName() {
return bookname;
}
public void setName(String name) {
this.bookname = name;
}
public String getAutor() {
return autor;
}
public void setAutor(String autor) {
this.autor = autor;
}
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;
}
@Override
public String toString() {
return "BookList{" +
"name='" + bookname + '\'' +
", autor='" + autor + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
2.booklist
将book类组成一个数组存储起来,而且可以初始化书架,将书架上原始的书先存放进去
ackage book;
public class BookList {
private Book[] books = new Book[10];
private int useSize;
public BookList(){
this.books[0] = new Book("西游记","吴承恩",19.9,"小说");
}
}
初步解决好book类后我们就可以来处理用户类了
2.user类
首先我们发现当这个系统输入完名字后就会让我们选择用户还是管理员
由于不同的身份有相同的效果,且有些方法虽然名字相同但是实际上产生的效果并不相同
所以我们可以利用抽象类来让管理员类和用户类来进行继承操作
于是我们将user软件包分为三类
1.(父类)user
2.(管理员类) AdminUser
3.(用户类)NormalUser
然后我们就可以依据需求来写代码了
user
然后我们就可以根据管理员菜单和用户菜单来分别为其写代码了
AdminUser
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
}
//管理员界面
public int menu(){
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("**********************");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的操作:");
int choice = scanner.nextInt();
return choice;
}
}
NormalUser
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
}
@Override
public int menu() {
System.out.println("欢迎"+this.name+"来到图书系统");
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);
System.out.println("请输入你的操作:");
int choice = scanner.nextInt();
return choice;
}
}
做完以上代码,让我先自己手动的写一个初始的Main来检查下,
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import user.fly;
import java.util.Scanner;
public class Main {
public static User login(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的姓名");
String name = scanner.nextLine();
System.out.println("请选择你的身份 1. 用户 0.管理员");
int choice = scanner.nextInt();
if(choice == 1){
return new AdminUser(name);
}else if(choice == 0){
return new NormalUser(name);
} else{
return new fly(name);
}
}
public static void main(String[] args) {
BookList bookList = new BookList();//首先初始化出书架
while(true){
User user = login();//首先调用login
int choice = user.menu();
user.ioperation(choice,bookList);
}
}
}
其中最难办的就是login函数,输入名字相信大家都会,关键是后面的Return值,首先我们的需求是 想要根据自己手动输入choice来选择对应的菜单 ,但是我们想要不同的菜单就需要调用AdminUser和NormalUser的方法,此时函数就会报错,然后我们就需要用到向上转型,将函数类型定义为User。
3.ioperation类
搞定名字输入有,以及管理员和用户的区别后,我们就可以进行不同用户对应的功能实现
首先我们由于都只需要实现一个功能,所以我们暂且用一个接口来实现,在这个接口上放要展开的功能
和前面相同我们同样需要根据输入的数字不同来实现不同的功能
因为我们看到了菜单
1.首先我们要在菜单显示部分输入数字,故菜单menu方法的类型为整型,
2.menu内的数据将放回到user上,故我们同样需要利用User来实现方法的调用,
3.我们要在管理员和用户两个类上采用不同的两种方法且方法比较多,故我们可以使用数组来存储方法,并且用数组的下标来负责两者的连接,
4.但是当我们在Main方法上使用时,需要调用User,user上面并不存在数组,故我们需要在user(父类)方法上写一个新的成员变量,ioperation类的数组来存储方法们(其实和前面选择管理员和用户一样,都用到了向上转型)
5.然后我们就可以在user(父类)这个抽象类上写调用操作方式 的方法了
user代码:
package user;
import book.BookList;
import ioperation.Ioperation;
import java.awt.*;
public abstract class User {//因为不知道是管理员还是用户,所以我们使用抽象类
protected String name;//由于名字需要在界面传过来,实现包与包的的通用
//所以使用protected
protected Ioperation[] ioperations;//为操作定义一个数组方便进行方法的选择
public User(String name) {
this.name = name;
}
public abstract int menu();
public void ioperation(int choice, BookList bookList){
ioperations[choice].work(bookList);
}
}
AdminUser代码
package user;
import ioperation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
this.ioperations = new Ioperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation(),
};
}
//管理员界面
public int menu(){
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("**********************");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的操作:");
int choice = scanner.nextInt();
return choice;
}
}
NormalUser代码
package user;
import ioperation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.ioperations = new Ioperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation()
};
}
@Override
public int menu() {
System.out.println("欢迎"+this.name+"来到图书系统");
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);
System.out.println("请输入你的操作:");
int choice = scanner.nextInt();
return choice;
}
}
Ioperation(方法的统一接口)
写一个总体的父类,方便后面利用数组进行选择
package ioperation;
import book.BookList;
public interface Ioperation {
public void work(BookList bookList);
}
AddOperation
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;
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.nextLine();
int userSize = bookList.getUseSize();//getUserSize是获取书架上的size数据
for (int i = 0; i < userSize; i++) {
if(bookList.getBooks(i).getName().equals(name)){
System.out.println("找到了查找的书籍,不能添加");
return;
}
}
System.out.println("请输入你想要添加的书籍作者");
String autor = scanner.nextLine();
System.out.println("请输入你想要添加的书籍类型");
String type = scanner.nextLine();
System.out.println("请输入你想要添加的书籍价格");
double price = scanner.nextDouble();
Book book = new Book(name,autor,price,type);
bookList.setBooks(book,userSize);//setBooks
bookList.setUseSize(userSize+1);
}
}
BorrowOperation
package ioperation;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("正在借阅图书......");
System.out.println("请输入你想要借阅的书籍名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int userSize = bookList.getUseSize();
for (int i = 0; i < userSize; i++) {
if(bookList.getBooks(i).getName().equals(name)){
if(bookList.getBooks(i).isBorrowed()){
System.out.println("已经被其他人借出");
return;
}
bookList.getBooks(i).setBorrowed(true);
System.out.println("成功借出");
}
}
}
}
DelOperation
package ioperation;
import book.BookList;
import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;
public class DelOperation implements Ioperation {
@Override
public void work(BookList bookList) {
System.out.println("正在删除书籍.......");
System.out.println("请输入你想要删除的书籍名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int userSize = bookList.getUseSize();
int pos = -1;
for (int i = 0; i < userSize; i++) {
if(bookList.getBooks(i).getName().equals(name) == false){
System.out.println("并无此书");
return;
}
pos = i;
}
for (int j = 0,i = 0; j < userSize; j++) {
if(j != pos){
bookList.setBooks(bookList.getBooks(i),j);
i++;
}
}
bookList.setUseSize(userSize-1);
}
}
ExitOperation
package ioperation;
import book.BookList;
public class ExitOperation implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("正在退出系统......");
System.exit(0);
}
}
FindOperation
import java.awt.desktop.SystemEventListener;
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 name = scanner.nextLine();
int userSize = bookList.getUseSize();
for (int i = 0; i < userSize; i++) {
if(bookList.getBooks(i).getName().equals(name)){
System.out.println("找到了查找的书籍");
}
else {
System.out.println("没找到");
}
}
}
}
ReturnOperation
package ioperation;
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 name = scanner.nextLine();
int userSize = bookList.getUseSize();
for (int i = 0; i < userSize; i++) {
if(bookList.getBooks(i).getName().equals(name)){
if(bookList.getBooks(i).isBorrowed()){
bookList.getBooks(i).setBorrowed(false);
System.out.println("归还成功");
return;
}
System.out.println("此书并未借出");
}
else {
System.out.println("馆内并无这本书");
}
}
}
}
ShowOperation
package ioperation;
import book.BookList;
public class ShowOperation implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("正在展示书籍......");
int usersize = bookList.getUseSize();
for (int i = 0; i < usersize; i++) {
System.out.println(bookList.getBooks(i));
}
}
}
操作方法类大家多半都会,其实最难得是框架思路
总结
我们这次只要利用java的基本知识来初步实现了图书管理系统
首先根据小窗口,Main函数来实现了输入名字,然后想要分管理员和用户,
我们实现了User软件包,利用user类用继承,将用户和管理员包含进去,然后再Main函数上调用user的菜单方法,由于管理员类和用户类菜单方法的重写,实现向上转型,成功实现了管理员菜单和用户菜单的分离,
分离过后希望实现输入相同数字实现不同功能
我们就格外创建了功能方法类的软件包,将方法统一使用ioperation,方便将8种方法封装在Ioperation中,在 user中创建一个Ioperation数组,放在管理员和用户类中,通过两个不同数组来实现相同数字下标,方法不同的结果
booklist中get和set方法也要记得改成数组形式