先记录一下最近遇见的gitee方面的问题:
1. 书本类
1.1 标准的javabean类"书"
public class Book {
//变量属性: 用包装类类型Double,Boolean
private String bookName;
private String author;
private Double price;
private String type;
private Boolean isBorrowed = false;//图书的借阅状态
//构造方法
public Book() {
}
public Book(String bookName, String author, Double price, String type) {
this.bookName = bookName;
this.author = author;
this.price = price;
this.type = type;
}
//get和set方法
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Boolean getBorrowed() {
return isBorrowed;
}
public void setBorrowed(Boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"bookName='" + bookName + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
1.2 "书架"类
public class BookList {
//静态常量 集合 存放书本对象
static List<Book> books = new ArrayList<>();
//在空参构造器中对其初始化
public BookList(){
// 数组 存放 所有的书
books.add(new Book("三国演义","罗贯中",83.6,"小说"));
books.add(new Book("水浒传","施耐庵",86.6,"小说"));
books.add(new Book("西游记","吴承恩",87.7,"小说"));
books.add(new Book("红楼梦","曹雪芹",88.8,"小说"));
}
//获取书架上的所有书本,返回值类型是Book类型的集合
public static List<Book> getBooks(){
return books;
}
//根据书本名称判断是否在books集合里存在
public boolean isBookContains(String bookName) {
List<Book> books = BookList.getBooks();
for (Book book : books) {
if (book.getBookName().contains(bookName)) {
return true;
}
}
return false;
}
}
2. 用户类
用户主要分两类:普通用户和管理员。他们都继承父类User。
2.1 父类:用户类
public abstract class User {//抽象方法所在类一定是抽象类
protected String userName;
//构造方法
public User() {
}
public User(String userName){
this.userName = userName;
}
//get和set方法
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
//抽象方法: 因为管理员和普通用户的菜单不同,所以写为抽象方法
public abstract void menu();
//方法: 具体的操作:接收 用户的选择,在哪个书架上进行的操作(子类的Operation会抛出异常来处理异常,父类也需要抛出异常,因为父类抛出异常大小要大于子类重写方法抛出的异常 )
public void doOperation(int choice, BookList bookList) throws ExceptionOperation {
};
}
2.2 子类:管理员类
public class AdminUser extends User {
//有参构造方法
public AdminUser(String userName){
super(userName);
}
//重写父类中的抽象方法 menu
@Override
public void menu() {
//用户通过键盘输入信息
Scanner sc = new Scanner(System.in);
System.out.println("##################################");
System.out.println("欢迎管理员"+userName+"登录图书管理系统");
System.out.println(" 1 增加书籍 ");
System.out.println(" 2 删除书籍 ");
System.out.println(" 3 修改书籍 ");
System.out.println(" 4 查阅书籍 ");
System.out.println(" 5 显示书籍 ");
System.out.println(" 0 退出系统 ");
System.out.println("##################################");
}
//重写父类中的抽象方法 doOperation
@Override
public void doOperation(int choice, BookList bookList) throws ExceptionOperation {
IOperation iOperation = null;//初始化接口类型的变量值iOperation
switch (choice){
case 0:
iOperation=new ExitOperation();
break;
case 1:
iOperation=new AddOperation() ;
break;
case 2:
iOperation=new DeleteOperation();
break;
case 3:
iOperation=new UpdateOperation();
break;
case 4:
iOperation= new QueryOperation();
break;
case 5:
iOperation = new DisplayOperation();
break;
default:
throw new ExceptionOperation("输入错误,请重新输入!");
}
try {//尝试执行上述这些方法操作
iOperation.doWork(bookList);//方法操作实现了接口中的doWork方法
}catch(ExceptionOperation e){
System.out.println(e.getMessage());
}catch (Exception e) {
e.printStackTrace();
}
}
}
2.3 子类:普通用户类
public class NormalUser extends User {
//有参构造方法 继承父类
public NormalUser(String userName) {
super(userName);
}
//对User类中的menu方法进行重写
@Override
public void menu() {
//用户通过键盘输入信息
Scanner sc = new Scanner(System.in);
System.out.println("#############$$$$$$################");
System.out.println("欢迎普通用户"+userName+"登录图书管理系统");
System.out.println(" 0 退出系统 ");
System.out.println(" 1 显示书籍 ");
System.out.println(" 2 查询书籍 ");
System.out.println(" 3 借阅书籍 ");
System.out.println(" 4 归还书籍 ");
System.out.println("####################################");
}
@Override
public void doOperation(int choice, BookList bookList) throws ExceptionOperation {
IOperation iOperation = null;
switch(choice){
case 0:
iOperation = new ExitOperation();
break;
case 1:
iOperation = new DisplayOperation();
break;
case 2:
iOperation = new QueryOperation();
break;
case 3:
iOperation = new BorrowOperation();
break;
case 4:
iOperation = new ReturnOperation();
break;
default:
throw new ExceptionOperation("输入错误,请重新输入!");
}
try {//尝试执行
iOperation.doWork(bookList);
}catch(ExceptionOperation e){
System.out.println(e.getMessage());
}catch (Exception e) {
e.printStackTrace();
}
}
}
3. 操作类
操作类主要是具体的增删改查等方法,通过重写接口中的doWork函数实现。
3.0 接口 Operation实现doWork方法
因为不同的管理员或者是普通用户,他们要实现的菜单“增删改查”的功能是不一致的,所以定义一个抽象方法:对哪个书架上的书进行“menu"中的操作。
/**
我们需要执行的操作有增加,删除,显示,查找等,他们都需要遵循一定的规范,
* 而这个规范就由接口来实现,在增删查改等操作中,他们的主要方式就是工作,即doWork(),
* 故接口中提供对应的doWork()方法供接口的实现类,即各种操作进行重写*/
public interface IOperation {
public abstract void doWork(BookList bookList) throws Exception;
}
3.1 增加操作
根据获取的书本名称判断该书是否已存在,如果有则提示不能重复添加,没有则正常添加。
public class AddOperation implements IOperation {
@Override
public void doWork(BookList bookList) throws ExceptionOperation {
System.out.println("您正在进行的是添加书籍操作");
//获取要添加的书籍名称——>和书架上的书的书名进行对比——>存在则显示已有该书籍——>不存在则进行添加
System.out.println("请输入您要添加的书名:");
Scanner sc = new Scanner(System.in);
String bookName = sc.next();
//和书架上的书的书名进行对比
if(bookList.isBookContains(bookName)){
throw new ExceptionOperation("该书籍已存在,请勿重复添加!");
}else{
System.out.println("请输入要添加书本的作者:");
String author = sc.next();
System.out.println("请输入要添加书本的价格:");
Double price = sc.nextDouble();
System.out.println("请输入要添加书本的类型:");
String type = sc.next();
//新建一个书本对象,将这些信息传进去
Book book = new Book(bookName,author,price,type);
//将该书本添加到books书架上
addBook(book);
}
}
public void addBook(Book book) {//书架上添加该书本
BookList.getBooks().add(book);
System.out.println("书籍添加成功!");
}
}
3.2 删除操作
根据获取的书名删除图书信息,如果有则删除成功,否则抛出异常信息。
public class DeleteOperation implements IOperation {
@Override
public void doWork(BookList bookList) throws ExceptionOperation {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的书本名称:");
String bookName = sc.next();
if(!bookList.isBookContains(bookName)){
System.out.println("该书籍不存在");
}else{
System.out.println("查找到了,请问是否要进行删除:"+bookName+"(Y/N)");
if(sc.next().equalsIgnoreCase("y")){ //进行删除操作 //删除该书本
deleteBook(bookName);//调用deleteBook函数
}
}
}
public void deleteBook(String bookName) throws ExceptionOperation {
List<Book> books = BookList.getBooks();
for (int i = 0; i < books.size(); i++) {
if(bookName.equals(books.get(i).getBookName())){
books.remove(books.get(i));
return;
}
}
throw new ExceptionOperation("未查找到该书籍!");
}
}
3.3 修改操作
根据获取的书名修改图书的价格;如果没有该书,则抛出异常信息。
public class UpdateOperation implements IOperation {
@Override
public void doWork(BookList bookList) throws ExceptionOperation {
System.out.println("请输入要修改的图书名称:");
Scanner sc = new Scanner(System.in);
String bookName = sc.next();
//修改图书的价格
System.out.println("请输入要修改的图书价格:");
Double price = sc.nextDouble();
setPriceFun(bookName,price,bookList);//调用方法:setPriceFun
}
public void setPriceFun(String bookName,Double price,BookList bookList) throws ExceptionOperation {
List<Book> books = BookList.getBooks();
for (Book book : books) {
if(book.getBookName().equals(bookName)){
book.setPrice(price);
DisplayOperation.display();
return;
}
}
//否则(没找到该书),抛出异常信息
throw new ExceptionOperation("价格修改失败!");
}
}
3.4 查询操作
根据获取的图书名称判断书本集合中是否有该书,有的话打印该书信息;没有则抛出异常信息。
public class QueryOperation implements IOperation {
@Override
public void doWork(BookList bookList) throws ExceptionOperation {
//查询书籍:有两种状态:要么找到了打印该书籍信息,要么没找到抛出异常信息
System.out.println("请输入要查询的图书名称:");
Scanner sc = new Scanner(System.in);
String bookName = sc.next();
//方法:displayFindBook 判断输入的图书与书籍名称集合是否相等,给出结果
displayFindBook(bookName);
}
public void displayFindBook(String bookName) throws ExceptionOperation {
List<Book> books = BookList.getBooks();
for (Book book : books) {
if(book.getBookName().equals(bookName)){
System.out.println("已找到该书!");
System.out.println(book);
return;
}
}
//否则(没找到该书),抛出异常信息
throw new ExceptionOperation("没有找到该书!");
}
}
3.5 借阅图书操作
我们在这里的归还和借阅图书的功能实现比较简单,目前只根据书籍的isBorrow属性来表示是否借阅与归还成功:isBorrow为false,表示该书可以被借阅;为true,表示该书已被借阅。
根据获取的书本名称判断该书是否存在,存在且书籍的isBorrow属性值为false,则可以借阅,否则不能借阅抛出异常信息。
public class BorrowOperation implements IOperation {
@Override
public void doWork(BookList bookList) throws ExceptionOperation {
System.out.println("您正在进行借阅图书的操作:");
System.out.println("请输入要借阅的图书名称:");
Scanner sc = new Scanner(System.in);
String bookName = sc.next();
//判断该图书的借阅状态是否为false,为false则可以借书,否则给出提示
isBorrow(bookName);
}
public static void isBorrow(String bookName) throws ExceptionOperation {
List<Book> books = BookList.getBooks();
for(int i=0;i< books.size();i++){
if(books.get(i).getBookName().equals(bookName)){ //查找到该书,说明该书还未被借出在图书馆中
if(books.get(i).getBorrowed()){//如果为true
System.out.println("借书失败,该书已被借出!");
}else{ //为默认状态false:书未被借出
System.out.println("借出成功!");
books.get(i).setBorrowed(true);//更新书籍的借阅状态
}
return;
}
}
throw new ExceptionOperation("未查找到该书!");
}
}
3.6 归还图书操作
根据书本名称判读该书是否存在,存在则将书籍的isBorrow属性值置为false。
public class ReturnOperation implements IOperation {
@Override
public void doWork(BookList bookList) throws ExceptionOperation {
System.out.println("请输入要归还的图书名称:");
Scanner sc = new Scanner(System.in);
String bookName = sc.next();
//方法: isReturn 更新书籍的归还状态
isReturn(bookName);
}
public void isReturn(String bookName) throws ExceptionOperation {
List<Book> books = BookList.getBooks();
for (Book book : books) {//默认书籍的状态是false,表示未被借出
if(book.getBookName().equals(bookName)){
System.out.println("该书已归还成功!");
book.setBorrowed(false);
return;
}
}
throw new ExceptionOperation("没有找到该书,该书归还失败!");
}
}
3.7 展示图书操作
public class DisplayOperation implements IOperation {
@Override
public void doWork(BookList bookList) {
System.out.println("正在显示书籍:");
display();
}
public static void display() {//遍历"书架"这个列表,打印书架上所有书的信息
List<Book> books = BookList.getBooks();
for (Book book : books) {
System.out.println(book);
}
}
}
3.8 退出系统操作
public class ExitOperation implements IOperation {
@Override
public void doWork(BookList bookList) throws ExceptionOperation {
System.out.println("请问您是否要退出?是:Y,否:N");
Scanner sc = new Scanner(System.in);
String answer = sc.next();
if(answer.equalsIgnoreCase("Y")){
System.out.println("退出成功!");
System.exit(0);
}
}
}
3.9 操作异常 操作
public class ExceptionOperation extends Exception{
public ExceptionOperation() {
}
public ExceptionOperation(String message) {
super(message);
}
}
4. 测试类
public class TestDemo {
public static void main(String[] args) throws Exception {
BookList booklist = new BookList();//新建一个书架
User user = getUserID(); //login函数返回的是一个 User类型的用户user
while (true){
user.menu();//根据用户的不同,选择不同的菜单
int choice = getChoice();//获取用户选择的操作
user.doOperation(choice,booklist);//根据choice调用所选择的身份调用不同的doOperation方法
}
}
public static int getChoice(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的选择:");
int choice = sc.nextInt();
return choice;
}
//返回用户的身份类型
public static User getUserID() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String userNname = sc.next();
System.out.println("请输入您的身份:0管理员 1普通用户");
int id = sc.nextInt();
if(id == 0){
return new AdminUser(userNname);
}else {
return new NormalUser(userNname);
}
}
}