设计背景
图书馆 是每个大学最重要的东西 所以要有一个图书管理系统起到了很大的作用 本次将使用Java语言的多态,继承,封装,接口等知识点,综合性设计一个简易的图书管理系统。
设计逻辑
1.首先我们要区分出两种权限管理 一个是管理员 一个是普通用户,不同用户访问的东西都不同,可以借用继承和多态来实现。
2.还有我们图书管理系统有很多操作 需要把它们封装起来,单独设计成一个类可以用接口来实现,
3.我们需要一个书的类 将书的相关属性进行封装,同时需要一个书架类来存放书 利用数组把书存起来。
各个模块的代码演示
Book类的实现
我们的书籍的属性有书名、作者、价格和类型以及是否被借出。 我们要具有封装性。将属性用private修饰 提供get和set方法,构造方法 和toString的重写
代码如下:
package book;
public class Book {
private String name;
private String author;//作者
private int price; //价格
private String type;//类型
private boolean isBoorrowed;//是否被借出
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
//不传boolean 默认没借出
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public int getPrice() {
return price;
}
public String getType() {
return type;
}
public boolean isBoorrowed() {
return isBoorrowed;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(int price) {
this.price = price;
}
public void setType(String type) {
this.type = type;
}
public void setBoorrowed(boolean boorrowed) {
isBoorrowed = boorrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBoorrowed=" + isBoorrowed +
'}';
}
}
BookList类
书架要放几本书 把所有书的信息都放在里面 提供get和set方法 建立一个books数组来存放 设定一个usedsize来记录存放了多少本书
并提供构造方法 代码如下:
package book;
//书架上放书
public class BookList {
private Book[] books;
private int usedsize; //用来记录
public BookList(){
this.books = new Book[10];
this.books[0]=new Book("三国演义","罗贯中",10,"小说");
this.books[1]=new Book("西游记","吴承恩",9,"小说");
this.books[2]=new Book("红楼梦","曹雪芹",12,"小说");
this.usedsize = 3;
}
public int getUsedsize() {
return usedsize;
}
public void setUsedsize(int usedsize) {
this.usedsize = usedsize;
}
public Book getBook(int pos){
return books[pos];
}
}
用户的实现
先定义一个父类User 在里面定义一个菜单方法 要用一个接口去定义一个数组用来接收每类用户实现的操作 menu方法不需要具体实现定义一个抽象类就行 用来普通用户和管理员的继承 去重写menu方法 所以父类不需要具体实现 因为我们要定义一个接口去实现各种操作 然后让各种操作去实现该接口 用接口去new一个数组是为了区分普通用户和管理员的操作
先写一个所有用户的父类(抽象类) 再让普通用户和管理员去继承该父类 这里就用到了继承 。 具体代码如下
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);
}
}
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 DelOperation(),
new ShowOperation()
};
}
public int menu(){
System.out.println("*****管理员菜单*****");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("1.显示图书");
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.ioPerations = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
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;
}
}
操作用接口来实现
我们需要执行一些查看图书 添加图书 删除图书 等操作 而且 管理员和普通用户的操作不全一样,为了规范这些操作 我们需要定义一个IOperation接口 里面放一个work方法 这个work 方法为了各种操作进行重写 具体代码如下:
package operation;
import book.BookList;
public interface IOPeration {
void work(BookList bookList);
}
下面就是一些相关操作的实现 这些操作的实现都要借助上面的IOperation接口 下面让我们来看代码
添加图书
怎么新增图书呢是不是要获得你新增图书的所有信息 在原有的基础上 加一本新的书 也就是在书架上加一本书
代码如下
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("新增图书!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要新增的图书的书名:");
String name = scanner.nextLine();
System.out.println("请输入你要新增图书的作者:");
String author = scanner.nextLine();
System.out.println("请输入你要新增图书的价格:");
int price = scanner.nextInt();
System.out.println("请输入你要新增图书的类型:");
String type = scanner.next();
//构造一个数的对象
Book book = new Book(name,author,price,type);
int currentSize = bookList.getUsedsize();
for (int i = 0; i <currentSize; i++) {
Book tmp = bookList.getBook(i);
if (tmp.getName().equals(name)){
System.out.println("已经存在这本书,不能重复添加!");
return;
}
}
//走到这里说明没有这本书 可以开始新增
bookList.setBook(book,currentSize);
bookList.setUsedsize(currentSize+1);
}
}
还要删除图书的操作 删除操作可能理解起来复杂一些 涉及到数据结构的一些思想 就是删了之后要移动和置空 覆盖掉不要的数据
代码如下:
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("删除图书!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要删除的图书的书名:");
String name = scanner.nextLine();
int currentSize = bookList.getUsedsize();
int index = -1;
int i = 0;
for (i=0;i<currentSize;i++){
Book tmp = bookList.getBook(i);
if (tmp.getName().equals(name)){
index = i;
break;
}
}
if (i>=currentSize){
System.out.println("没有你要删除的图书!");
return;
}
//走到这里说明就可以删除了
for (int j = index;j<currentSize;j++){
Book book = bookList.getBook(j+1);
bookList.setBook(book,j);
}
bookList.setBook(null,currentSize-1);
bookList.setUsedsize(currentSize-1);
System.out.println("删除成功!");
}
}
显示图书操作:代码如下
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.getBook(i);
System.out.println(book);
}
}
}
借阅图书代码实现:
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("借阅图书!");
System.out.println("请写出你要借阅的图书的书名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookList.getUsedsize();
for (int i = 0; i <currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)){
//说明有这本书
book.setBoorrowed(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("没有你要借阅的书:"+name);
}
}
有借阅就有归还 相关代码实现:
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 name = scanner.nextLine();
int currentSize = bookList.getUsedsize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)){
//有这本书的
book.setBoorrowed(false);
System.out.println("归还成功!");
return;
}
}
System.out.println("没有你要归还的图书:"+name);
}
}
查看图书操作:代码如下
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("查找图书!");
System.out.println("请写出你要查找的图书的书名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookList.getUsedsize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
System.out.println("存在这本书,信息如下:");
System.out.println(book);
}
}
}
}
最后一个就是退出程序Exit 代码实现:
package operation;
import book.BookList;
public class ExitOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);
}
}
最后想要把程序结合起来运行Main类 必不可少 怎么把它们串在一起呢
首先我们定义一个login方法 让他去找到我们要选择的对象 是普通用户还是管理员 相当于选择我们的身份 返回值用我们之前写的父类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 scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入你的身份,1:管理员 2: 普通用户->");
int choice = scanner.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(); //调用的对象不一样 打印的菜单也不一样
while(true) {
int choice = user.menu();
//根据菜单返回的数值执行对应的操作
user.doOperation(choice, bookList);
}
}
}
这就是最简单的图书管理源码 在我们学习了数据库之后也可以连接数据库 进一步完善我们的图书管理系统 通过数据结构相关知识 可以加强我们业务的实现更加丰富 逻辑更加清晰。
大家有喜欢的可以三连支持 谢谢大家!