提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
目录
文章目录
前言
一.界面设计
1.管理员菜单
2.用户菜单
3.用户操作:
- 查找图书
- 借阅图书
- 归还图书
- 显示图书
4.管理员操作
- 查找图书
- 新增图书
- 删除图书
二. Book包
1.book类
2.booklist类
三.接口和实现类的操作包
四.User包
1.NormalUser类
2.AdminUser类
五.最难的整合
Main类
前言
提示:这里可以添加本文要记录的大概内容:
用已经学过的面向对象的思想来设计一个图书页面
这是框架部分
提示:以下是本篇文章正文内容,下面案例可供参考
界面设计
书架里面默认放置三本书,有俩个角色管理员和普通用户,角色各自有四个功能,这四个功能对于角色具体实现是不同的
Book{name='三国演义', author='罗贯中', price=42, type='小说', 未借出}
Book{name='红楼梦', author='曹雪芹', price=50, type='小说', 未借出}
Book{name='西游记', author='吴承恩', price=58, type='小说', 未借出}
Book{name='水浒传', author='施耐庵', price=40, type='小说', 未借出}
管理员菜单
用户菜单
用户操作:
查找图书
借阅图书
归还图书
显示图书
见界面设计处
管理员操作
查找图书
新增图书
类似于用户的新增图书
删除图书
类似于用户删除图书
Book包
book类
package 图书管理系统.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;
}
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;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
booklist类
package 图书管理系统.book;
import 图书管理系统.book.Book;
public class BookList {
private Book[] books = new Book[10];
private int usdSize;
public BookList() {
books[0]=new Book("三国演义","罗贯中",42,"小说");
books[1]=new Book("红楼梦","曹雪芹",50,"小说");
books[2]=new Book("西游记","吴承恩",58,"小说");
books[3]=new Book("水浒传","施耐庵",40,"小说");
this.usdSize=4;
}
//修改图书数量
public void setUsdSize(int usdSize){
this.usdSize=usdSize;
}
//获得图书数量
public int getUsdSize(){
return usdSize;
}
//放书
public void setBook(int pos,Book book){
books[pos]=book;
}
//取书
public Book getBook(int pos){
return books[pos];
}
}
接口和实现类的操作包
将相关的操作统一规范成接口,接口里面操作图书,有一个work抽象方法,七个实现类需要重写该方法。
public interface IOperation {
public abstract void work(BookList bookList);
}
注意:退出系统,由于要回收资源(释放图书资源),所以还是需要实现接口
具体实现类见下文:
User包
package User;
import operation.IOperation;
import 图书管理系统.book.BookList;
public abstract class User {
protected String name;
protected IOperation[] iOperations;
public User(String name) {
this.name = name;
}
public abstract int menu();
public void doOperation(int choice, BookList bookList){
this.iOperations[choice].work(bookList);
}
}
NormalUser类
package User;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name){
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
};
}
public int menu(){
System.out.println("hello "+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;
}
}
AdminUser类
package User;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name){
super(name);
this.iOperations=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DeleteOperation(),
new DisplayOperation()
};
}
public int menu(){
System.out.println("hello "+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 sc=new Scanner(System.in);
int n=sc.nextInt();
return n;
}
}
最难的整合
Main类
首选我们先准备好图书,调用构造方法,进入登录页面,登录页面输入姓名,身份后,选择,注意根据你的选择来决定登录的返回值是普通用户,还是管理员,由于他们俩个都继成了user类,所以返回值填user(动态绑定和向上转型),当普通用户调用login(选择是0),实际上返回的是normaruser,返回值由user接受,这是向上转型,此时调用user.menu实际上就是重写的normaruse这是动态绑定。打印出界面之后,绑定的user(用户或者管理员),调用其doOperation方法,这是根据用户选的操作数来决定调用哪个接口里的work方法,如图所示:
import User.AdminUser;
import User.NormalUser;
import User.User;
import 图书管理系统.book.BookList;
import java.util.Scanner;
public class Main {
//动态绑定
public static User login(){//登陆 发生了向上转型
Scanner sc=new Scanner(System.in);
System.out.println("请输入你的姓名");
String name=sc.nextLine();
System.out.println("请输入你的身份:1:-》管理员,0-》普通用户");
int choice=sc.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 user=login();
while(true){
int choice=user.menu();
user.doOperation(choice, bookList);
}
}
}
这样初步的系统框架就搞定了