写在前面:本文主要讲解Java语言面向对象的一个小型的总结性项目,图书管理系统,主要包含了封装、多态、继承、接口等知识。我的码云地址:OREOFox (oreork) - Gitee.com
目录
1.图书管理系统整体框架需求
1、简单的登录
2、管理端
a.整理书籍(该功能为可扩展功能)
b.查阅书籍
c.增加书籍
d.删除书籍
e.打印书籍列表
f.退出
3、用户端
a.查询书籍
b.借阅书籍
c.归还书籍
d.退出
2.设计
(1)图书相关类
首先创建图书相关的类,基础属性和构造方法:
public class Book {
private String Name;
private String Author;
private String Type;
private int Price;
private boolean IsBorrowed;
public Book(String name, String author, String type, int price) {
Name = name;
Author = author;
Type = type;
Price = price;
}
Getter and Setter,toString方法
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getAuthor() {
return Author;
}
public void setAuthor(String author) {
Author = author;
}
public String getType() {
return Type;
}
public void setType(String type) {
Type = type;
}
public int getPrice() {
return Price;
}
public void setPrice(int price) {
Price = price;
}
public boolean isBorrowed() {
return IsBorrowed;
}
public void setBorrowed(boolean borrowed) {
IsBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"Name='" + Name + '\'' +
", Author='" + Author + '\'' +
", Type='" + Type + '\'' +
", Price='" + Price + '\'' +
", IsBorrowed=" + ((IsBorrowed==true)? "已被借出" : "未被借出") +
'}';
}
}
然后我们创建书库类BookList,先对BookList进行初始化,放入三本书:
private Book[] books=new Book[100000];
private int usedSize=0;
public BookList(){
books[0]=new Book("三国演义","lgz","小说",10);
books[1]=new Book("水浒传","sna","小说",11);
books[2]=new Book("西游记","wce","小说",12);
this.usedSize=3;
}
几个访问属性的方法,书本数目、获取某一位位置的书、放置图书:
public int getUsedSize(){
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getPos(int pos){
return books[pos];
}
//放置图书
public void setBooks(int pos,Book book) {
this.books[pos]=book;
}
(2)操作相关类
1.创建接口 IOperation归总,work方法对图书进行操作,再创建用户的每个动作
public interface IOperation {
Scanner scanner=new Scanner(System.in);
void work(BookList bookList);
}
接下来创建一组操作类, 每个类对应一个用户的动作
AddOperation
DelOperation
FindOperation
RemoveOperation
DisplayOperation
BorrowOperation
ReturnOperation
ExitOperation先把空类创建好, 不着急实现细节.
抽象出 Operation 的好处: 让操作和操作之间低耦合, 让操作和用户之间低耦合.
(3)用户相关类
这里我们先创建User类构建菜单和操作,然后分管理员 AdminUser和普通用户 NormalUser继承User
User类:
package user;
import book.BookList;
import operations.IOperation;
/**
* Created with IntelliJ IDEA.
* Description:抽象类 构建菜单和操作 分管理员和普通用户两个子类
* User: RK
* Date: 2022-06-28
* Time: 10:19
*/
abstract class User {
protected String name;
protected IOperation[] iOperations;
public User(String name){
this.name=name;
}
public abstract int menu();
public void doWork(int choice, BookList bookList){
iOperations[choice].work(bookList);
}
}
a.普通用户类:
package user;
import book.BookList;
import operations.*;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:24
*/
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("==========普通用户菜单=========");
System.out.println("Hello " + this.name + ", 欢迎使用图书管理系统!");
System.out.println("1. 查找图书");
System.out.println("2. 借阅图书");
System.out.println("3. 归还图书");
System.out.println("0. 退出系统");
System.out.println("=============================");
System.out.println("请输入您的选择: ");
Scanner scanner=new Scanner(System.in);
int choice= scanner.nextInt();
return choice;//返回值为int
}
@Override
public void doWork(int choice, BookList bookList) {
super.doWork(choice, bookList);
}
}
数组下标和用户操作要一一对应。
b.管理员类
package user;
import book.BookList;
import operations.*;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:24
*/
/**
* @Author RK
* @Description
* @Date 13:57 2022/6/28
* @Param 管理员类
* @return
*/
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation(),
};
}
@Override
public int menu() {
System.out.println("===========管理员菜单=========");
System.out.println("Hello " + this.name + ", 欢迎使用图书管理系统!");
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);
int choice= scanner.nextInt();
return choice;
}
@Override
public void doWork(int choice, BookList bookList) {
super.doWork(choice, bookList);
}
}
原理和普通类用户一致。
(3)Main函数 程序入口
package user;
import book.BookList;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:30
*/
public class Main {
/**
* @Author RK
* @Description 登录
* @Date 15:48 2022/6/28
* @Param
* @return
*/
public static User login(){
Scanner scanner=new Scanner(System.in);
System.out.println("请输入您的昵称");
String name= scanner.nextLine();
System.out.println("请输入您的身份 : 1-->管理员 2-->普通用户");
int choice= scanner.nextInt();
if(choice==1){
return new AdminUser(name);
}else {
return new NormalUser(name);
}
}
/**
* @Author RK
* @Description choice调用操作
* @Date 16:09 2022/6/28
* @Param [args]
* @return void
*/
public static void main(String[] args) {
BookList bookList = new BookList();
User user=login();
while (true){
int choice=user.menu();
user.doWork(choice,bookList);
}
}
}
(4)操作类细节
先完成管理员类操作
DisplayOperation //打印图书
package operations;
import book.Book;
import book.BookList;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:19
*/
public class DisplayOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("显示图书!");
BookList bookList1=new BookList();
int size=bookList.getUsedSize();
for (int i = 0; i < size; i++) {
System.out.println(bookList.getPos(i));
}
}
}
AddOperation//增添图书
package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:18
*/
public class AddOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("添加图书!" +
"请输入书名: ");
Scanner scanner = new Scanner(System.in);
String name= scanner.nextLine();
System.out.println("作者: ");
String author= scanner.nextLine();
System.out.println("类型: ");
String type= scanner.nextLine();
System.out.println("价格: ");
int price= scanner.nextInt();
Book book=new Book(name,author,type,price);
BookList bookList1=new BookList();
int size=bookList.getUsedSize();
bookList.setUsedSize(size+1);
bookList.setBooks(size,book);
System.out.println("新增图书成功!");
}
}
DelOperation//删除图书
package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:18
*/
public class DelOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("删除图书!" +
"输入你要删除的书名");
Scanner scanner = new Scanner(System.in);
String name= scanner.nextLine();
int i=0;
int index=0;
int size= bookList.getUsedSize();
for (; i < size; i++) {
Book book=bookList.getPos(i);
if (name.equals(book.getName())){
index=i;
break;
}
}
if(i>=size){
System.out.println("没有你要删除的书!");
return;
}
for (int j = index; j < size-1; j++) {
Book book2=bookList.getPos(j+1);
bookList.setBooks(j,book2);
}
bookList.setBooks(size,null);
bookList.setUsedSize(size-1);
System.out.println("删除成功!");
}
}
运行如下:
删除图书用到了顺序表的知识点
DisplayOperation //打印图书
package operation;
import book.Book;
import book.BookList;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-22
* Time: 11:07
*/
public class DisplayOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("打印图书!");
int size = bookList.getUsedSize();
for (int i = 0; i < size; i++) {
Book book = bookList.getPos(i);//bookList[i]
System.out.println(book);
}
}
}
ExitOperation //退出系统
package operations;
import book.BookList;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:19
*/
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);
}
}
FindOperation //查找图书
package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:18
*/
public class FindOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("查找图书!" +
"请输入书名");
Scanner scanner = new Scanner(System.in);
String name= scanner.nextLine();
int size=bookList.getUsedSize();
for (int i = 0; i < size; i++) {
Book book=bookList.getPos(i);
if (name.equals(book.getName())){
System.out.println("找到了这本书,信息如下: ");
System.out.println(book);
return;
}
}
System.out.println("没有要找的书!");
return;
}
}
然后再是普通类用户NormalUser操作:
BorrowOperation //借阅图书
package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:19
*/
public class BorrowOperation 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 i=0;
int size= bookList.getUsedSize();
for (; i < size; i++) {
if (name.equals(bookList.getPos(i))){
Book book=bookList.getPos(i);
book.setBorrowed(true);
System.out.println("借阅成功!");
return;
}else {
System.out.println("无此书");
return;
}
}
}
}
ReturnOperation //归还图书
原理同借阅图书,只需在setIsborrowed做改动
package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: RK
* Date: 2022-06-28
* Time: 10:19
*/
public class ReturnOperation 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 i=0;
int size= bookList.getUsedSize();
for (; i < size; i++) {
if (name.equals(bookList.getPos(i))){
Book book=bookList.getPos(i);
book.setIsborrowed(false);
System.out.println("还书成功!");
return;
}else {
System.out.println("无此书");
return;
}
}
}
}
3.总结
这个项目比较精简,但包含了接口、封装、多态,及使用顺序表进行增删改查的功能,可以以此为基础作为大作业项目。