图书管理系统
一、设计思路
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{@Overridepublic 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);}
}