经过长时间JavaSE的学习,我们对Java的三大特性----继承,封装,多态有了一定的了解,对于语法的学习我们需要项目来复习和巩固,这次这个图书管理系统主要目的是为了练习一些重要语法知识.,让大家能把语法用起来同时达到复习的效果.
大家可以根据生活经验想一想,一个图书系统有什么,需要什么?简单的肯定是有书的,书又要放在书架上,这样我们就可以抽象出两个类(书的类和书架的类).有了书之后我们还需要对书操作的用户,用户我们又可以抽象出普通用户和管理书的用户.然而对应不同的用户输入不同的操作会用不同的效果.
对于不同用户而言操作是不一样的,就这个项目而言,我们不同用户实现的操作有以下:
管理员用户:
1.增添图书
2.删除图书
3.查找图书
4.展示图书
5.退出系统
普通用户:
1.查找图书
2.借阅图书
3.归还图书
4.退出系统
为了方便管理我们定义一个book包 ,在这个包里会有书和书架两个类
一.不管是什么用户,都是对书进行操作,首先我们抽象出书类:
book类
对于一本书,会有书名,作者,价钱,类型,和是否借出的状态.所以我们把这些定义成book类的成员属性,我们学过封装,进一步我们可以把这些属性封装起来,使属性的安全性更高.对于封装的属性我们就需要提供get和set方法来获取和设置属性.一个标准的类至少有一个无参或者全参的构造方法,对于书这个类,我们需要一个有书名,作者,价钱,类型的参数来构造这个数据.是否借出不用在构造方法中,因为在书籍在刚开始是未被借出的,所以默认的就是false未被借出,如果被借出就改为true.想要打印出不一样的效果,我们可以重写toString()方法.
Book类应有的以下属性:
1.String name //书名
2.String author //作者
3.int price //价钱
4.String type //类型
5.Boolean borrow //是否借出
6.构造方法
7.为封装的属性提供get set方法
8.重写toString方法
Book代码如下:
public class Book {
//一本书有哪些成员
private String name;
private String author;
private int price;
private String type;
private boolean borrow;
//为成员提供get set方法
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 isBorrow() {
return borrow;
}
public void setBorrow(boolean borrow) {
this.borrow = borrow;
}
//提供构造方法
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
//重写tostring方法
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
( borrow==true ? " 已被借出":" 未被借出")+
'}';
}
}
BookList类
Book类每次实例化就是一本书,为了方便管理,我们就在书架类中定义一个Book类的数组用来存放每一本书,这样增删改查就相对于来说方便一些.然后再定义一个useSize来用于记录放书的数组有多少本书.因为这两个属性都是由private修饰我们又需要提供get和set方法.
BookList类应有的属性:
1.存放Book类对象的数组books
2.用于存储书籍个数的useSize
3.初始化书架的实例代码块
BookList代码如下:
public class BookList {
private Book[] books=new Book[10];
private int UseSize;
public BookList(){
books[0]=new Book("活着","余华",45,"小说");
books[1]=new Book("狂人日记","鲁迅",56,"小说");
books[2]=new Book("红高粱","莫言",35,"小说");
UseSize=3;
}
/*
* 返回对应下标的书籍
* */
public Book getBooks(int pos) {
return this.books[pos];
}
/*
* 在pos位置中放入这本书
* */
public void setBooks(int pos, Book book){
books[pos]=book;
}
//为UseSize提供get和set方法
/**
*
* 这个方法用来获取系统存书籍的数量
* */
public int getUseSize() {
return UseSize;
}
/**
*
* 改变书籍的存储个数
* */
public void setUseSize(int useSize) {
UseSize = useSize;
}
}
二.书类定义完成后,我们需要一些对书的操作,此时就需要一些操作类
我们把操作的类放在一个Opera包中
1.operation接口
operation接口是所有功能类的公共规范,所以它应该具有抽象方法work,而且这个方法的操作对象应该是BookList类的对象.
operation接口代码如下:
package opera;
import book.Book;
import book.BookList;
public interface Operation {
public void work(BookList bookList);
}
2.实现operation接口的类
为了方便我们对各种实现类work方法的调用,所以这些类都需要实现operation接口,并且对其中的operation进行重写.
a.Addoperation类
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Addoperation implements Operation{
@Override
public void work(BookList bookList) {
//System.out.println("增加书籍");
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("请输入类型:");
String type=scanner.nextLine();
System.out.println("请输入价格:");
int price=scanner.nextInt();
Book book=new Book(name,author,price,type);
int currentUsize= bookList.getUseSize();
for (int i = 0; i <currentUsize; i++) {
Book tmp=bookList.getBooks(i);
if(tmp.getName().equals(name)){
System.out.println("本书已存在,请勿在放入");
return;
}
}
bookList.setBooks(currentUsize,book);
System.out.println("放入成功!");
bookList.setUseSize(currentUsize+1);
}
}
b.Brrowoperation类
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Brrowoperation implements Operation{
@Override
public void work(BookList bookList) {
//System.out.println("借出书籍");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你要借的书名:");
String name=scanner.nextLine();
int currentSize= bookList.getUseSize();
for (int i = 0; i < currentSize; i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)&& !book.isBorrow()){
book.setBorrow(true);
System.out.println("借阅成功");
return;
}
}
}
}
C.Deloperation类
package opera;
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 name=scanner.nextLine();
int currentSize= bookList.getUseSize();
int index=-1;
for (int i = 0; i < currentSize; i++) {
Book tmp=bookList.getBooks(i);
if(tmp.getName().equals(name)){
index=i;
break;
}
}
for (int j = index; j <currentSize-1 ; j++) {
Book book=bookList.getBooks(j+1);
bookList.setBooks(j,book);
}
//删除书之后将长度-1
bookList.setUseSize(currentSize-1);
//因为删除的对象是引用类型,所以把最后一个置为空
bookList.setBooks(currentSize-1,null);
}
}
D.Exitoperation类
package opera;
import book.Book;
import book.BookList;
public class Exitoperation implements Operation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(0);
}
}
E.Findoperation类
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Findoperation implements Operation{
@Override
public void work(BookList bookList) {
//System.out.println("查找书籍");
System.out.println("请输入你要查找的书名:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int currentUse= bookList.getUseSize();
for (int i = 0; i < currentUse; i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)){
System.out.println("找到了这本书");
System.out.println(book);
return;
}
}
System.out.println("没有这本书");
}
}
F.Returnoperation类
package opera;
import book.Book;
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 name=scanner.nextLine();
int currentSize= bookList.getUseSize();
for (int i = 0; i < currentSize; i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)&& book.isBorrow()){
book.setBorrow(false);
System.out.println("归还成功");
return;
}
}
}
}
G.Showoperation类
package opera;
import book.Book;
import book.BookList;
public class Showoperation implements Operation{
@Override
public void work(BookList bookList) {
int currentSize= bookList.getUseSize();
for (int i = 0; i < currentSize; i++) {
Book book=bookList.getBooks(i);
System.out.println(book);
}
}
}
三.操作类编写完成后,我们需要抽象出用户进行操作
我们把用户放在user包中
在这个包中有两个用户类型,一个是管理员,一个是普通用户,因此它们有不同的菜单,不同的菜单实现不同的功能,但是它们的用户名是一样的,所以需要定义一个User父类,以父类来构建子类.
1.抽象类User
这是一个抽象父类,我们需要定义一个用户名,并且定义一个以Operation为基本类型的数组,但是双方菜单都不一样,因此菜单方法需要抽象化,然后就是实现功能的方法,这个方法很巧妙,首先我们可以先利用通过菜单的选项,来实现Operation数组里面的具体类,并且调用哪个类里面的work方法,就可以实现不同用户有不同的功能.
package user;
import book.BookList;
import opera.Operation;
public abstract class User{
public String name;
protected Operation[] operations;
public User(String name) {
this.name = name;
}
public abstract int menu();
public void dowork(int choice, BookList bookList){
this.operations[choice].work(bookList);
}
}
2.普通用户类
普通用户具有借阅,归还,查找,打印图书的功能。Operation数组中应该具有这几种类
package user;
import opera.*;
import java.util.Scanner;
public class Normalluser extends User{
public Normalluser(String name) {
super(name);
this.operations=new Operation[]{
new Exitoperation(),
new Findoperation(),
new Brrowoperation(),
new Returnoperation()
};
}
@Override
public int menu() {
System.out.println("******************************");
System.out.println("hello "+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;
}
}
3.管理用户
管理员具有增加,删除,查找,打印图书的功能.Operation数组中应该具有这几种类
package user;
import opera.*;
import java.util.Scanner;
public class Adminuser extends User{
public Adminuser(String name){
super(name);
this.operations=new Operation[]{
new Exitoperation(),
new Findoperation(),
new Addoperation(),
new Deloperation(),
new Showoperation()
};
}
@Override
public int menu() {
System.out.println("******************************");
System.out.println("hello "+name+" 欢迎来到图书小练习");
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;
}
}
四.所有代码一编写完毕,需要一个测试类来让程序跑起来
Main类
Main主要是把这些功能串起来,并且对图书管理系统的整合,然后需要一个用户自己选择身份的方法,然后我们提供一个让用户选择的方法.方法的返回值用用用户的父类接收,由此实现向上转型,我们可以利用User来调用菜单,这样不同的User就可以实现不同的菜单.
import book.BookList;
import user.Adminuser;
import user.Normalluser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
System.out.println("请输入您的姓名:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
System.out.println("请输入您的身份:1->> 管理员 0->>普通用户");
int choice=scanner.nextInt();
if(choice==1){
return new Adminuser(name);
}else{
return new Normalluser(name);
}
}
public static void main(String[] args) {
BookList bookList=new BookList();
User user=login();
while(true){
int choice= user.menu();
user.dowork(choice,bookList);
}
}
}
五.总结
这个图书管理系统最重要的是大家对框架有一定的了解,进一步了解面向对象编程.而且还利用了封装,继承,多态Java的三大特性,接口和抽象类的应用,对我们有着巩固和复习的作用.
以上是我对图书管理系统的一些理解,如有错误望指出.