目录
- 1. 功能介绍及效果演示
- 2. 整体框架的搭建
- 2.1 book包
- 2.2 operation包
- 2.3 user包
- 2.4 Main
- 3. 相关功能的实现
- 3.1 Add(新增图书)
- 3.2 Borrow(借阅图书)
- 3.3 Change(修改信息)
- 3.4 Delete(删除图书)
- 3.5 Exit(退出系统)
- 3.6 Return(归还图书)
- 3.7 Search(查找)
- 3.8 Show(展示书架)
老铁们好~~在学习继承,封装,多态,接口等语法后,为了巩固知识,我们来写一个小项目,加深对知识的理解,话不多说,咱们开始今天的学习吧!
1. 功能介绍及效果演示
进入程序后,提示输入姓名,选择身份,程序会根据选择的身份弹出对应的菜单
管理员身份:
普通用户身份:
查找功能:
输入要查找的书名,如果有这本书就输出这本书的信息,如果没有输出"没有你要查找的书"
新增功能:
新增功能只有管理员用户才能拥有,新增书籍需要输入书籍相关信息
删除功能:
删除功能同样只有管理员用户才能拥有,输入删除的书名即可,如果书架没有这本书提示没找到
显示功能:
显示当前书架上的书籍及相关信息
修改功能:
管理员用户专属功能~输入要修改的书的书名,接着提示输入修改之后的信息
2. 整体框架的搭建
我们创建三个包:book,user,operation,book包中保管书相关的类,operation包中保管功能实现相关的类,user包中保管用户相关的类;同时创建一个Main类,Main是程序的入口
2.1 book包
book包中有两个类,一个是Book,一个是BookList
book类中包含了一本书的相关信息,书名作者,价格等,boolean类型的成员变量isBorrowed用于表示是否被借出,在类中如果不初始化默认是false,所以在构造方法中没有传参数isBorrowed,成员变量都是private修饰的,其他类不能直接访问,所以我们借助编译器生成对应的set和get方法用于设置和获取这些成员变量
编译器生成get和set方法:
鼠标右键,点击Generate…,
接着点击Getter and Setter
这里我们还要重写toString方法,让我们输出的对象是书籍的信息:
@Override
public String toString() {
return "书名:" + name +
"\t\t作者:" + author +
"\t\t价格:" + price +
"\t\t类型:" + type + "\t\t" +
(isBorrowed == true ? "已借出" : "未借出");
}
以下是Book类的代码
public class Book {
private String name;//书名
private String author;//作者
private double price;//价格
private String type;//类型
private boolean isBorrowed;//是否被借出
public Book(String name, String author, double price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
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 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 isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "书名:" + name +
"\t\t作者:" + author +
"\t\t价格:" + price +
"\t\t类型:" + type + "\t\t" +
(isBorrowed == true ? "已借出" : "未借出");
}
}
Book包中的另一个类是BookList,表示书架.成员变量是Book类的数组和当前书籍的数量
为了让程序运行时,书架上默认有四本书,所以在构造方法中对数组进行了初始化,设置数组大小是100,表示书架最多能放100本书.
public class BookList {
private Book[] books;//Book类的数组
private int usedSize;//当前书的数量
public BookList() {
this.books = new Book[100];
books[0] = new Book("西游记", "吴承恩", 99.9, "小说");
books[1] = new Book("水浒传", "施耐庵", 99.9, "小说");
books[2] = new Book("红楼梦", "曹雪芹", 99.9, "小说");
books[3] = new Book("三国演义", "罗贯中", 99.9, "小说");
this.usedSize = 4;
}
public Book getBook(int pos) {
//获取书架上pos位置的书
return books[pos];
}
public void setBook(int pos, Book book) {
//在书架的pos位置放book这本书
this.books[pos] = book;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
}
2.2 operation包
operation包中主要包含了新增,删除,修改等功能的实现(后面介绍),这里我们重点关注Ioperation这个接口,
public interface Ioperation {
void work(BookList bookList);
}
Ioperation要被Add,Borrow等这些类来实现,需要重写work方法,在work方法中实现各种功能
2.3 user包
user包中包含User类,NormalUser类,AdminUser类.为了实现不同用户弹出对应的菜单,我们将User类定义为抽象类,让管理员用户这个类(AdminUser)和普通用户类(NormalUser)继承USer类,将User中的菜单方法重写
public abstract class User {
protected String name;
public abstract int menu();
protected Ioperation[] operations;
public void Working(int choice, BookList bookList) {
this.operations[choice].work(bookList);
}
public User(String name) {
this.name = name;
}
}
管理员用户:
public class AdminUser extends User {
@Override
public int menu() {
System.out.println(super.name + " 您好!欢迎来到图书管理系统");
System.out.println("*****管理员菜单*****");
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("请输入你的操作>>>");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
public AdminUser(String name) {
super(name);
this.operations = new Ioperation[]{
new Exit(),
new Search(),
new Add(),
new Delete(),
new Show(),
new Change()
};
}
}
普通用户:
public class NormalUser extends User {
@Override
public int menu() {
System.out.println(super.name + " 您好!欢迎来到图书管理系统");
System.out.println("*****普通用户菜单*****");
System.out.println(" 1.查找图书");
System.out.println(" 2.借阅图书");
System.out.println(" 3.归还图书");
System.out.println(" 0.退出系统");
System.out.println("请输入你的操作>>>");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
public NormalUser(String name) {
super(name);
this.operations = new Ioperation[]{
new Exit(),
new Search(),
new Borrow(),
new Return()
};
}
}
2.4 Main
Main中只要包含main方法(程序的入口)和login方法(用于登录)
在login方法中:根据用户的输入来返回对应的对象.如果是管理员,返回AdminUser对象;如果是普通用户,返回NormalUser对象.在main方法中:因为login返回的可能是普通用户也可能是管理员用户,所以使用USer类型的对象user来接收(向上转型).接着user调用menu方法,如果user接收的是管理员用户则调用管理员用户的menu,否则调用普通用户的menu(多态).接着调用Working方法来实现具体的功能
public class Main {
public static User login() {
//登录
Scanner scanner = new Scanner(System.in);
System.out.println("请输入姓名");
String name = scanner.nextLine();
System.out.println("请输入你的身份 1:管理员 2:普通用户");
int choice = scanner.nextInt();
if (choice == 1) {
return new AdminUser(name);
} else {
return new NormalUser(name);
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = login();//登录
while (true) {
int choice = user.menu();
user.Working(choice, bookList);
}
}
}
3. 相关功能的实现
3.1 Add(新增图书)
新增图书的逻辑: 让用户输入新增的图书的信息并保存,new一个Book的对象,new对象的同时将信息通过参数进行初始化,将new好的书加在架BookList(也就是调用setBook方法),同时将UsedSize(当前书的数量)加1
public class Add implements Ioperation {
@Override
public void work(BookList bookList) {
System.out.println("新增图书");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入书名");
String bookName = scanner.nextLine();
System.out.println("请输入作者");
String author = scanner.nextLine();
System.out.println("请输入价格");
Double price = scanner.nextDouble();
System.out.println("请输入书的类型");
String type = scanner.next();
Book book = new Book(bookName, author, price, type);
bookList.setBook(bookList.getUsedSize(), book);
bookList.setUsedSize(bookList.getUsedSize() + 1);
}
}
3.2 Borrow(借阅图书)
借阅图书的逻辑: 用户输入要借阅的书的名字,循环遍历书架(BookList),如果找到了这本书,将isBorrowed设置为true表示已经被借阅,如果没找到则提示"没找到这本书"
public class Borrow implements Ioperation {
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要借阅的书名");
String bookName = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (bookName.equals(book.getName())) {
book.setBorrowed(true);
System.out.println("借阅成功!!");
return;
}
}
System.out.println("没找到这本书");
}
}
3.3 Change(修改信息)
修改信息的逻辑: 用户输入书名,循环遍历书架,如果找到这本书,记录下标.
接着让用户输入修改之后的信息,通过set方法重新设置相关属性.如果没找到这本书,输出"没有找到这本书"
public class Change implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("请输入要修改的书名");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
//找到了
System.out.println("请输入修改后的书名");
String newBookName = scanner.nextLine();
System.out.println("请输入修改后的作者");
String newBookAuthor = scanner.nextLine();
System.out.println("请输入修改后的价格");
Double newBookPrice = scanner.nextDouble();
System.out.println("请输入修改后的类型");
String newBookType = scanner.next();
book.setName(newBookName);
book.setAuthor(newBookAuthor);
book.setPrice(newBookPrice);
book.setType(newBookType);
book.setBorrowed(false);
System.out.println("修改成功!!!");
return;
}
System.out.println("没有找到这本书!!!");
}
}
}
3.4 Delete(删除图书)
删除图书的逻辑 用户输入书名,循环遍历书架,如果找到了这本书,记录下标,如果没找到则return,并且输出"没找到你要删除的书",找到书之后如何删除?
如图,假设要删除pos位置的书,只需要将pos+1位置覆盖掉pos位置的数据即可,覆盖之后再将最后一个位置置空(使用setBook)
public class Delete implements Ioperation {
@Override
public void work(BookList bookList) {
int pos = -1;
System.out.println("删除图书");
System.out.println("请输入要删除的书名");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int i = 0;
for (; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
pos = i;
break;
}
}
if (i >= bookList.getUsedSize()) {
System.out.println("没找到你要删除的书");
return;
}
//开始删除操作
for (int j = pos; j < bookList.getUsedSize() - 1; j++) {
Book book = bookList.getBook(j + 1);//把j+1下标的书先拿出来
bookList.setBook(j, book);//j+1的书(book)给j
}
bookList.setUsedSize(bookList.getUsedSize() - 1);
bookList.setBook(bookList.getUsedSize(), null);//删除最后一个位置的书
System.out.println("删除成功!!");
}
}
3.5 Exit(退出系统)
退出前先将书架里面的全部书籍都置空,置空后调用系统函数exit退出
public class Exit implements Ioperation {
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
for (int i = 0; i < bookList.getUsedSize(); i++) {
bookList.setBook(i, null);
}
System.exit(0);
}
}
3.6 Return(归还图书)
归还图书的逻辑: 用户输入书名,循环遍历书架,如果找到这本书,将书的sBorrowed属性设置为false即可
public class Return implements Ioperation {
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要归还的书名");
String bookName = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (bookName.equals(book.getName())) {
book.setBorrowed(false);
System.out.println("归还成功!!");
return;
}
}
System.out.println("没找到这本书");
}
}
3.7 Search(查找)
查找的逻辑: 用户输入书名,循环遍历书架,如果找到了,打印这本书这个对象(重写了toString),如果没找到,输出"没找到你要查找的书!!!"
public class Search implements Ioperation {
@Override
public void work(BookList bookList) {
System.out.println("请输入要查找的书名");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
System.out.println("找到了");
System.out.println(book);
return;
}
}
System.out.println("没找到你要查找的书!!!");
}
}
3.8 Show(展示书架)
展示书架的逻辑: 因为我们重写了toString,所以循环打印book对象即可
public class Show implements Ioperation {
@Override
public void work(BookList bookList) {
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
System.out.println(book);
}
}
}
今天的内容就到这里,感谢老铁们的阅读~