前言
hello大家好呀,为了巩固我们之前学习的java的内容,我们将结合之前学的类与对象,子类与继承,抽象类与接口,多态学习做一个图书管理系统。当然,这里我们不是作为企业级的应用,只是作为自己的代码练习,深入理解面向对象编程的特点,我们也更加注重框架而非代码的实现,每个人都可以自己动动手指写一写,相信你会对java这门面向对象的语言有更加深入的理解,我们一起敲一敲吧~
图书馆系统框架
1.总体框架
在这个系统中,我们希望有管理员与用户来对同一个书架进行操作,所以,根据我们需要完成的操作,可以做以下分析
1.书架类与书的类,书架上存放书的对象
2.用户与图书管理员,我们计划让他们继承自同一个抽象User类,便于提示我们所需要完成的方法
3.各种对书架的操作,实现一个operation接口,以便于使用向上转型对象的数组把这些操作整合到管理员与用户类中去
4.另外,把这些类根据属性封装到不同包中去。值得一提,java中,我们一般把自己的成员变量谁为private,提供setter或者getter方法才能让你访问,这是类的封装性的一种体现
总的分类
下面会一一说明
2.Book类与booklist
Book.java
package Book;
public class Book {
private String name;
private String author;
private Boolean state;
private int price;
public Book(String name, String author, int price, Boolean state) {
this.name = name;
this.author = author;
this.state = state;
this.price = price;
}
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 Boolean getState() {
return state;
}
public void setState(Boolean state) {
this.state = state;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +", price=" +
price +
'}'+
", state=" + ((state==true)?"已借出":"未借出");
}
}
主要定义了各种书的属性与它们的setter与getter,tostring方法,不过多说明
BookList.java
package Book;
public class BookList {
private Book[] book=new Book[10];
private int number;
public BookList(){
book[0]=new Book("三国演义","罗贯中",20,false);
book[1]=new Book("a","罗贯中",20,false);
book[2]=new Book("b","罗贯中",20,false);
this.number=3;
}
public Book getBook(int pos) {
return book[pos];
}
public void setBook(int pos,Book book) {
this.book[pos]= book;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
同样,只需要注意里面的book应用对象,我们初始化了一个存放10本书的书架,number用于记录已有的书的数量,初始在书架上放了三本书,注意我们是怎么提供book[]的getter和setter方法的
3.user类
User.java
package User;
import Book.BookList;
import IOException.IoOperation;
public abstract class User {
String name;
IoOperation[] operations;
public User(String name) {
this.name = name;
}
public abstract int menu();
public abstract void doopration(int choice, BookList bookList);
}
这是一个抽象类,目的是为了对于我们manajer(管理者)与normal(普通用户)类的书写起提示作用,同时后面回利用上转型对象实现对manager与normal类中对user重写的方法进行调用(也就是多态的体现)
Manager.java
package User;
import Book.BookList;
import IOException.*;
import com.sun.org.apache.xpath.internal.operations.Operation;
import java.util.Scanner;
public class Manager extends User {
public Manager (String name) {
super(name);
this.operations = new IoOperation[]{
new ExitIoOperation(),
new FindIoOperation(),
new AddIoOperation(),
new DeleteOperation(),
new PrintIoOperation()};
}
@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(" 4.显示图书 ");
System.out.println(" 0.退出系统 ");
System.out.println("**********************");
System.out.println("请输入你的操作");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
public void doopration(int choice, BookList bookList){
operations[choice].work(bookList);
}
}
Normal.java
package User;
import Book.BookList;
import IOException.*;
import com.sun.org.apache.xpath.internal.operations.Operation;
import java.util.Scanner;
public class Normal extends User {
public Normal(String name) {
super(name);
this.operations=new IoOperation[]{
new ExitIoOperation(),
new BorrowIoOperation(),
new returnOperation(),
new FindIoOperation()
};
}
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("**********************");
System.out.println("请输入你的操作");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
@Override
public void doopration(int choice, BookList bookList) {
operations[choice].work(bookList);
}
}
这里的operation对象也利用了上转型对象,后续会补充说明
4.operation接口
operation接口只提供一个work方法,让实现该接口的类重写,便于后续调用,不过这里命名为Iooperation(java库函数里有operation类,自定义类最好不要重名)
IoOperation.java
package IOException;
import Book.BookList;
public interface IoOperation {
void work(BookList bookList);
}
后面所有操作让他继承IoOperation接口,代码,当然,具体操作放在后面代码实现,这部分我们只关心框架
5.Main.java
这里我们还需要主函数,在Main类里还需要实现对Manajer或者Normal对象的调用
Main.java
package Main;
import Book.BookList;
import User.*;
import com.sun.corba.se.impl.orbutil.ObjectStreamClassUtil_1_3;
import com.sun.security.ntlm.NTLMException;
import java.awt.*;
import java.util.Scanner;
public class Main {
public static User logs() {
Scanner s = new Scanner(System.in);
System.out.println("请输入你的姓名");
String m = s.nextLine();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的身份1.管理员 2.用户 ");
int choice = scanner.nextInt();
if (choice == 1)
return new Manager(m);
else if (choice == 2)
return new Normal(m);
else {
System.out.println("找不到对应操作");
}
return null;
}
public static void main(String[] args) {
BookList bookList=new BookList();
User user=Main.logs();
while(true) {
int Choice = user.menu();
user.doopration(Choice, bookList);
}
}
}
注意里面logs方法返回类型,因为Manager和Normal都是User的子类
框架就差不多这么多,里面代码实现还是有很多细节,一定要自己去敲,亲身体会
操作代码实现细节
图书管理系统用到了数据结构中的顺序表的知识,所以,各种操作都和顺序表很像(关于顺序表大家可移步http://t.csdnimg.cn/NVRr7),但是,java中使用顺序表更要注重它的封装性,各种操作是怎样一步一步实现的,直接贴在下面啦
1.查找
package IOException;
import Book.BookList;
import java.util.Scanner;
public class FindIoOperation implements IoOperation {
@Override
public void work(BookList bookList) {
System.out.println("查询图书");
Scanner scn = new Scanner(System.in);
String name = scn.nextLine();
int i = 0;
for (; i < bookList.getNumber(); i++) {
if (bookList.getBook(i).getName().equals(name)) {
System.out.println("找到啦");
System.out.println(bookList.getBook(i));
break;
}
}
if (i==bookList.getNumber())
System.out.println("没有这本书");
}
}
2.删除
package IOException;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class DeleteOperation implements IoOperation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
System.out.println("请输入要删除的书名");
Scanner scn = new Scanner(System.in);
String name = scn.nextLine();
int pos = -1;
int i = 0;
for (i = 0; i < bookList.getNumber(); i++) {
if (bookList.getBook(i).getName().equals(name)) {
pos = i;
break;
}
}
if (i == bookList.getNumber()) {
System.out.println("没有你找的书");
} else {
for (int j = pos; j < bookList.getNumber() - 1; j++) {
Book book = bookList.getBook(j + 1);
bookList.setBook(j, book);
}
bookList.setNumber(bookList.getNumber() - 1);
System.out.println("删除成功");
}
}
}
3.增加
package IOException;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class AddIoOperation implements IoOperation {
@Override
public void work(BookList bookList) {
System.out.println("增加图书");
if (bookList.getNumber() == 10) {
System.out.println("书架已满");
}
Scanner scanner = new Scanner(System.in);
System.out.println("请输入书名");
String name = scanner.nextLine();
System.out.println("请输入作者");
String author = scanner.nextLine();
System.out.println("请输入价格");
int price = scanner.nextInt();
Book book = new Book(name, author, price, false);
int pos = bookList.getNumber();
for (int i = 0; i < pos; i++) {
if (bookList.getBook(i).getName().equals(name)) {
System.out.println("有这本书不能插入");
return;
}
}
bookList.setBook(pos, book);
System.out.println("新增成功");
bookList.setNumber(pos+1);
}
}
4.退出
package IOException;
import Book.BookList;
public class ExitIoOperation implements IoOperation {
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(0);
}
}
5.借阅
package IOException;
import Book.BookList;
import java.sql.SQLOutput;
import java.util.Scanner;
public class BorrowIoOperation implements IoOperation {
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
System.out.println("请输入要借阅的书名");
Scanner scn = new Scanner(System.in);
String name = scn.nextLine();
int i = 0;
for (; i < bookList.getNumber(); i++) {
if (bookList.getBook(i).getName().equals(name)) {
boolean b = bookList.getBook(i).getState() == false;
if (b) {
System.out.println("借阅成功");
bookList.getBook(i).setState(true);
break;
} else {System.out.println("这本书已被借出");
break;}
}
}
if (i == bookList.getNumber())
System.out.println("没有这本书");
}
}
6.归还
package IOException;
import Book.BookList;
import java.util.Scanner;
public class returnOperation implements IoOperation{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
System.out.println("请输入要归还的书名");
Scanner scn = new Scanner(System.in);
String name = scn.nextLine();
for (int i = 0; i < bookList.getNumber(); i++) {
if (bookList.getBook(i).getName().equals(name)) {
if(bookList.getBook(i).getState()==true){
System.out.println("归还成功");
bookList.getBook(i).setState(false);
}
else System.out.println("这本书在书架上");
}
}
}
}
7.显示全部
package IOException;
import Book.Book;
import Book.BookList;
public class PrintIoOperation implements IoOperation {
@Override
public void work(BookList bookList) {
System.out.println("显示图书");
for (int i = 0; i < bookList.getNumber(); i++) {
Book book=bookList.getBook(i);
System.out.println(book);
}
}
}
尾声
好啦,以上就是图书管理系统全部代码了,本期所有代码放在白梓/小梓-javacode库里啦,欢迎大家交流学习~,我们下期见