大部分思路我都写在了下面,下面是我的思维导图,双击就能放大看到
这里是关于包的创建和各类的创建
book包
Book
package book;
public class Book {
private String name;
private String author;//作者
private int price;
private String type;
private boolean isLend;//是否被借出,没有被初始化的情况下默认是false
public Book(String name, String author, int 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 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 isLend() {
return isLend;
}
public void setLend(boolean lend) {
isLend = lend;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isLend == true?" ,已借出 ":" ,未借出 ")+
//", isLend=" + isLend +
'}';
}
}
BookList
package book;
public class BookList {
private Book[] books = new Book[10];
private int usedSize;//用来记录当前存放多少书
public BookList(){
books[0]=new Book("三国演义","罗贯中",10,"小说");
books[1]=new Book("西游记","吴承恩",12,"小说");
books[2]=new Book("红楼梦","曹雪芹",11,"小说");
this.usedSize = 3;
}
public Book getBook(int pos){
return books[pos];//返回书籍的当前位置
}
public void setBook(int pos,Book book){
books[pos] = book;
}//添加书籍
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public boolean isFull(){
if(this.usedSize == books.length){
return true;
}
return false;
}
}
operation包
AddOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration{
public void work(BookList bookList){
System.out.println("新增图书......");
if(bookList.isFull()){
System.out.println("书架满了 不能新增了!");
return;
}
System.out.println("请输入需要新增的图书的书名: ");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
System.out.println("请输入需要新增的图书的作者: ");
String author = scanner.nextLine();
System.out.println("请输入需要新增的图书的价格: ");
int price = scanner.nextInt();
System.out.println("请输入需要新增的图书的类型: ");
String type = scanner.nextLine();
Book book = new Book(bookName,author,price,type);
//1.如果书架满了不能放 2.需要新增书籍的位置就是usedSize的位置
int currentSize = bookList.getUsedSize();//看一下当前有多少书籍,并获取他的个数
bookList.setBook(currentSize,book);//在当前位置添加书籍
bookList.setUsedSize(currentSize+1);//添加完之后把位置往后移,方便下一次添加
System.out.println("新增图书成功!");
}
}
BorrowedOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
//借阅系统
public class BorrowedOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书......");
System.out.println("请输入你要借阅的图书:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(bookName)) {
book.setLend(true);
System.out.println("借阅成功");
return;
}
}
System.out.println("借阅失败");
}
}
DelOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOPeration{
public void work(BookList bookList){
System.out.println("删除图书......");
System.out.println("请输入你要删除的图书书名: ");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
int pos = -1;
int i=0;
for (;i<currentSize;i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {//利用for循环和equals查看需要查找的书籍在书架上有没有
//找到这本书了,记录它的下标
pos=i;
break;
}
}
if(i>=currentSize){
System.out.println("没有你要找的书!");
return;
}
for(int j=pos;j<currentSize-1;j++){
//bookList[j]=bookList[j+1]不是一个数组,不能这样写
Book book = bookList.getBook(j+1);//先把j+1的拿出来
bookList.setBook(j,book);
}
//修改usedSize
bookList.setUsedSize(currentSize-1);
bookList.setBook(currentSize-1,null);
System.out.println("删除成功!");
}
}
ExitOperation
package operation;
import book.BookList;
public class ExitOperation implements IOPeration{
public void work(BookList bookList){
System.out.println("退出系统......");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
bookList.setBook(i,null);
}
System.exit(0);
}
}
FindOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
//查找图书
public class FindOperation implements IOPeration{
public void work(BookList bookList){
System.out.println("查找图书......");
//在哪里查找我们可以定义一个work方法,把书架传过去,因为要在书架里面查找
System.out.println("请输入你要查找的图书名:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i=0;i<currentSize;i++){
//Book book = bookList[i];错误写法,因为BookList不是一个数组类型,是一个类的类型,是bookList里面有一个数组
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)){//利用for循环和equals查看需要查找的书籍在书架上有没有
System.out.println("找到了这本书: ");
System.out.println(book);
return;
}
}
System.out.println("没有你要找的书......");
}
}
ReturnOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
//归还图书
public class ReturnOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("归还图书......");
System.out.println("请输入你要归还的图书:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(bookName)) {
book.setLend(false);
System.out.println("归还成功");
return;
}
}
System.out.println("归还失败");
}
}
ShowOperation
package operation;
import book.Book;
import book.BookList;
public class ShowOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("显示图书......");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
//Book book = bookList[i];错误写法,因为BookList不是一个数组类型,是一个类的类型,是bookList里面有一个数组
Book book = bookList.getBook(i);
System.out.println(book);
}
}
}
IOPeration接口
package operation;
import book.BookList;
public interface IOPeration {
void work(BookList bookList);
}
user包
AdminUser
package user;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name){
super(name);
this.ioPeration = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation()
};
}
public int menu(){
System.out.println("******管理员菜单******");
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 choice = scanner.nextInt();
return choice;
}
}
NormalUser
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name){
super(name);
this.ioPeration = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new BorrowedOperation(),
new ReturnOperation()
};//分配内存的同时进行初始化
}
public int menu(){
System.out.println("******普通用户菜单******");
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 choice = scanner.nextInt();
return choice;
}
}
User
package user;
import book.BookList;
import operation.IOPeration;
//第一不是表达某一个具体的对象,第二个包含了一个抽象方法,所以这个类只能是一个抽象方法
//在User里面新增,因为普通用户和管理员用户都继承于User,所以相当于在普通用户和管理员用户都新增了
public abstract class User {
protected String name;
protected IOPeration[] ioPeration;//创建一个实现了该接口的对象数组,其中数组的元素类型是实现了该接口的类。
public User(String name){
this.name = name;
}
public abstract int menu();//没有必要写具体实现,因为在子类里面写了,所以我们需要用abstract
public void doIoperation(int choice, BookList bookList){
this.ioPeration[choice].work(bookList);
}
}
Main方法
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
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){
AdminUser adminUser = new AdminUser(name);
return adminUser;//返回类型不一样,但是由于User是他们的父类,所以返回值是User
} else{
NormalUser normalUser = new NormalUser(name);
return normalUser;
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
//user有可能引用管理员用户也有可能引用普通用户
User user = login();//先进行登录,登录成功之后已经实例化好了一个对应的对象;发生了向上转型,有可能引用adminUser也有可能引用normalUser
while(true) {
int choice = user.menu();//所以我们要在User里面进行menu的声明;利用到了向上转型,利用到了动态绑定
//因为管理员菜单和普通用户菜单都有相同的数字,所以choice不知道是哪个用户的choice
user.doIoperation(choice, bookList);
}
}
}