前言
本文主要目的: 将前面的博客内容,做一个整合, 实现图书管理涉及的知识点:类,对象,抽象类,接口,封装,继承,多态,顺序表
?
图书管理应实现的功能
1. 输入用户名 2.是以什么身份登录(普通用户还是管理员) 3.普通用户选项菜单 && 管理员选项菜单 4.功能实现(普通用户和管理员菜单可操作的功能有所不同) ?4.1查找图书(普通用户 和 管理员) ?4.2新增图书(管理员) ?4.3删除图书(管理员) ?4.4显示图书(普通用户 和 管理员) ?4.5退出系统(普通用户 和 管理员) ?4.6借阅图书 (普通用户 ) ?4.7归还图书(普通用户 ) 5.隐藏功能(就是背地里完成的功能) ?5.1 存储数的信息 ?5.2 书不止一本,所以该怎么存储. ?5.3 业务功能,就是说别人还书,借书的指引,或者提示什么的。
?
准备工作
开始操作
先在book包,创建一个Book类,用来存储一本书的信息
?
小技巧:
根据小技巧来创造我们的 构造方法,公开的输入输出的接口,,还要重写的toString方法
代码如下(轻轻松松70行代码):
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 getBorrowed() {
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 +
'}';
}
}
?
在Book包里,再创建一个 BookList 用顺序表实现书架,
?
初步实现
public class BookList {
private Book[] books = new Book[10];
private int usedSize;
public BookList(){
books[0] = new Book("三国演义","罗贯中",40,"小说");
books[1] = new Book("西游记","吴承恩",45,"小说");
books[2] = new Book("水浒传","施耐庵",47,"小说");
books[3] = new Book("红楼梦","曹雪芹",50,"小说");
this.usedSize = 3;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getPos(int pos){
if (pos<0&&pos>usedSize){
System.out.println("没有书籍的编号符合你的需求。");
return null;
}
return this.books[pos];
}
}
?
接下来就是先那些功能,但是我不想 像 顺序表那样,把所有的操作都写在一起。我把这些操作过程都面向对象,
首先创建一个包用来 存储 操作类
现在我们就来初步实现它们
仔细想想,后面的所有操作都是对顺序表数据,进行操作的。 那么我们就把提取出来,作为接口。 这么做的目的,就是为了方便导入 普通用户,和 管理员的功能,我可以通过这个接口引用全部功能。 因为 管理员 和 普通用户所使用的功能是有所不同的,有了这个接口,我们可以自主选择,那些是 管理员的功能,那些是普通用户的功能
?
再来看 user 包,我们需要写什么
user 用户的意思,无论是管理员,还是普通用户,都是用户。 那么就意味着两者具有共性,我们将其提取出来。 再建立两个类,分别是普通用户类 和 管理员类
?
管理员菜单 && 普通用户菜单
?
菜单已建立好了,接下来。就需要调用一下,看下效果,
效果图
?
进入下一个阶段,既然现在已经能够打印出菜单。接下来就是 选择菜单中的功能,并将其使用。
那么就意味着我们需要回过头,再去看看 AdminUser 和 NormalUser 这两个用户类,补充其功能。 第一步: 修改用户包中的三个类的menu方法 先别着急,虽然改好菜单,但是如何将管理员 和 普通用户 的 菜单功能实现 是一个问题, 接下来看着我的操作,现在 User 父类中创建一个 IOperation 数组 然后重点来了,我们先拿 AdminUser 起手 再来看普通用户就简单了 接下来就是至关重要的一步,细品。 简单来说:我们在 Uesr类中 创建一个doWork方法,来调用 其他功能类的方法, ? 通过 menu菜单的返回值(也就是用户选择的功能), ? 即IOperation 数组的元素下标,来选择相对应的功能对象, ? 根据 对象的引用,来调用其中方法,这也是为什么我们前面说 数组的元素,要对应菜单的顺序,是为了方便我们去调用它, ? 有些朋友可能基础不扎实,说,你都没有接收引用,你是怎么调用work方法的? 这里使用的是一次性对象(匿名对象)去访问的,课参考ClassAndObject -类与对象这篇博客,匿名对象的解释在导航最后,你可以通过点击导航,跳到那个位置去看, ? 而 User 中的 doWork 就是通过 匿名对象,去访问对象中的 work方法。,而work的工作形式,是由我们选择的对象所决定的,(多态) 多态不熟悉的朋友 可以参考 ObjectOrientedProgramming - 面向对象的编程(包、继承、多态的一部分:向下/向下转型,重写) 和 ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口) 这两篇博客,这两篇博客只要认真看,肯定收获颇丰。
?
效果图
由图发现虽然结果是我们想要的,但是 程序的结束,不是我们想要的, 比如说, 管理员 使用查找书籍功能,是为了观察书架上的数的情况,好对其增删查改。 我们这程序,使用一次功能就退出系统,想进行其它操作,还得重登,重新选择,多麻烦。是不是? 所以我们要在 加一个循环 。 效果如下: 循环的退出,交给我们的退出系统功能。 这也是我们下一步需要做的,完善操作功能。
?
显示图书功能(完善操作功能)
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.getPos(i);
System.out.println(book);
}
}
}
需做的一些修改
BookList
效果图
?
添加图书功能
添加图书
默认放到最后一个位置
暂不考虑 书架满不满等其他业务实现,这里只是一个初步框架,有兴趣完善业务能力的,可以自行修改
import java.util.Scanner;
public class AddOperation implements IOperation{
public void work(BookList bookList){
System.out.println("新增图书");
Scanner sc = new Scanner(System.in);
System.out.println("请输入图书名称:");
String name = sc.nextLine();
System.out.println("请输入图书的作者:");
String author = sc.nextLine();
System.out.println("请输入图书的类型:");
String type = sc.nextLine();
System.out.println("请输入图书的价格:");
int price = sc.nextInt();
Book book = new Book(name,author,price,type);
int size = bookList.getUsedSize();
bookList.setBook(size,book);
bookList.setUsedSize(size+1);
System.out.println("添加成功");
}
}
附图
?
前面有一个小瑕疵
这里应该是 false ,因为 布尔类型的默认值是 false。 但由于作者 前面写 String 类型,写顺手了,把 boolean 写成了封装类型 Boolean了。 当然这不是最主要的,我们的 isBoolean 使用用来表示书的 借出/归还 的状态。 解决也简单:修改 Book 重写的 toString 方法
?
查找图书功能
import java.util.Scanner;
public class FindOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
Scanner sc = new Scanner(System.in);
System.out.println("输入你要找的书籍名称:");
String name = sc.nextLine();
BookList bookList1 = new BookList();
for (int i = 0; i < bookList1.getUsedSize(); i++) {
Book book = bookList1.getPos(i);
if (name.equals(book.getName())){
System.out.println("找到了,信息如下:");
System.out.println(book);
return;
}
}
System.out.println("没有你所搜索的书籍");
}
}
效果图
?
退出功能
?
删除功能
import java.util.Scanner;
public class DelOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
System.out.println("输入你要删除书籍的名字:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
int index = 0;
int i = 0;
for (; i < bookList.getUsedSize(); i++) {
Book book = bookList.getPos(i);
if (name.equals(book.getName())){
index = i;
break;
}
}
if (i< bookList.getUsedSize()){
for (int j = 0; j < bookList.getUsedSize()-1; j++) {
Book book = bookList.getPos(j+1);
bookList.setBook(j,book);
}
bookList.setBook(bookList.getUsedSize(), null);
bookList.setUsedSize(bookList.getUsedSize()-1);
System.out.println("删除成功");
return;
}
System.out.println("没有你要删除的书");
}
}
效果图
?
借阅图书
import java.util.Scanner;
public class BorrowOperation implements IOperation{
public void work(BookList bookList){
System.out.println("借阅图书");
System.out.println("请输入你想借阅的书籍名称:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getPos(i);
if (name.equals(book.getName())){
if(book.getBorrowed() == true){
System.out.println("你要借阅的书籍,已被借走。无法借阅。");
System.out.println("信息如下:");
System.out.println(book);
return;
}
book.setBorrowed(true);
System.out.println("借阅成功!");
System.out.println(book);
return;
}
}
System.out.println("没有你要借阅的书籍");
}
}
效果图
?
归还图书功能
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
System.out.println("请输入你想借阅的书籍名称:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getPos(i);
if (name.equals(book.getName())){
if(book.getBorrowed() == false){
System.out.println("你要归还的书籍,已归还。无法重复此操作。");
System.out.println("信息如下:");
System.out.println(book);
return;
}
book.setBorrowed(false);
System.out.println("归还成功!");
System.out.println(book);
return;
}
}
System.out.println("你要归还的书籍,不属于本图书馆。");
}
}
附图
?
?
至此,图书管理的全部功能已经全部实现。
最后附上 各类程序总图,本文结束。
包和类的分布图
Main(程序入口)
?
User (用户,父类)
?
AdminUser (用户 - 管理员-子类)
?
NormalUser (用户 - 普通用户 - 子类)
?
接口 IOperation
?
AddOperation(添加图书)
?
BorrowOperation (借阅图书)
?
DelOperation(删除图书)
?
DisplayOperation (显示书籍)
?
ExitOperation (退出系统)
?
FindOperation(查找图书)
?
ReturnOperation (归还书籍)
|