提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
大家好呀
最近快期末了,大家有没有泡图书馆呀,今天的学习内容跟图书馆有关,没错,就是图书管理系统,但是目前所学知识水平有限,这是一个很简单的图书系统小练习。不要急,我们的目的是在于如何使用已知学过的知识进行实践。
前言
这里将带大家用基本的Java语法和面向对象的思想来实现这个小程序。
提示:以下是本篇文章正文内容,下面案例可供参考
一、需求分析
图书馆书籍系统的用户分为管理员和普通用户两种,两种用户之间所能实现的功能是不同的。例如我理解想要实现的业务是这样子的:
管理员:
普通用户:
业务实现内容不是重点,大家可以根据自己的喜好去进一步完善~
二、具体实现过程
1.代码目录
建立一个叫booktest的项目,在src下新建book、operation、user 三个包,分别将跟书有关的类、跟操作有关的类、跟用户有关的类存储起来。即很好地应用了包的作用。
包的作用:
1.提供了类似于操作系统树状文件夹的组织形式,能分门别类地存储、管理类,易于查找并使用类;
2.解决了类命名时相同的冲突。在Java中,不能在一个同一个包中定义两个类名相同的类,但在不同包中可以;
3.保护类中成员变量和方法。该成员变量和方法的使用范围取决于访问修饰符。
代码如下(示例):
package book;
public class Book {
private String name;//书名
private String author;//作者
private double price;//价格
private String type;//类型
private boolean isBorrowed;//是否被借出
//Getter Setter方法
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 double getPrice() {
return price;
}
public void setPrice(double 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;
}
//提供一个4个参数的构造方法
public Book(String name, String author, double price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", "+((isBorrowed==true)?"已借出":"未借出") +
'}';
}
}
2.operation包
代码如下(示例):
-
package operation;
-
import book.BookList;
-
public interface IOperation {
-
void work(BookList bookList);//抽象方法
- }
实现新增图书:
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation {
@Override
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("请输入图书的价格:");
double price = sc.nextDouble();
sc.nextLine();//使用nextLine()接收上面键盘输入的'\n'
System.out.println("请输入图书的类型:");
String type = sc.nextLine();
Book book = new Book(name,author,price,type);
int currentSize = bookList.getUsedSize();
bookList.setBooks(currentSize,book);
bookList.setUsedSize(currentSize+1);
System.out.println("《"+name+"》"+"已新增!");
}
}
BorrowOperation类
实现借阅图书:
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书!");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要借阅书的名字:");
String name = sc.nextLine();
int currentSize = bookList.getUsedSize();
int i=0;
for(i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
book.setBorrowed(true);
System.out.println("《"+name+"》借阅成功,祝畅游阅读世界!");
return;
}
}
if(i>=currentSize){
System.out.println("抱歉,本书架中没有此书,我们会尽快联系图书管理员新增此书!");
}
}
}
DelOperation类
实现删除图书:
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("删除图书!");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要删除书的名字:");
String name = sc.nextLine();
int i=0;
int index = 0;
int currentSize = bookList.getUsedSize();
for (i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
index = i;
break;
}
}
if(i>=currentSize){
System.out.println("没有你想要删除的这本书");
return;
}
for(i=index;i<currentSize-1;i++){
Book book = bookList.getBook(i+1);
bookList.setBooks(i,book);
}
bookList.setBooks(currentSize,null);
bookList.setUsedSize(currentSize-1);
System.out.println("《"+name+"》"+"已删除");
}
}
DisplayOperation类
实现显示图书:
package operation;
import book.Book;
import book.BookList;
public class DisplayOperation 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.getBook(i);
System.out.println(book);
}
}
}
ExitOperation类
实现退出系统:
package operation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);
}
}
FindOperation类
实现查找图书:
package operation;
import book.Book;
import book.BookList;
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();
int currentSize = bookList.getUsedSize();
int i=0;
for(i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
System.out.println("找到这本书了!");
System.out.println(book);
return;//找到这本书,查找程序提前结束
}
}
if(i>=currentSize) {
//说明没有找到
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("归还图书!");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要归还书的名字:");
String name = sc.nextLine();
int currentSize = bookList.getUsedSize();
int i=0;
for(i=0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
book.setBorrowed(false);
System.out.println("《"+name+"》"+"归还成功,祝每天都有好心情");
return;
}
}
}
}
user包
前文提到,用户类型分为管理员和普通用户两种,这两种类型都有相同的name属性,都要有一个功能菜单,功能菜单中有相同的操作方法也有各自才有的特殊操作方法,既然重合度这么高,但又有区别,好喔,这里需要用一个父类更加方便。
User类就是user这个包中的父类,AdminUser和NormalUser是子类。
继承的作用:
通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量
允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类
1.user类
package user;
import book.BookList;
import operation.IOperation;
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);
}
}
2.AdminUser类
package user;
import book.BookList;
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 DelOperation(),
new DisplayOperation()
};
}
public int menu(){
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 sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
3.NormaIUser类
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(),
new DisplayOperation()
};
}
public int menu(){
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 sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
Main类
Main类用于将这些功能属性整合起来,也是整个小项目的执行入口,
用户登录之后,可选择自己的身份——(管理员/普通用户)
菜单用循环实现多次打印
login()函数将AdminUser或者NormalUser向上转型为父类User
在main()方法中,用一个父类user调用menu()方法,根据user是管理员还是普通用户,向下转型调用各自不同的菜单
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
System.out.println("请输入用户名:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
System.out.println("请选择用户身份:1.管理员 2.普通用户");
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 = login();
int temp = 0;
do{
int choice = user.menu();//动态绑定
user.doOperation(choice,bookList);
temp = choice;
}while (temp!=0);
}
}
三、效果展示
psss:因操作过长,长截图无法截全,为了保证展示完整性,特意用几张小图截的,如果给您带来阅读不适,请见谅~
示例一
示例二
总结
学习一个知识可能很简单,但将学到的知识进行整合应用绝对比学那个知识要难,但如果相信自己可以做到,那绝对可以学下去,保持良好的心态是提高学习效率的利器。
咱们一起加油💪💪💪