目录
3.3 异常类的实现(OperationException)
图书馆作为每个大学或者城市必不可少的部分,其存放的海量书籍与文献使得其管理显得尤为困难,此时图书管理系统就起到了一个重大的作用。本次就将使用java语言中的异常处理,多态,继承,封装,接口等知识点,来综合性的设计与实现出一个简易的图书管理系统。
①首先我们需要区分出管理员与普通用户,不同的用户所展示的界面不同,利用继承和多态可以实现这一思路;
②我们可以将各个操作都封装起来,单独的设计成一个类,且这些操作都需要遵循一定的规范,而接口实际上就是定义了一种规范,这里可以使用接口来进行实现。
③我们需要将书的属性进行封装,同时设立一个书架类,即存放的是书的数组。
④我们需要实现管理员能够添加书籍,查找书籍,删除书籍以及显示书籍;
⑤读者能够实现查找书籍,借阅书籍以及归还书籍。
3.1 Book类的实现
我们这里书籍的属性有书名、作者、价格、类型以及是否被借出,我们结合封装性,将属性设置为private权限,并提供相应的get方法和set方法,空参构造器,以及一个不包含是否被借出的构造器(布尔值的默认类型就是false,可以不进行初始化)并需要提供对应的toString()方法的重写(具体重写情况看展示效果),代码实现如下:
public class Book { private String name; private String author; private int price; private String type; private boolean isBorrowed; //是否被借出 //构造器 public Book(){ } public Book(String name,String author,int price,String type){ this.author=author; this.name=name; this.price=price; 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 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 isBorrowed() { return isBorrowed; } public void setBorrowed(boolean borrowed) { isBorrowed = borrowed; }@Override//重写toString() public String toString() { return "Book{" + "书名:'" + name + '\'' + ", 作者:'" + author + '\'' + ", 价格:" + price + ", 类型:'" + type + '\'' + ", 是否借出:" + isBorrowed + '}'; }}
3.2 BookList类的实现(书架)
BookList类我们主要提供一个ArrayList的泛型数组来进行Book的存储,便于后面对书籍的操作。
BookList类我们提供一个私有的ArrayList的泛型数组,同时在空参构造器中对其初始化,先加入几本书籍,并提供对应的get和set方法,具体代码实现如下:
import java.util.ArrayList;public class BookList { private ArrayList books=new ArrayList(); public BookList() { books.add(new Book("三国演义","罗贯中",19,"小说")); books.add(new Book("西游记","吴承恩",29,"小说")); books.add(new Book("红楼梦","曹雪芹",25,"小说")); } public Book getBook(int pos){ //获取某个位置上的书籍 return books.get(pos); } public void setBook(int pos,Book book){ //设置某个位置上的书籍 books.set(pos,book); } public ArrayList getBooks(){ //获取书架,便于后面的Operation的使用 return books; }}
3.3 异常类的实现(OperationException)
异常的出现一般出现在操作中,我们可以通过自定义异常类的方式来处理不同异常情况的发生(也可以不进行定义),我们的自定义也提供一个空参构造器,和一个有参构造器用来打印异常信息(自定义异常类需要继承Exception类),代码实现如下:
public class OperationException extends Exception{ static final long serialVersionUID=-33875169931L; //空参构造器 public OperationException(){ } public OperationException(String message){ super(message); //Exception类中存在String参数的构造器和message }}
3.4 用户类的实现
用户类中,我们需要定义用户的名字,同时定义一个抽象方法menu()来给子类管理员类和读者类重写(二者的目录不同),同时要提供set和get方法,并提供抽象Operation方法给子类重写使用(子类的目录不同,执行的操作就会存在差异),代码实现如下:
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会抛出异常来处理异常,父类也需要抛出异常,//因为父类抛出异常大小要大于子类重写方法抛出的异常}
3.5 操作接口的实现(定义规范)
我们需要执行的操作有增加,删除,显示,查找等,他们都需要遵循一定的规范,而这个规范就由接口来实现,在增删查改等操作中,他们的主要方式就是工作,即work(),故接口中提供对应的work()方法供接口的实现类,即各种操作进行重写,代码实现如下:
public interface IOperation{ void work(BookList bookList)throws Exception;}
3.6 操作类的具体实现
3.6.1 增加操作
我们需要将操作类实现操作接口,同时为重写的方法提供书架类,便于进行操作。代码实现如下:
添加操作并没有什么异常,在简易图书系统中不需要对书籍的信息进行检验。
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("请输入图书的价格:"); int price=scan.nextInt(); System.out.println("请输入图书的类型:"); String type=scan.next(); Book book=new Book(name,author,price,type); //新建书籍 bookList.getBooks().add(book); //使用ArrayList的add来进行图书的添加 System.out.println("添加成功!"); }}
3.6.2 查找操作
查找操作只有两种情况,一种是找到了,另一种自然就是没找到,在没找到的时候我们就可以选择抛出一个异常,查找操作的具体实现还是通过遍历来实现,代码如下:
import java.util.Scanner;//查找功能的实现public class FindOperation implements IOperation{ @Override public void work(BookList bookList) throws OperationException { Scanner scan=new Scanner(System.in); System.out.println("请输入你想要查找的书名:"); String name=scan.next(); boolean flag=true; for(int i=0;i
3.6.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("未查找到该书籍!"); } }}
3.6.4 显示操作
显示操作较为好实现,因为重写过book的toString()方法了,所以可以直接遍历BookList进行输出即可,代码如下:
public class DisplayOperation implements IOperation{ //显示功能的实现 //结合book类的重写进行 @Override public void work(BookList bookList) throws OperationException { for(int i=0;i
3.6.5 借书操作
借书操作的实现也相同,先提供一个书名,然后遍历书架,若有则判断其是否已被借出,如果是,则抛出一个异常,否则就借出成功,并更改书的借出状态;若没有,即抛出一个未找到的异常。
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("未查找到该书"); } }}
3.6.6 还书操作
还书操作的过程,也是提供相应的书名,遍历书架,若有该书,则进行归还,同时设置其状态为未被借出状态;如果未找到该书,也抛出一个异常。
public class ReturnOperation implements IOperation{ @Override 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
3.6.7 退出功能
退出功能的实现较为简单,我们这里使用System类中的静态方法exit来进行实现,代码如下:
//退出功能的实现public class ExitOperation implements IOperation { @Override 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); } }}
3.7 管理员类的实现
首先,管理员类需要继承于用户类,同时实现用户类中的抽象方法menu(),同时实现抽象方法Operation(),这里可以利用接口的多态性来进行实现,同时我们要对Operation抛出的异常进行处理,同时抛出在选择过程中会出现的异常,代码如下:
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(); } }}
3.8 读者类的实现
读者类与管理员类同理,代码如下:
public class Reader extends User{ public Reader(String name){ super(name); } @Override 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(); } }}
3.9 Test类
此时,我们所有的框架都已经搭建好了,只需要在Test类中添加main方法进行测试即可,代码如下:
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); }}
源码地址在这:JavaSenior/day_02/src · 夕夕夕夕夕立/java - 码云 - 开源中国 (gitee.com)
来源地址:https://blog.csdn.net/yss233333/article/details/124956914