1.设计思路
- 包分类:书籍book,操作operation[包含管理员和普通用户的操作集合],用户类User,主函数入口TestMain.java
- 分析:
书籍book包
Book类 | 创建的Book类中包含了书籍的名字,作者,价格,类型和借阅状态。构造方法会重写,设置初始化的时候书籍初始化信息 |
---|---|
BookList类 | 成员变量中usedSize确定图书存储量;引用Book.java的Book类,创建一个Book类型的数组,用于存储书籍 |
操作operation
Add类 | 导入Book和BookList类,Scanner输入确定好书记基础信息后利用Book类new一个新的并且自带的Scanner属性的book对象,通过bookList.getUsedSize来获取已经存储的书籍数量后再利用bookList.setBooke进行“尾插”存放图书,并且插入成功后要设置setUsedSize的存储+1 |
---|---|
Borrow类 | 通过Scaner获取要借阅书籍的属性,再利用for循环遍历,如果找到书籍。就把借阅状态isBorrowed改为true,表示被借阅 |
Del类 | Scaner获取书籍属性,for循环找到对应属性后退出,if判断退出for循环后的i值是否和已存书籍数量相等,如果相等,表示遍历所有书籍依旧没有找到对应属性而不是break退出循环;找到对应属性后就需要像顺序表一样删除,后边的往前覆盖。 |
Display类 | for循环,利用Book book = bookList.getBook(i)来获取所有书籍,然后输出book值即可输出一个book对象的所有信息 |
Exit类 | 利用System.exit(退出码:-1,1,0)即可退出程序 |
Find类 | Scanner获取书籍属性,for循环匹配书籍名称是否相等即可。如果没有找到就在循环之外输出提示 |
Return类 | Scanner获取书籍属性,for循环将匹配到的书的isBorrowed的true状态改为false状态;跳出循环后依旧没有找到就输出提示 |
IOperation接口 | 设计一个基础的work抽象方法,供给其operation包中所有类的使用 |
用户user包
User类 | 所有用户的基础类,拥有用户名,操作的集合,构造方法,不同类用户的打印窗口和对应的执行操作调用 |
---|---|
Admin | 管理员。继承User类, 初始化操作集合,打印的用户界面 |
NormalUser | 普通用户。除了用户界面不一样之外,其余都一样 |
主函数入口TestMain | 将BookList,Admin,User,NormalUser全部导入Scanner获取用户输入,区分用户是管理员还是普通用户并返回对应的操作权限界面;BookList booList初始换存储的书籍通过login的返回值确定登录的用户是不是管理员menu的返回值来执行对应权限操作 |
1.Book类
package day15Clonable及图书代码练习.book;
public class Book {
private String name;
private String author;
private int price;
private String type;
private boolean isBorrowed;
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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;
}
}
2.BookList类
package day15Clonable及图书代码练习.book;
public class BookList {
private Book[] books = new Book[100];
private int usedSize = 0;
public BookList() {
books[0] = new Book("穷查理宝典", "彼得.考夫曼", 168, "理财");
books[1] = new Book("塑造世界经济的五十项伟大发明", "蒂姆.哈福德", 58, "兴趣");
books[2] = new Book("影响力", "罗伯特", 45, "心理学");
this.usedSize = 3;
}
public void setBooks(int pos, Book book) {
this.books[pos] = book;
}
public Book getBook(int pos) {
return this.books[pos];
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
}
3.操作集合
- Add类
package day15Clonable及图书代码练习.operation;
import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("新增图书");
Scanner scanner = new Scanner(System.in);
System.out.print("清输入图书的名字: ");
String name = scanner.nextLine();
System.out.print("请输入图书的作者: ");
String author = scanner.nextLine();
System.out.print("请输入图书的价格: ");
int price = scanner.nextInt();
System.out.print("请输入图书的类型: ");
String type = scanner.next();
Book book = new Book(name, author, price, type);
int curSize = bookList.getUsedSize();
bookList.setBooks(curSize, book);
bookList.setUsedSize(curSize+1);
System.out.println("新增成功");
}
}
- Borrow类
package day15Clonable及图书代码练习.operation;
import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
Scanner scanner = new Scanner(System.in);
System.out.print("清输入图书的名字: ");
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
// 可借阅
book.setBorrowed(true);
System.out.println("借阅成功");
return;
}
}
System.out.println("没有你要借阅的书");
}
}
- Del类
package day15Clonable及图书代码练习.operation;
import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
Scanner scanner = new Scanner(System.in);
System.out.print("清输入删除图书的名字: ");
String name = scanner.nextLine();
int i = 0;
for (; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
break;
}
}
if (i == bookList.getUsedSize()) {
System.out.println("没有这本书");
return;
}
// 删除,顺序表一样:要想着删除最后的结尾,我们不能用cur.next来循环判断而是用cur来判断。这样才不会再倒数二哥结点停下
for (int pos = i; pos < bookList.getUsedSize()-1;++pos) {
// bookList[pos] = bookList[pos+1]: error
/*Book book = bookList.getBook(pos+1);
bookList.setBooks(pos, book);代码较多,下边的代码更精简*/
bookList.setBooks(pos, bookList.getBook(pos+1));
}
bookList.setUsedSize(bookList.getUsedSize()-1);
}
}
- Display类
package day15Clonable及图书代码练习.operation;
import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;
public class DisplayOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("显示图书图书");
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
System.out.println(book);
}
}
}
- Exit类
package day15Clonable及图书代码练习.operation;
import day15Clonable及图书代码练习.book.BookList;
public class ExitOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(1);
}
}
- Return类
package day15Clonable及图书代码练习.operation;
import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
Scanner scanner = new Scanner(System.in);
System.out.print("清输入归还图书的名字: ");
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
book.setBorrowed(false);
System.out.println("归还成功");
return;
}
}
System.out.println("没有你要归还的图书");
}
}
- IOperation接口
package day15Clonable及图书代码练习.operation;
import day15Clonable及图书代码练习.book.BookList;
public interface IOperation {
void work (BookList bookList);
}
4.用户
- User类
package day15Clonable及图书代码练习.user;
import day15Clonable及图书代码练习.book.BookList;
import day15Clonable及图书代码练习.operation.IOperation;
public abstract class User {
public String name;
protected IOperation[] operations;
public User(String name) {
this.name = name;
}
public abstract int menu();
public void doOperation(BookList bookList, int choice) {
this.operations[choice].work(bookList);
}
}
- Admin类
package day15Clonable及图书代码练习.user;
import day15Clonable及图书代码练习.operation.*;
import java.util.Scanner;
public class Admin extends User {
public Admin(String name) {
super(name);
this.operations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation(),
};
}
@Override
public int menu() {
System.out.println("♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣");
System.out.println("hello " + this.name + " 欢迎来到图书管理系统");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示所有图书");
System.out.println("0.退出系统");
System.out.println("♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
- Normal类
package day15Clonable及图书代码练习.user;
import day15Clonable及图书代码练习.operation.*;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name) {
super(name);
this.operations = new IOperation[] {
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
};
}
@Override
public int menu() {
System.out.println("==========================================");
System.out.println("hello " + this.name + " 欢迎来到图书管理系统");
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;
}
}
5.主函数入口TestMain类
package day15Clonable及图书代码练习;
import day15Clonable及图书代码练习.book.BookList;
import day15Clonable及图书代码练习.user.Admin;
import day15Clonable及图书代码练习.user.NormalUser;
import day15Clonable及图书代码练习.user.User;
import java.util.Scanner;
public class TestMain {
public static User login() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入姓名: ");
String name = scanner.nextLine();
System.out.print("请输入你的身份[1-->管理员 2-->普通用户]: ");
int choice = scanner.nextInt();
if (choice == 1) {
return new Admin(name);
} else {
return new NormalUser(name);
}
}
public static void main(String[] args) {
//1.准备书籍
BookList bookList = new BookList();
//2.登录
User user = login();
while (true) {
//选择是几,就可以对应到哪个方法
user.doOperation(bookList, user.menu());
}
}
}
6.Admin效果图
7.NormalUser效果图
注意查看用户的介于状态isBorrowed的true和false变化
2.结尾小彩蛋:Cloneable
提起克隆,深浅拷贝会被多次提起。如果修改克隆副本会影响数据源就是浅拷贝反知则是深拷贝;对于数组中是简单类型元素是深拷贝,引用类型是浅拷贝
int[] array1 = {1, 2, 3, 4, 5, 6};
int[] array2 = array1.clone();
array2[0] = 99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
输出结果:
[1, 2, 3, 4, 5, 6]
[99, 2, 3, 4, 5, 6]
因为数组中是简单的int类型,因此是深拷贝并不因为数组是引用类型就是浅拷贝
import java.util.Arrays;
/**
* class Person类属于自定义类,没有继承Object,所以没有clone()方法
* <p>
* 1.Ctrl+左键点击 Cloneable-->空接口: 也叫标记接口,只要一个类实现了这个接口,那么就标记这个类是可以进行clone的
* 2.重写clone方法[Wind: Alt+Ins/MacOS: option+Enter 后-->选择clone()]
* 3.解决person.cloe()依旧报错问题: 鼠标颠倒person.clone()然后Alt+Enter选怎Add Exceptionxxx添加异常到方法区
* 4.我们发现clone()方法返回值是Object,所以我们需要强制类型转
*/
class Money implements Cloneable {
double money = 12.5;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Person implements Cloneable {
public int age;
Money m = new Money();
@Override
protected Object clone() throws CloneNotSupportedException {
// return super.clone();
//1.克隆person
Person p1 = (Person) super.clone();
//2.克隆当前的Money对象
p1.m = (Money) this.m.clone();
return p1;
}
}
Person person1 = new Person();
Person person2 = (Person) person1.clone();
person2.m.money = 99.9;
System.out.println(person1.m.money);
System.out.println(person2.m.money);
输出结果:
12.5
99.9
说明我们的引用类型已经成功深拷贝