目录
- 前言
- 预期效果
- 分析
- 1. book包
- 1.1 Book类
- 1.2 BookList 类
- 2. user包
- 2.1 User类
- 2.2 AdminUser类
- 2.3 NormalUser类
- 3. opera包
- 3.1 IOPeration 接口
- 3.2 AddOperation 类
- 3.3 BrrowOperation 类
- 3.4 DelOperation 类
- 3.5 ExitOperation 类
- 3.6 FindOperation 类
- 3.7 ReturnOperation 类
- 3.8 ShowOperation 类
- 4. Main 类
前言
该系统是基于Java面向对象的特性来写的,体现其封装、继承、多态等思想。
预期效果
效果如图:
分析
我们可以根据需求来得到下图:
1. book包
1.1 Book类
package book;
public class Book {
// book的一些基本属性,比如书名,作者,价格,类型,是否被借出
private String name;
private String author;
private int price;
private String type;
private boolean isBorrowed; //这里isBorrowed初始化就是false,所以不需要在构造方法里初始化了
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
//提高一些get、set方法,方便以后进行查看和修改(因为上面都是用private进行修饰的属性,只能在该类里面访问)
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;
}
//重写toString,以后打印book就会调用该方法
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isBorrowed ? " 已被借出" : " 未被借出") +
'}'; //注意三目运算符
}
}
1.2 BookList 类
package book;
public class BookList {
private Book[] books= new Book[10]; //创建一个Book数组,以后存放的书就在这里
private int size; //size是记录当前存放书的数目的
public BookList() { //初始存放三本书
books[0] = new Book("三国演义","罗贯中",33,"小说");
books[1] = new Book("西游记","吴承恩",46,"小说");
books[2] = new Book("红楼梦","曹雪芹",64,"小说");
this.size = 3; //并将size初始化为3
}
//提供get与set方法,来查看和改变数组中存放的书
public Book getBooks(int pos) {
return books[pos];
}
public void setBooks(int pos, Book book) {
books[pos] = book;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
2. user包
2.1 User类
该类包含了普通用户与管理员的共同点,也就是名字还有一些方法,将来是给AdminUser类和NormalUser类继承的,由此我们可以写出它的代码:
package user;
import book.BookList;
import opera.IOPeration;
public class User {
protected String name; //体现封装性,用protected,不同包中的子类也能访问
protected IOPeration[] ioPerations; //这个接口数组将来存放的是 实现了该接口的操作方法,根据菜单需求,在两个子类中分别初始化。
public User(String name) {
this.name = name;
}
public int menu() { //因为两种用户的菜单不同,所以提供一个方法,供子类根据需求进行重写
return 0;
}
public void work(int m, BookList bookList) {
this.ioPerations[m].work(bookList);
} //这里通过输入m,来控制调用的操作方法
}
2.2 AdminUser类
package user;
import opera.*;
import java.util.Scanner;
public class AdminUser extends User{
//通过构造方法来初始化姓名及接口数组(普通用户和管理员的菜单不同,所以要根据需求初始化数组)
public AdminUser(String name) {
super(name);
this.ioPerations = new IOPeration[]{
new ExitOperation(), //把0号位置对应退出系统操作
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation()
};
}
//重写父类的menu方法
public int menu() {
System.out.println("************************************");
System.out.println("欢迎" + 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("************************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
return m; //返回操作数
}
}
2.3 NormalUser类
import opera.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.ioPerations = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new BrrowOperation(),
new ReturnOperation()
};
}
public int menu() {
System.out.println("************************************");
System.out.println("欢迎" + this.name +"来到图书小练习!");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("************************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
return m;
}
}
3. opera包
3.1 IOPeration 接口
package opera;
import book.BookList;
public interface IOPeration { //该接口提供了一个work方法
void work(BookList bookList); //因为是对BookList进行操作,所以传入该类型参数
}
3.2 AddOperation 类
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration{
@Override //重写work方法
public void work(BookList bookList) {
System.out.println("请输入你要添加的书名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入作者:");
String author = scanner.nextLine();
System.out.println("请输入类型:");
String type = scanner.nextLine();
System.out.println("请输入价格:");
int price = scanner.nextInt();
//将这些信息存入变量book中
Book book = new Book(name,author,price,type);
for(int i = 0; i < bookList.getSize(); i++) { //遍历数组,判断是否存在该书
Book tmp = bookList.getBooks(i);
if(tmp.getName().equals(name)) {
System.out.println("这本书已存在");
return;
}
} //该书不存在则将该书加入数组中
bookList.setBooks(bookList.getSize(),book);
bookList.setSize(bookList.getSize()+1);
}
}
3.3 BrrowOperation 类
package opera;
import book.BookList;
import java.util.Scanner;
public class BrrowOperation implements IOPeration {
@Override
public void work(BookList bookList) {
System.out.println("请输入书名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for(int i = 0; i < bookList.getSize(); i++) {
// 借阅图书,不仅得有该书,还得该书处于未被借阅状态
if(bookList.getBooks(i).getName().equals(name) && !bookList.getBooks(i).isBorrowed()) {
System.out.println("借阅成功!");
bookList.getBooks(i).setBorrowed(true);
return;
}
}
System.out.println("没有该书,请重新选择!");
}
}
3.4 DelOperation 类
import 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);
String name = scanner.nextLine();
int i = 0;
for(i = 0; i < bookList.getSize(); i++) {
if(bookList.getBooks(i).getName().equals(name)) {
break; //找到该书后,i即是该书在数组中的下标位置
}
}
if(i < bookList.getSize()) {
for( ; i < bookList.getSize()-1; i++) {
//将后面的书往前覆盖,再改变一下size的值即可
bookList.setBooks(i,bookList.getBooks(i+1));
}
bookList.setSize(i);
System.out.println("删除成功!");
}else { //如果i走到了最后,则该书不存在
System.out.println("没有该书!");
}
}
}
3.5 ExitOperation 类
package opera;
import book.BookList;
public class ExitOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.exit(0); //退出程序
}
}
3.6 FindOperation 类
package opera;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("请输入书名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for(int i = 0; i < bookList.getSize(); i++) { //遍历查找图书
if(bookList.getBooks(i).getName().equals(name)) {
System.out.println("找到了!");
System.out.println(bookList.getBooks(i));
return;
}
}
System.out.println("没有该书!");
}
}
3.7 ReturnOperation 类
package opera;
import 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);
String name = scanner.nextLine();
for(int i = 0; i < bookList.getSize(); i++) {
if(bookList.getBooks(i).getName().equals(name) && bookList.getBooks(i).isBorrowed()) {
System.out.println("归还成功!");
bookList.getBooks(i).setBorrowed(false);
return;
}
}
System.out.println("没有该书,请重新选择!");
}
}
3.8 ShowOperation 类
package opera;
import book.BookList;
public class ShowOperation implements IOPeration{
@Override //显示图书
public void work(BookList bookList) {
for(int i = 0; i < bookList.getSize(); i++) {
System.out.println(bookList.getBooks(i)); //这里调用了我们重写的toString方法
}
}
}
4. Main 类
import book.BookList;
import opera.IOPeration;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login() {
System.out.println("请输入你的姓名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入你的身份: 1 --> 管理员 2 --> 普通用户");
int a = scanner.nextInt();
if(a == 1) { //这里通过a,来判断身份,并返回一个该身份的对象
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 m = user.menu();
user.work(m, bookList);
}
}
}