图书管理系统(初级)
·前言
今天与大家分享的是一个小程序——图书管理系统,这里我们运用的是java基础的语法其中包括类和对象、继承、封装、多态、抽象类、接口还有数组等。
我们知道Java是一门面向对象的语言,所以在开始写代码之前我们需要进行几个步骤:
1.找到对象
一个图书管理系统包含了 书、书架、管理员、普通用户还有用户对书架的相关操作这些对象。
2.创建对象
这里我们根据分类把上面对象分成三个包,book与user还有operation,如图:
3.使用对象
将对象之间相互关联起来,组织到一起,所以我们创建了Main类作为运行的入口。
一、book包
1.Book类
//这是Book类,主要作用是定义书的基本属性,关键字private提现java的封装性,
//与priva配套的是一些get与set方法,这些方法方便操作priva修饰的变量
public class Book {
private String name;
private String author;
private int price;
private String type;
private boolean isborrow;
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 isIsborrow() {
return isborrow;
}
public void setIsborrow(boolean isborrow) {
this.isborrow = isborrow;
}
//这里我们重写了toString()方法,为了更适应我们的程序
//其中运用了三目操作符
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", " +((isborrow==true)?"已经借出":"未被借出") +
'}';
}
}
Book类中涉及到三目操作符,这里我们再讲一下三目操作符的计算方法,(表达式1?表达式2:表达式3) 如果表达式1为真则返回表达式2的值,为假返回表达式3的值,这是三目操作符的计算方法,这里用于判断书有没有被借出。
2.BookList类
//这是BookList类,里面定义了Book[]数组,这个类演示的是书架
//里面的private仍然是提现java的封装
public class BookList {
private Book[] books;
private int usedSize;//计算当前书架上实际存放书的数量
public BookList(){
//对书架上的书和数量进行初始化
this.books = new Book[10];
books[0] = new Book("三国演义","罗贯中",17,"小说");
books[1] = new Book("西游记","吴承恩",15,"小说");
books[2] = new Book("水浒传","曹雪芹",19,"小说");
this.usedSize = 3;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getBook(int pos){
return books[pos];
}
public void setBooks(int pos,Book book){
books[pos] = book;
}
public Book[] getBooks() {
return books;
}
}
二、operatio包
这个包是整个程序最为关键的部分,包含图书管理上基本操作的实现,涉及了大量JAVA语言的基本语法与运用,下面我将进行逐步讲解。
1.IOPeration接口
为了更好的组织管理员与普通用户的操作,我在这里创建了接口后面让其余操作实现这个接口,在用户里以IOPeration接口创建数组,区分开管理员与普通用户的操作
//导包语句,接口中用到了book包里的BookList类创建对象作为形参
import book.BookList;
//这里接口的主要作用
public interface IOPeration {
void work(BookList bookList);
}
2.AddOperation类
//导包语句
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration{
@Override
//重写work()方法
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入书名:");
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 book = new Book(name,author,price,type);
//currentSize用于接收目前书架上书的数量
int currentSize = bookList.getUsedSize();
//用count接收书架上可以存放书籍的最大值
int count = bookList.getBooks().length;
//判断书架有没有空余位置
if (currentSize==count){
System.out.println("书架已经满了!!");
return;
}
//遍历书架的书籍,判断书架上有没有这本书
for (int i = 0; i < currentSize; i++) {
Book book1 = bookList.getBook(i);
if (book.getName().equals(book1.getName())){
System.out.println("已经有这本图书了!!");
return;
}
}
//经过两轮判断确定可以增加书籍
bookList.setBooks(currentSize,book);
//更改目前书架上书的数量
bookList.setUsedSize(currentSize+1);
System.out.println("增加成功!!");
return;
}
}
3.DelOperation类
//导包语句
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOPeration{
@Override
//重写work()方法
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入图书名:");
String name = scanner.nextLine();
//pos用于记录所要删除书籍的位置
int pos = -1;
int i = 0;
//currentSize用于接收目前书架上书的数量
int currentSize = bookList.getUsedSize();
//用for循环遍历书架,搜寻目标书籍
for ( ; i <currentSize ; i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
pos = i;
break;
}
}
if (i==currentSize){
System.out.println("没有找到您要删除的图书!!");
return;
}
int j = pos;
//用for循环遍历书架,让目标书籍被后面书籍覆盖,实现删除效果
for (; j < currentSize-1; j++) {
Book book = bookList.getBook(j+1);
bookList.setBooks(j,book);
}
bookList.setUsedSize(currentSize-1);
System.out.println("删除成功!!");
}
}
4.ShowOperation类
//导包语句
import book.Book;
import book.BookList;
public class ShowOperation implements IOPeration{
@Override
//重写work()方法
public void work(BookList bookList) {
System.out.println("显示图书!!");
//currentSize用于接收目前书架上书的数量
int currentSize = bookList.getUsedSize();
//用for循环遍历数组并进行打印
for (int i = 0; i <currentSize ; i++) {
Book book = bookList.getBook(i);
System.out.println(book);
}
}
}
5.FindOperation类
//导包语句
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOPeration{
@Override
//重写work()方法
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
System.out.println("查找图书!!");
System.out.println("请输入所查找的书名:--》");
String name = scanner.nextLine();
//currentSize用于接收目前书架上书的数量
int currentSize = bookList.getUsedSize();
//用for循环遍历书架,搜寻目标书籍
for (int i = 0; i <currentSize ; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)){
System.out.println("所查找图书信息如下:");
System.out.println(book);
return;
}
}
System.out.println("没有找到您要查找的图书!!");
return;
}
}
6.ExitOperation类
//导包语句
import book.BookList;
public class ExitOperation implements IOPeration{
@Override
//重写work()方法
public void work(BookList bookList) {
System.out.println("退出系统!!");
//Java中自带的退出系统方法
System.exit(0);
}
}
7.BorrowOperation类
//导包语句
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOPeration{
@Override
//重写work()方法
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
System.out.println("借阅图书!!");
System.out.println("请输入您要借阅图书的书名:");
String name = scanner.nextLine();
//currentSize用于接收目前书架上书的数量
int currentSize = bookList.getUsedSize();
//用for循环遍历书架,搜寻目标书籍
for (int i = 0; i <currentSize ; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)){
book.setIsborrow(true);
System.out.println("借阅成功!!");
return;
}
}
System.out.println("没有找到您要借阅的图书!!!");
return;
}
}
8.ReturnOperation类
//导包语句
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOPeration{
@Override
//重写work()方法
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您要归还图书的书名:");
String name = scanner.nextLine();
//currentSize用于接收目前书架上书的数量
int currentSize = bookList.getUsedSize();
//用for循环遍历书架,搜寻目标书籍
for (int i = 0; i <currentSize ; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)){
book.setIsborrow(false);
System.out.println("归还成功!!");
return;
}
}
System.out.println("没有找到您要归还的图书!!!");
return;
}
}
三、user包
1.抽象类User
不管是管理员或者是普通用户都是属于用户,所以这里我创建了User类作为父类,里面定义用户共同的属性,然后通过继承,继承给子类AdminUser与NormalUser,这里提现了Java三大特性的继承,因为子类拥有相同的行为但又有不同实现步骤,所以我将User定为抽象类,将子类要实现的方法定义在这里,在子类进行重写。
import book.BookList;
import operation.IOPeration;
public abstract class User {
protected String name;
//根据身份的不同,在数组中添加不同的操作
protected IOPeration[] ioPerations;
public User(String name) {
this.name = name;
}
public abstract int menu();
public abstract void doOperation(int pos, BookList bookList);
}
2.AdminUser类
//导包语句
import book.BookList;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User{
//构造方法,进行初始化
public AdminUser(String name) {
super(name);
ioPerations = new IOPeration[]{
new ExitOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation(),
new FindOperation()
};
}
public int menu(){
Scanner scanner = new Scanner(System.in);
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("请输入您要进行的操作:--》");
int choice = scanner.nextInt();
return choice;
}
//实现选择所要进行的操作
public void doOperation(int pos,BookList bookList){
IOPeration ioPeration = ioPerations[pos];
ioPeration.work(bookList);
}
}
3.NormalUser类
//导包语句
import book.BookList;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
//构造方法,进行初始化
public NormalUser(String name) {
super(name);
ioPerations = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
};
}
public int menu(){
Scanner scanner = new Scanner(System.in);
System.out.println("######普通用户########");
System.out.println(" 1.查找图书");
System.out.println(" 2.借阅图书");
System.out.println(" 3.归还图书");
System.out.println(" 0.退出系统");
System.out.println("######################");
System.out.println("请输入您要进行的操作:--》");
int choice = scanner.nextInt();
return choice;
}
//实现选择所要进行的操作
public void doOperation(int pos, BookList bookList){
IOPeration ioPeration = ioPerations[pos];
ioPeration.work(bookList);
}
}
四、Main类
在这个类中涉及到了向上转型,多态,动态绑定。
//导包语句
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
//方法作用是实现登录操作,返回类型User确定身份
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);
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
//向上转型
User user = login();
while (true){
//管理员与普通用户都有menu()方法,不同对象有不同效果,体现了Java的多态
int choice = user.menu();
user.doOperation(choice,bookList);
}
}
}
五、尾声
来到这里,我们的图书管理系统(初级)也就算讲解完毕了,当然这只是一个初级版本这个图书管理系统还有很多不完善的地方,比如没有做到持久化的存储,当前运用的只是数组,想要做到持久的存储我们可以将图书存到文件里或者放到数据库中,后面也可以做成网页交互的,还可以加更多的框架,这只是一个开始,想要做到后面那样我还需要继续的学习,后面我会持续更新与改进我们的图书管理系统,如果感觉讲解的还不错,麻烦给博主点点关注呗,您的关注与评论是对我最大的支持,求求了~~