文章目录
前言
博文介绍:JavaSE初学者利用类和对象、封装继承多态、抽象类和接口的知识完成了一个图书管理系统
软件:IntelliJ IDEA Community Edition 2022.3.3
正文
一、对象打包
说明
Java是面向对象的语言,所以利用Java做项目的第一步就是把对象抽象,用类表示出来。本文图书管理系统是用户、书、操作(对象)之间交互完成的,所以我们第一步是要创建相关的类,由于一些类具有相关性,故把相关的类放到一个包下,可以使代码更有条理
(一)user包
User类
管理员和普通用户具有相同的属性(如:名字等),可以写一个User类作为父类,在父和子这样的继承体系下、通过方法的重写,可以通过父类的引用调用重写的方法实现多态(如:管理员和普通用户可以打印内容不同的菜单、管理员和普通用户实现不同的构造方法等)。
public abstract class User {
protected String name;
public Operation[] operation;
public User(String name) {
this.name = name;
}
public abstract int menu();
}
AdminUser类(管理员类-----继承于User类)
package user;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
super.operation=new Operation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};
}
@Override
public int menu() {
System.out.println("*********************");
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();
System.out.println("*********************");
return choice;
}
}
NormalUser类(普通用户类-----继承于User类)
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name) {
super(name);
super.operation=new Operation[]{new ExitOperation(),new FindOperation(),new BorrowedOperation(),new ReturnOperation()};
}
@Override
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);
System.out.println("请选择对应功能");
int choice= scanner.nextInt();
System.out.println("*********************");
return choice;
}
}
(二)book包
Book类(书)
一般类里的成员对象用Private修饰用来隐藏类的一些实现细节,成员方法用用Public修饰,Private修饰的成员变量只能在该类使用,所以要写一些方法能获得相关的成员变量
package book;
public class Book {
private String name;
private String author;
private double price;
private String type;
private boolean isBorrowed;
public Book(String name, String author, double 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 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;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
public String bookIsBorrowed(){
return this.isBorrowed==false?"未借出":"已借出";
}
}
BookList类(书架)
package book;
public class BookList {
private Book[] book=new Book[10];
private int bookNum;
public BookList() {
book[0]=new Book("三国演义","罗贯中",17.8,"小说");
book[1]=new Book("红楼梦","曹雪芹",17.8,"小说");
book[2]=new Book("西游记","吴承恩",17.8,"小说");
this.bookNum=3;
}
public Book[] getBook() {
return book;
}
public void setBook(Book[] book) {
this.book = book;
}
public void setBook(int num,Book addBook) { //方法的重载
this.book[num]=addBook;
}
public int getBookNum() {
return bookNum;
}
public void setBookNum(int bookNum) {
this.bookNum = bookNum;
}
}
(三)operation包
实现操作需要一定规范,这就用到了接口,具体的操作贯彻接口
Operation接口
package operation;
import book.BookList;
public interface Operation {
public abstract void work(BookList bookList);
}
二、框架搭建
框架搭建肯定要写登录方法,登陆方法要选择用户身份并返回相应用户类,不同用户类由于方法重写会生成不同菜单(菜单的实现在用户类里),根据菜单返回一个int值,对应相应的操作,那么用户怎样根据返回值做对应的操作呢?这是一个很巧妙的问题!!!!!!
在User父类里定义一个存放操作的数组,利用方法重写在子类构造方法里里生成不同的操作组,就可以根据菜单提示返回的int值做数组下标访问不同的操作
import book.BookList;
import operation.Operation;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
System.out.println("请选择用户身份:0-管理员用户 1-普通用户");
Scanner scanner=new Scanner(System.in);
int num=scanner.nextInt();
System.out.println("请输入用户姓名:");
String name=scanner.next();
System.out.println("hello "+name+" 欢迎来到图书管理系统小练习");
if(num==0){
return new AdminUser(name);
}else{
return new NormalUser(name);
}
}
public static void doOperationWork(Operation operation, BookList bookList){
operation.work(bookList);
}
public static void main(String[] args) {
User user=login();
BookList booklist=new BookList();
while(true) {
int choice = user.menu();
doOperationWork(user.operation[choice],booklist);
}
}
}
三、功能实现
(一)增加图书
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements Operation {
@Override
public void work(BookList bList) {
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("请输入新增图书的价格:");
double price= scanner.nextDouble();
System.out.println("请输入新增图书的类型:");
String type= scanner.next();
Book addBook=new Book(name,author,price,type);
int num=bList.getBookNum();
bList.setBook(num,addBook);
bList.setBookNum(num+1);
System.out.println("添加成功");
System.out.println("*********************");
}
}
(二)删除图书
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入需要删除的书名:");
String bookname=scanner.nextLine();
int i = 0;
int flag=-1;
for (; i < bookList.getBookNum(); i++) {
if(bookname.equals(bookList.getBook()[i].getName())){
flag=i;
break;
}
}
if(i==bookList.getBookNum()){
System.out.println("没有找到这本书!");
}else {
for (int j = i; j < bookList.getBookNum()-1; j++) {
Book book=bookList.getBook()[j+1];
bookList.getBook()[j]=book;
}
bookList.setBook(bookList.getBookNum()-1,null);
bookList.setBookNum(bookList.getBookNum()-1);
System.out.println("删除图书成功");
}
System.out.println("*********************");
}
}
(三)查找图书
package operation;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入需要查找的书名:");
String bookname=scanner.nextLine();
int i = 0;
for (; i < bookList.getBookNum(); i++) {
if(bookname.equals(bookList.getBook()[i].getName())){
System.out.println("找到了!");
System.out.print("{书名:"+bookList.getBook()[i].getName());
System.out.print(",作者:"+bookList.getBook()[i].getAuthor());
System.out.print(",价格:"+bookList.getBook()[i].getPrice());
System.out.print(",类型:"+bookList.getBook()[i].getType());
System.out.print(","+bookList.getBook()[i].bookIsBorrowed()+"}");
System.out.println();
break;
}
}
if(i==bookList.getBookNum()){
System.out.println("没有找到这本书!");
}
System.out.println("*********************");
}
}
(四)显示图书
package operation;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入需要查找的书名:");
String bookname=scanner.nextLine();
int i = 0;
for (; i < bookList.getBookNum(); i++) {
if(bookname.equals(bookList.getBook()[i].getName())){
System.out.println("找到了!");
System.out.print("{书名:"+bookList.getBook()[i].getName());
System.out.print(",作者:"+bookList.getBook()[i].getAuthor());
System.out.print(",价格:"+bookList.getBook()[i].getPrice());
System.out.print(",类型:"+bookList.getBook()[i].getType());
System.out.print(","+bookList.getBook()[i].bookIsBorrowed()+"}");
System.out.println();
break;
}
}
if(i==bookList.getBookNum()){
System.out.println("没有找到这本书!");
}
System.out.println("*********************");
}
}
(五)借阅图书
package operation;
import book.BookList;
import java.util.Scanner;
public class BorrowedOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入需要借阅的书名:");
String bookname=scanner.nextLine();
int i = 0;
for (; i < bookList.getBookNum(); i++) {
if((bookname.equals(bookList.getBook()[i].getName()))&&bookList.getBook()[i].isBorrowed()==false){
bookList.getBook()[i].setBorrowed(true);
System.out.println("借阅成功!");
break;
}else if((bookname.equals(bookList.getBook()[i].getName()))&&bookList.getBook()[i].isBorrowed()==true){
System.out.println("已借出!");
break;
}
}
if(i==bookList.getBookNum()){
System.out.println("没有找到这本书!");
}
System.out.println("*********************");
}
}
(六)归还图书
package operation;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入需要归还的书名:");
String bookname=scanner.nextLine();
int i = 0;
for (; i < bookList.getBookNum(); i++) {
if((bookname.equals(bookList.getBook()[i].getName()))&&bookList.getBook()[i].isBorrowed()==true){
bookList.getBook()[i].setBorrowed(false);
System.out.println("归还成功!");
break;
}else if((bookname.equals(bookList.getBook()[i].getName()))&&bookList.getBook()[i].isBorrowed()==false){
System.out.println("已归还!");
break;
}
}
if(i==bookList.getBookNum()){
System.out.println("没有找到这本书!");
}
System.out.println("*********************");
}
}
(七)退出系统
package operation;
import book.BookList;
public class ExitOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("退出登录");
System.exit(0);
}
}
总结
gitee网址:https://gitee.com/zy-small-watermelon/java.git