图书管理系统
一、设计思路
1、首先需要区分两类人,图书管理员和借书用户,不同的用户要展现不同的界面,利用继承和多态可以将其实现。
2、要将不同的操作封装起来,单独设计成为一个类,为了规范实现,需要使用接口。
3、要将书的属性进行封装,设立一个书架,及存放书的数组。
4、实现管理员添加书籍,查找书籍,删除书籍以及显示书籍。
5、读者可以查找书籍,借阅书籍以及归还书籍。
二、代码
1、book类的实现
书籍的属性有书名、作者、类型以及是否被借出,结合封装、private权限,并提供相应的get 方法和set 方法,空参构造器以及一个不包含是否被借出的构造器(布尔值的默认类型就是false,可以不进行初始化)并需要提供对应的toString()方法的重写
代码实现如下:
package com.sh.Library;
public class Book {
private String name;
private String author;
private String type;
private boolean isBorrowed; //是否被借出
//构造器
public Book(){
}
public Book(String name,String author,String type){
this.author=author;
this.name=name;
this.type=type;
}
//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 String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
//重写toString()
public String toString() {
return "Book{" + "书名:'" + name + '\'' + ", 作者:'" + author + '\'' + ", 类型:'" + type + '\'' + ", 是否借出:" + isBorrowed + '}';
}
}
2、BookList类的实现
BookList类提供一个ArrayList的泛型数组来进行Book的存储,便于后面对书籍的操作。
BookList类我们提供一个私有的ArrayList的泛型数组,同时在空参构造器中对其初始化,先加入几本书籍,并提供对应的get和set方法
代码实现如下:
package com.sh.Library;
import java.util.ArrayList;
public class BookList {
private ArrayList<Book> books = new ArrayList<Book>();
public BookList() {
books.add(new Book("倾城之恋","张爱玲","小说"));
books.add(new Book("背影","朱自清","散文"));
books.add(new Book("你好,旧时光","八月长安","小说"));
}
public Book getBook(int pos){ //获取某个位置上的书籍
return books.get(pos);
}
public void setBook(int pos,Book book){ //设置某个位置上的书籍
books.set(pos,book);
}
public ArrayList<Book> getBooks(){ //获取书架,便于后面的Operation的使用
return books;
}
}
3、OperationException
异常的出现一般出现在操作中,我们可以通过自定义异常类的方式来处理不同异常情况的发生(也可以不进行定义),我们的自定义也提供一个空参构造器,和一个有参构造器用来打印异常信息(自定义异常类需要继承Exception类)
代码实现如下:
package com.sh.Library;public class OperationException extends Exception{
static final long serialVersionUID=-33875169931L;
//空参构造器
public OperationException(){
}
public OperationException(String message){
super(message); //Exception类中存在String参数的构造器和message
}
}
4、用户类的实现
用户类中,我们需要定义用户的名字,同时定义一个抽象方法menu()来给子类管理员类和读者类重写(二者的目录不同),同时要提供set和get方法,并提供抽象Operation方法给子类重写使用(子类的目录不同,执行的操作就会存在差异)
代码实现如下:
package com.sh.Library;
public abstract class User {
private String name;
public User(String name){
this.name=name;
}
public User(){
}
public abstract void menu();
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public abstract void Operation(int n, BookList bookList)throws OperationException;
//子类的Operation会抛出异常来处理异常,父类也需要抛出异常,
//因为父类抛出异常大小要大于子类重写方法抛出的异常
}
5、操作接口的实现
我们需要执行的操作有增加,删除,显示,查找等,他们都需要遵循一定的规范,而这个规范就由接口来实现,在增删查改等操作中,他们的主要方式就是工作,即work(),故接口中提供对应的work()方法供接口的实现类,即各种操作进行重写
代码实现如下:
package com.sh.Library;
public interface IOperation{
void work(BookList bookList)throws Exception;
}
6、操作类实现
(1)增加
我们需要将操作类实现操作接口,同时为重写的方法提供书架类,便于进行操作。代码实现如下:
添加操作并没有什么异常,在简易图书系统中不需要对书籍的信息进行检验。
package com.sh.Library;
import java.util.Scanner;
public class AddOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("新增图书!");
Scanner scan=new Scanner(System.in);
System.out.println("请输入要新增图书的名字:");
String name=scan.next();
System.out.println("请输入作者的名字:");
String author=scan.next();
System.out.println("请输入图书的类型:");
String type=scan.next();
Book book=new Book(name,author,type); //新建书籍
bookList.getBooks().add(book); //使用ArrayList的add来进行图书的添加
System.out.println("添加成功!");
}
}
(2)添加
查找操作只有两种情况,一种是找到了,另一种自然就是没找到,在没找到的时候我们就可以选择抛出一个异常,查找操作的具体实现还是通过遍历来实现
代码如下:
package com.sh.Library;
import java.util.Scanner;
public class AddOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("新增图书!");
Scanner scan=new Scanner(System.in);
System.out.println("请输入要新增图书的名字:");
String name=scan.next();
System.out.println("请输入作者的名字:");
String author=scan.next();
System.out.println("请输入图书的类型:");
String type=scan.next();
Book book=new Book(name,author,type); //新建书籍
bookList.getBooks().add(book); //使用ArrayList的add来进行图书的添加
System.out.println("添加成功!");
}
}
(3)删除
删除操作同理,也是提供相应的书名,然后进行搜索,如果找到了,就使用remove()方法进行删除,否则就抛出一个异常,具体还是通过遍历实现:
public class DelOperation implements IOperation{
public void work(BookList bookList)throws OperationException{
System.out.println("请输入你想要删除的书籍:");
Scanner scan=new Scanner(System.in);
String name=scan.next();
boolean flag=true;
for(int i=0;i< bookList.getBooks().size();i++){
if(bookList.getBooks().get(i).getName().equals(name)){
flag=false;
System.out.println("查找到了,请问是否要进行删除:"+name+"(Y/N)");
if(scan.next().equalsIgnoreCase("y")){ //进行删除操作
bookList.getBooks().remove(i);
System.out.println("删除成功!");
}
}
}
if(flag){
throw new OperationException("未查找到该书籍!");
}
}
}
(4)显示
显示操作较为好实现,因为重写过book的toString()方法了,所以可以直接遍历BookList进行输出即可
代码如下:
package com.sh.Library;
public class DisplayOperation implements IOperation{
//显示功能的实现
//结合book类的重写进行
public void work(BookList bookList) throws OperationException {
for(int i=0;i<bookList.getBooks().size();i++){
System.out.println(bookList.getBooks().get(i)); //直接输出
}
}
}
(5)借书
借书操作的实现也相同,先提供一个书名,然后遍历书架,若有则判断其是否已被借出,如果是,则抛出一个异常,否则就借出成功,并更改书的借出状态;若没有,即抛出一个未找到的异常。
package com.sh.Library;
public class BorrowOperation implements IOperation{
public void work(BookList bookList)throws OperationException{
System.out.println("请输入你想要借的书:");
Scanner scan=new Scanner(System.in);
String name=scan.next();
boolean flag=true;
for(int i=0;i< bookList.getBooks().size();i++){
if(bookList.getBooks().get(i).getName().equals(name)){ //查找到该书籍在图书馆中
flag=false;
if(bookList.getBooks().get(i).isBorrowed()==true){
throw new OperationException("借书失败,该书已被借出");
}else{ //书未被借出
System.out.println("借出成功!");
bookList.getBooks().get(i).setBorrowed(true);
}
}
}
//出循环了,仍未找到
if(flag) {
throw new OperationException("未查找到该书");
}
}
}
(6)还书
还书操作的过程,也是提供相应的书名,遍历书架,若有该书,则进行归还,同时设置其状态为未被借出状态;如果未找到该书,也抛出一个异常。
package com.sh.Library;
public class ReturnOperation implements IOperation{
public void work(BookList bookList) throws Exception {
Scanner scan=new Scanner(System.in);
System.out.println("请输入你要归还的书籍:");
String name=scan.next();
boolean flag=true;
for(int i=0;i<bookList.getBooks().size();i++){
if(bookList.getBooks().get(i).getName().equals(name)){
flag=false;
System.out.println("成功归还!");
bookList.getBooks().get(i).setBorrowed(false);
}
}
if(flag){
throw new OperationException("查无此书!");
}
}
}
(7)退书
退出功能的实现较为简单,我们这里使用System类中的静态方法exit来进行实现
代码如下:
package com.sh.Library;
//退出功能的实现
public class ExitOperation implements IOperation {
public void work(BookList bookList) throws OperationException {
System.out.println("是否要进行退出?"+"(Y/N)");
Scanner scan=new Scanner(System.in);
if(scan.next().equalsIgnoreCase("Y")){
System.out.println("退出成功!");
System.exit(0);
}
}
}
7、管理员的实现
首先,管理员类需要继承于用户类,同时实现用户类中的抽象方法menu(),同时实现抽象方法Operation(),这里可以利用接口的多态性来进行实现,同时我们要对Operation抛出的异常进行处理,同时抛出在选择过程中会出现的异常
代码如下:
package com.sh.Library;
public class Admin extends User{
public Admin(String name){
super(name);
}
public void menu(){
System.out.println("尊敬的管理员:"+this.getName()+"欢迎来到图书管理系统");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
}
public void Operation(int n,BookList bookList)throws OperationException{
IOperation iOperation=null;
switch(n){
case 0:
iOperation= new ExitOperation();
break;
case 1:
iOperation=new FindOperation();
break;
case 2:
iOperation=new AddOperation();
break;
case 3:
iOperation=new DelOperation();
break;
case 4:
iOperation= new DisplayOperation();
break;
default:
throw new OperationException("输入错误,请重新输入!");
}
try {
iOperation.work(bookList);
}catch(OperationException e){
System.out.println(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
8、读者类的实现
package com.sh.Library;
public class Reader extends User{
public Reader(String name){
super(name);
}
public void menu() {
System.out.println("尊敬的读者:"+this.getName()+"欢迎来到图书馆");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
}
public void Operation(int n, BookList bookList)throws OperationException {
IOperation iOperation=null;
switch(n){
case 0:
iOperation= new ExitOperation();
break;
case 1:
iOperation=new FindOperation();
break;
case 2:
iOperation=new BorrowOperation();
break;
case 3:
iOperation=new ReturnOperation();
break;
default:
throw new OperationException("输入错误,请重新输入!");
}
try {
iOperation.work(bookList);
}catch(OperationException e){
System.out.println(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
9、Test类
package com.sh.Library;
public class Test {
public static void main(String[] args){
System.out.println("请输入你的身份:");
System.out.println("管理员/普通用户(0/1)");
Scanner scan=new Scanner(System.in);
int choice=scan.nextInt();
System.out.println("请输入你的姓名:");
User user=null;
BookList bookList=new BookList();
switch(choice){ //进行身份的选择
case 0:
user=new Admin(scan.next());
break;
case 1:
user=new Reader(scan.next());
}
IOperation iOperation=null;
do {
user.menu();
System.out.println("请输入你要进行的操作:");
int input=scan.nextInt();
if(input==0){
System.out.println("退出成功");
return;
}
try {
user.Operation(input, bookList);
}catch(OperationException e){
System.out.println(e.getMessage());
}
}while(true);
}
}