目录
前言
这里承接上文,是对第一部分的内容进行续写,本文将对图书馆管理系统进行一个收尾工作,主要内容为图书管理系统的具体操作内容。这里给出上文的链接http://t.csdn.cn/islqH
三、图书管理系统的具体操作
3.1通过选择的数字调用对应的方法
上文说到我通过菜单操作返回了一个对应操作的数字,但是我并不知道怎么去调用方法,所以先将具体的方法体给出来,这里先写一个接口
public interface IOperation {
void operate(BookRack bookRack);
}
之后我所有的具体方法类都要去实现这个接口(这里不知道为什么的奖励看我主页的接口文章http://t.csdn.cn/APSMH)
先将实现逻辑完成在去写具体的内容(方法类太多了,只展示一个了,后面的自己去看源码)
public class AddOperation implements IOperation{
//对应的图书管理操作方法
public void operate(BookRack bookRack){
System.out.println("添加图书");
}
}
当我的方法类和接口写完之后,我还是不知道该怎么写下去,这时候先别着急,我既然有接口了,那我肯定就可以通过接口来new对象
父类先定义接口数组:
public abstract class User {
protected String username;
//定义一个接口数组,用来存放具体的对象,这里不需要有内容,子类添加即可
IOperation[] iOperations;
public User(String username) {
this.username = username;
}
public abstract int menu();
}
管理员类接口数组初始化对象:
public class AdminUser extends User{
public AdminUser(String username) {
super(username);
//通过this关键字调用接口数组并且初始化,将对应的操作对象放入接口中
this.iOperations = new IOperation[]{new ExitOperation(),new FindOperation(),
new AddOperation(),new DelOperation(),new ShowOperation()};
}
}
用户类接口数组初始化对象:
public class NormalUser extends User{
public NormalUser(String username) {
super(username);
//同样的生成对应的操作对象然后放入数组
this.iOperations = new IOperation[]{new ExitOperation(),new FindOperation(),
new BorrowOperation(),new ReturnOperation()};
}
}
写到这里,问题来了!我还是没有调用具体的对象啊?那我是不是需要写一个方法将选择的数字传入然后调用具体的操作方法。这里也涉及到多态的一个思想,父类this调用数组时数组中没有具体的对象,这里就会调用子类数组然后再通过子类数组去调用子类对象!!!
public abstract class User {
protected String username;
IOperation[] iOperations;
public User(String username) {
this.username = username;
}
public abstract int menu();
//点睛之笔!!绝了!!通过接口调用对应下标的对象,再通过对象调用操作方法
public void doOperation(int choice, BookRack bookRack){
this.iOperations[choice].operate(bookRack);
}
}
然后再通过主方法调用:
public class Main {
public static void main(String[] args) {
//初始化书架
BookRack bookRack = new BookRack();
User user = login();
while (true) {
int choice = user.menu();
//通过父类对象调用父类方法
user.doOperation(choice,bookRack);
}
}
}
至此,所有的逻辑框架已经全部实现!!!接下来就是写具体的操作方法了
3.2具体的操作方法实现
1.添加图书的方法
public class AddOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入书名:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
System.out.println("请输入作者:");
String author = sc.nextLine();
System.out.println("请输入类型:");
String type = sc.nextLine();
System.out.println("请输入价格:");
double price = sc.nextDouble();
//new一个新书对象,将刚刚得到参数放入
Book book = new Book(bookName, author, price, type);
//获取当前书架中的书的数量
int bookCount = bookRack.getBookCount();
//然后将刚刚这本书添加到书架指定的位置
bookRack.setBook(book,bookCount);
//最后修改书架中书的数量
bookRack.setBookCount(bookCount+1);
System.out.println("图书增加成功!");
}
}
写到这个突然发现图书添加不进去,原来是我书架类没有具体的添加方法!!!我直接一口气写完需要用到了方法了
public class BookRack {
private Book[] books = new Book[10];
private int bookCount;
public BookRack(){
books[0] = new Book("三国演义","罗贯中",29.9,"小说");
books[1] = new Book("西游记","吴承恩",39.9,"小说");
books[2] = new Book("水浒传","施耐庵",19.9,"小说");
this.bookCount = 3;
}
//返回对应下标的书
public Book getBook(int pos) {
return books[pos];
}
//返回书架中书的数量
public int getBookCount() {
return bookCount;
}
//添加一本书到指定位置
public void setBook(Book book,int pos) {
this.books[pos] = book;
}
//改变书架中书的数量
public void setBookCount(int bookCount) {
this.bookCount = bookCount;
}
}
2.删除图书的操作
public class DelOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入你要删除的图书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int i = 0;
for (; i < bookRack.getBookCount(); i++) {
Book book = bookRack.getBook(i);
if(book.getBookName().equals(bookName)){
break;
}
}
//判断是否有这本书,没有则无法删除
if(i == bookRack.getBookCount()){
System.out.println("没有找到这本书!");
return;
}
//图书的删除过程
for (int j = i; j < bookRack.getBookCount()-1; j++) {
//面向对象的删除和面向过程的删除有区别
Book tempBook = bookRack.getBook(j+1);
bookRack.setBook(tempBook,j);
}
//删除图书之后,需要将书本数减一
bookRack.setBookCount(bookRack.getBookCount()-1);
//将最后一个位置置空,以免内存泄漏
bookRack.setBook(null, bookRack.getBookCount());
System.out.println(bookName+"删除成功!");
}
}
3.借书的操作
public class BorrowOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入你想借阅的图书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int bookCount = bookRack.getBookCount();
int i = 0;
//遍历的过程中先寻找有没有这本书,有的话再判断是否借出
for (; i < bookCount; i++) {
Book book = bookRack.getBook(i);
if(book.getBookName().equals(bookName)){
if(book.isBorrow()){
System.out.println("不好意思,该书已经借出!");
}else{
book.setBorrow(true);
System.out.println("成功借阅:"+book);
}
return;
}
}
System.out.println("书库中没有这本书!");
}
}
这里就不多写其他的了,具体的方法展示放到最后的源码中吧
四、源码
这是我整个目录体系结构
1.book包
package book;
public class Book {
private String bookName;
private String author;
private double price;
private String type;
private boolean isBorrow;
public Book(String bookName, String author, double price, String type) {
this.bookName = bookName;
this.author = author;
this.price = price;
this.type = type;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
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 isBorrow() {
return isBorrow;
}
public void setBorrow(boolean borrow) {
isBorrow = borrow;
}
@Override
public String toString() {
return "Book{" +
"bookName='" + bookName + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +","+
((isBorrow==true)?"已借出":"未借出") +
'}';
}
}
package book;
public class BookRack {
private Book[] books = new Book[10];
private int bookCount;
public BookRack(){
books[0] = new Book("三国演义","罗贯中",29.9,"小说");
books[1] = new Book("西游记","吴承恩",39.9,"小说");
books[2] = new Book("水浒传","施耐庵",19.9,"小说");
this.bookCount = 3;
}
public Book getBook(int pos) {
return books[pos];
}
public int getBookCount() {
return bookCount;
}
public void setBook(Book book,int pos) {
this.books[pos] = book;
}
public void setBookCount(int bookCount) {
this.bookCount = bookCount;
}
}
2.operation包
package operation;
import book.Book;
import book.BookRack;
import java.util.Scanner;
public class AddOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入书名:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
System.out.println("请输入作者:");
String author = sc.nextLine();
System.out.println("请输入类型:");
String type = sc.nextLine();
System.out.println("请输入价格:");
double price = sc.nextDouble();
Book book = new Book(bookName, author, price, type);
int bookCount = bookRack.getBookCount();
bookRack.setBook(book,bookCount);
bookRack.setBookCount(bookCount+1);
System.out.println("图书增加成功!");
}
}
package operation;
import book.Book;
import book.BookRack;
import java.util.Scanner;
public class BorrowOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入你想借阅的图书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int bookCount = bookRack.getBookCount();
int i = 0;
for (; i < bookCount; i++) {
Book book = bookRack.getBook(i);
if(book.getBookName().equals(bookName)){
if(book.isBorrow()){
System.out.println("不好意思,该书已经借出!");
}else{
book.setBorrow(true);
System.out.println("成功借阅:"+book);
}
return;
}
}
System.out.println("书库中没有这本书!");
}
}
package operation;
import book.Book;
import book.BookRack;
import java.util.Scanner;
public class DelOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入你要删除的图书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int i = 0;
for (; i < bookRack.getBookCount(); i++) {
Book book = bookRack.getBook(i);
if(book.getBookName().equals(bookName)){
break;
}
}
//判断是否有这本书,没有则无法删除
if(i == bookRack.getBookCount()){
System.out.println("没有找到这本书!");
return;
}
//图书的删除过程
for (int j = i; j < bookRack.getBookCount()-1; j++) {
Book tempBook = bookRack.getBook(j+1);
bookRack.setBook(tempBook,j);
}
//删除图书之后,需要将书本数减一
bookRack.setBookCount(bookRack.getBookCount()-1);
//将最后一个位置置空,以免内存泄漏
bookRack.setBook(null, bookRack.getBookCount());
System.out.println(bookName+"删除成功!");
}
}
package operation;
import book.BookRack;
public class ExitOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("图书管理系统已退出");
System.exit(0);
}
}
package operation;
import book.Book;
import book.BookRack;
import java.util.Scanner;
public class FindOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入你要查找的图书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
for (int i = 0; i < bookRack.getBookCount(); i++) {
Book book = bookRack.getBook(i);
if(book.getBookName().equals(bookName)){
System.out.println("找到了!");
System.out.println(book);
return;
}
}
System.out.println("未找到这本书!");
}
}
package operation;
import book.BookRack;
public interface IOperation {
void operate(BookRack bookRack);
}
package operation;
import book.Book;
import book.BookRack;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("请输入你想归还的图书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int bookCount = bookRack.getBookCount();
int i = 0;
for (; i < bookCount; i++) {
Book book = bookRack.getBook(i);
if(book.getBookName().equals(bookName)){
book.setBorrow(false);
System.out.println("归还:"+book+" 成功!");
return;
}
}
System.out.println("书库中没有这本书!");
}
}
package operation;
import book.Book;
import book.BookRack;
public class ShowOperation implements IOperation{
@Override
public void operate(BookRack bookRack) {
System.out.println("书库中有以下的书:");
for (int i = 0; i < bookRack.getBookCount(); i++) {
Book book = bookRack.getBook(i);
System.out.println(book);
}
}
}
3.user包
package user;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String username) {
super(username);
this.iOperations = new IOperation[]{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 sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String username) {
super(username);
this.iOperations = new IOperation[]{new ExitOperation(),new FindOperation(),
new BorrowOperation(),new ReturnOperation()};
}
@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("*** 0.退出系统 ***");
System.out.println("**************************************");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
package user;
import book.BookRack;
import operation.IOperation;
public abstract class User {
protected String username;
IOperation[] iOperations;
public User(String username) {
this.username = username;
}
public abstract int menu();
public void doOperation(int choice, BookRack bookRack){
this.iOperations[choice].operate(bookRack);
}
}
4.Main类
import book.BookRack;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = sc.nextLine();
System.out.println("请输入登录身份:1->管理员登录 0->用户登录");
int choice = sc.nextInt();
if(choice == 1){
System.out.println(name + " 管理员,欢迎您登录图书管理系统!");
return new AdminUser(name);
}else{
System.out.println(name + " 用户,欢迎您登录图书管理系统!");
return new NormalUser(name);
}
}
public static void main(String[] args) {
BookRack bookRack = new BookRack();
User user = login();
while (true) {
int choice = user.menu();
user.doOperation(choice,bookRack);
}
}
}
总结
至此,整个图书管理系统已经结束了,本文主要的介绍利用多态去调用操作方法,包括具体操作的书写方法。
这个博客也只是记录我个人笔记的一个地方,多多少少都有不完美的地方,大家看到了可以评论区指出!希望看到这个图书管理系统能对你的java学习有一定的帮助