图书管理系统在C、C++、Java学习中我们都会进行练习来串联我们学习的一些知识以及使用场景,这里跟着我我带大家敲Java版本!
这是我们最终实现的图书管理系统,下面我们慢慢来
Java是面向对象的语言特点是:封装、继承、多态。我们在实现每一个功能的时候需要注意这些才能体现出Java语言的风格。
我们先把需要的操作先罗列出来然后再一点点实现这个图书管理系统,一个图书管理一定要有书的属性、书架、需要的一些操作、用户界面以及串联其他们的操作
我们把这三个大方向做包,分别在三个包下做这些内容
我们先了解下toString方法:
这里的book是一个类的对象
如果我们用System.out.println(book)会得到什么呢?会不会想的是对应的地址哈希地址但是为什么呢?其实每一个类都会有对应的toString方法在Object这个父类当中如果传入的是空内容返回的是null否则返回
Main$Student@1b6d3586一类的东西,如果我们重写这个方法就可以直System.out.println(book)来得出书籍的所有属性!
在这个类里我们参加实例成员书名,作者,价格,类型,借阅情况。(这里的成员我们用private修饰体现封装)然后留出对应的访问方法来访问这些内容
成员
private String name;
private String author;
private int price;
private boolean isBorrowed;
private String type;
对应的访问方法
并且在构造方法中就加入这些属性来构架出这个书。
重写toString方法访书籍的属性
这样我们写完Book这个类
public class Book {
private String name;
private String author;
private int price;
private boolean isBorrowed;
private String type;
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", isBorrowed=" +
((isBorrowed==true)?"已被借阅":"未被借阅" )+
", type='" + type + '\'' +
'}';
}
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 boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
暑假中我们放一个Book类型的数组存放书籍,用usedSize来记录书籍的本数也都是用private修表现封装,留出对应的访问方法。这里我们先初始化三本书
books[0]=new Book("西游记", "吴承恩", 111, "名著");
books[1]=new Book("三国演义", "罗贯中", 222, "名著");
books[2]=new Book("红楼梦", "曹雪芹", 333, "名著");
这样我们的BookList类也写完了,这里还是很容易实现的
public class BookList {
Book books[]=new Book[10];
private int usedSize;
public BookList() {
books[0]=new Book("西游记", "吴承恩", 111, "名著");
books[1]=new Book("三国演义", "罗贯中", 222, "名著");
books[2]=new Book("红楼梦", "曹雪芹", 333, "名著");
usedSize=3;
}
public Book getBooks(int pos) {
return books[pos];
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public void setBooks(int pos,Book book) {
this.books[pos] = book;
}
}
2.1 opperation包下的类
因为每一个操作都需要访问书架BookList所以我们留一个IOperation的接口里面留一个
work(BookList bookList);方法让下面的操作访问书架
2.1.1 AddOperation(添加操作)
这里新增图书并放在书架的顶部位置
getUsedSize在BookList类中得到书的本数并在对应的位置放上添加的数再让书的本书+1
public class AddOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("添加图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入添加书籍的名称》");
String name=scanner.nextLine();
System.out.println("请输入作者的姓名》");
String auther=scanner.nextLine();
System.out.println("请输入书籍的价格》");
int price=scanner.nextInt();
System.out.println("请输入书籍的类型》");
scanner.nextLine();
String type=scanner.nextLine();
Book book=new Book(name,auther,price,type);
bookList.setBooks(bookList.getUsedSize(),book);
System.out.println("添加成功!");
bookList.setUsedSize(bookList.getUsedSize()+1);
}
}
2.1.2 DeltOperation(删除操作)
遍历寻找要找的书籍并把每一个书籍向前移动,到了链表就可以更加快捷
需要注意的是名字的比较要用equals方法 A.equals(B)如果使用A==B比较的是它们对应的地址
public class DeltOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
System.out.println("请输入你想要删除书籍的名称》");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int size=bookList.getUsedSize();
boolean key=false;
for (int i = 0; i < size-1; i++) {
if (bookList.getBooks(i).getName().equals(name)||key==true) {
Book book=bookList.getBooks(i+1);
bookList.setBooks(i,book);
}
}
bookList.setUsedSize(bookList.getUsedSize()-1);
System.out.println("删除成功!");
}
}
2.1.3 DisPlayOperation(书籍展示)
这里的就用到了Book类中对Objecrt的toString方法重写
这里肯定会有人疑问为什么不直接用Systeam.out.println(books[i])来输出书籍的信息呢?
这里的books是private修饰的我们做了封装处理,
public class DisPlayOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("显示图书");
int size=bookList.getUsedSize();
for (int i = 0; i < size; i++) {
System.out.println(bookList.getBooks(i));
}
}
}
2.1.4 FindOperation(查找操作)
这里的寻找对应名字也要用equals方法
public class FindOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
System.out.println("请输入想要查找的图书》");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int size= bookList.getUsedSize();
for (int i = 0; i < size; i++) {
if (bookList.getBooks(i).getName().equals(name)) {
System.out.println(bookList.getBooks(i));
return;
}
}
System.out.println("未找到你想要寻找的书");
}
}
2.1.5 BorrowOperation(借阅操作)
这里遍历一遍再将对应位置的借阅情况更改下就好了
public class BorrowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
System.out.println("请输入你要借阅书籍的名称》");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
int size=bookList.getUsedSize();
for (int i = 0; i < size; i++) {
if(bookList.getBooks(i).getName().equals(name)) {
bookList.getBooks(i).setBorrowed(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("未找到相关书籍!");
}
}
2.1.6 ReturnOperation (归还操作)
public class ReturnOperaion implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
System.out.println("请输入你要归还图书的名称》");
Scanner scanner=new Scanner(System.in);
String name= scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
if(bookList.getBooks(i).getName().equals(name)) {
bookList.getBooks(i).setBorrowed(true);
System.out.println("归还成功!期待下次借阅!");
return;
}
}
System.out.println("未找到此书籍!归还失败!请到前台咨询此服务!");
}
}
2.1.7 ReturnOperation (退出系统)
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出程序");
exit(1);
}
}
这个类是用户和管理者的父类需要被继承,这样设计的一方面原因是面向对象语言的特点,还有一方面是这样实现可以简略代码的重复便于理解
这个类中我们要定义name来存放用户和管理者的名字,menu菜单功能在这个里面不需要实现就使用抽象类abstract修饰再对应的子类实现对应的菜单,操作需要按照菜单进行操作所以我们需要一个IOperation这个类的操作数组有人会异或为什么是IOpernation类型呢?这只是一个接口为什么要用它,这里其实发生了向上转型,这个数组将存放各种书架操作,而这些操作是需要IOpernation接口,全部展开就是IOpernation iOpernation=new AddOpernation......这些操作,可以理解成父类继承的向上转型然后再运行时发生动态绑定将对应的menu方法和操作方法替换
里面写一个doOperation实现功能方法
this.iOperations[choice].work(bookList)里this就是本类的iOpernations操作数组的第choice个操作对应的work实现方法。
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);
}
}
重写对应的menu和对应的操作数组
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
this.iOperations=new IOperation[] {
new ExitOperation(),
new DisPlayOperation(),
new FindOperation(),
new AddOperation(),
new DeltOperation()
};
}
@Override
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 scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
也是重写对应的menu以及操作方法数组
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.iOperations=new IOperation[] {
new ExitOperation(),
new DisPlayOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperaion()
};
}
@Override
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 scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
下面是实现这些所有功能的类
这里我们需要先写一个login里面写登录的基本语言以及选择管理员登录还是用户登录
public static User login() {
System.out.println("欢迎来到图书系统!");
System.out.println("请输入你的昵称》");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
System.out.println("1.用户登录 2.管理员登录");
int user=scanner.nextInt();
if(user==1){
return new NormalUser(name);
}else {
return new AdminUser(name);
}
}
再使用main来串联起这些所有功能,使对应的用户功能实现在对应的内部实现
以上就是图书管理系统的内容了,完整代码放在22_5_18_book/src · 404NOt/Java - 码云 - 开源中国 (gitee.com)
我的总结可能不是十分到位,也可能会有专业上的疏忽欢迎在评论区留言!