赞
踩
有了前几篇文章关于封装、继承、多态、接口等的介绍,想必各位读者对java面向对象的思想有了一定的认识。接下来这篇文章就让我们趁热打铁,利用所学知识做一个小项目图书管理系统吧
目录
图书管理系统,顾名思义,起码要先有书被管理。因此我们应当先定义好于书相关的类。
先定义一下单本书的特性,一本书肯定会包含书名、作者、价格等信息,我们可以建立一个book类来描述每本书的特性:
- package book;
-
- public class Book {
- private String name;
- private String author;
- private int price;
- private boolean IsBorrowed;
-
- public Book(String name, String author, int price) {
- this.name = name;
- this.author = author;
- this.price = price;
- }
-
- public String getName() {
- return name;
- }
-
- public boolean isBorrowed() {
- return IsBorrowed;
- }
-
- public void setBorrowed(boolean borrowed) {
- this.IsBorrowed = borrowed;
- }
-
- @Override
- public String toString() {
- return "name='" + name + '\'' +
- ", author='" + author + '\'' +
- ", price=" + price +
- (IsBorrowed?", 已借出":", 未借出");
- }
- }

既然要做管理系统,那就不可能只处理一本书了,我们需要管理的是许多本特性各异的书。那么如何来存储这些信息呢?我们可以建立一个列表类来记录我们的图书信息:
- package book;
-
- public class BookList {
- private Book[] books=new Book[20];
- private int userSize;
- public BookList() {
- books[0]=new Book("海贼王","尾田荣一郎",17);
- books[1]=new Book("火影忍者","尾田荣一郎",19);
- books[2]=new Book("红楼梦","曹雪芹",45);
- books[3]=new Book("西游记","吴承恩",40);
- books[4]=new Book("三国演义","罗贯中",37);
- this.userSize=5;
- }
-
- public int getUserSize() {
- return userSize;
- }
-
- public void setUserSize(int userSize) {
- this.userSize = userSize;
- }
-
- public boolean isFull(){
- if(this.userSize==books.length){
- return true;
- }else{
- return false;
- }
- }
-
- public Book getBook(int pos){
- return books[pos];
- }
-
- public void setBook(int pos,Book book){
- books[pos]=book;
- }
- }

已经存储好书本信息后, 我们就要明确我们究竟要实现哪些功能?
具体实现就由小编来带大家一一介绍吧
为了功能实现的方便,我们通过接口来实现各个功能,先定义一个接口IOperation:
- public interface IOperation {
- void work(BookList bookList);
- }
接着就可以通过重写接口中的work方法来实现各个的功能了,并且由于多态性,我们可以将各种不同功能的接口按顺序放在一个数组里,通过数组访问来实现不同功能,大大提高了效率。
如果你不知道多态是什么的话,可以看看小编之前的文章面向对象三大特性之多态 哦
- public class FindOperatino implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("查找图书………………");
- System.out.println("请输入你要查找的书名:");
- Scanner in =new Scanner(System.in);
- String bookname=in.nextLine();
- int Size= bookList.getUserSize();
-
- for(int i=0;i<Size;i++){
- Book book=bookList.getBook(i);
- if(book.getName().equals(bookname)){
- System.out.println("找到了这本书:");
- System.out.println(book);
- return;
- }
- }
- System.out.println("没有你要找的书!");
- }
- }

- public class BorrowedOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("借阅图书………………");
- System.out.println("请输入你要借阅的书名:");
- Scanner in =new Scanner(System.in);
- String bookname=in.nextLine();
- int Size= bookList.getUserSize();
-
- for(int i=0;i<Size;i++){
- Book book=bookList.getBook(i);
- if(book.getName().equals(bookname)){
- System.out.println("借阅成功!");
- book.setBorrowed(true);
- //System.out.println(book);
- return;
- }
- }
- System.out.println("没有你要借阅的书!");
- }
- }

- public class ReturnOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("归还图书………………");
- System.out.println("请输入你要归还的图书:");
- Scanner in =new Scanner(System.in);
- String bookname=in.nextLine();
- int Size= bookList.getUserSize();
-
- for(int i=0;i<Size;i++){
- Book book=bookList.getBook(i);
- if(book.getName().equals(bookname)&&book.isBorrowed()){
- System.out.println("归还成功!");
- book.setBorrowed(false);
- //System.out.println(book);
- return;
- }
- }
- System.out.println("没有你要归还的书!");
- }
- }

- public class AddOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("新增图书………………");
- Scanner in=new Scanner(System.in);
- if(bookList.isFull()){
- System.out.println("书架满了,无法新增图书了!");
- return;
- }
- System.out.println("请输入图书的名称:");
- String name=in.nextLine();
- System.out.println("请输入图书的作者:");
- String author=in.nextLine();
- System.out.println("请输入图书的价格:");
- int price=in.nextInt();
-
- Book book=new Book(name,author,price);
- int pos= bookList.getUserSize();
-
- bookList.setBook(pos,book);
-
- bookList.setUserSize(pos+1);
-
- }
- }

- public class DeleteOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("删除图书………………");
- System.out.println("请输入你要删除的图书:");
- Scanner in =new Scanner(System.in);
- String bookname=in.nextLine();
- int Size= bookList.getUserSize();
-
- for(int i=0;i<Size;i++){
- Book book=bookList.getBook(i);
- if(book.getName().equals(bookname)){
- for(int j=i;j<Size;j++){
- Book bookl=bookList.getBook(j+1);
- bookList.setBook(j,bookl);
- }
- bookList.setUserSize(Size-1);
- System.out.println("删除成功!");
- //System.out.println(book);
- return;
- }
- }
- System.out.println("没有你要删除的书!");
- }
- }

- public class ShowOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("显示图书………………");
- int Size= bookList.getUserSize();
-
- for(int i=0;i<Size;i++){
- Book book=bookList.getBook(i);
- System.out.println(book);
- }
- }
- }
- public class ExitOperation implements IOperation {
- @Override
- public void work(Bookshelf bookshelf) {
- System.out.println("退出图书...");
- int sz=bookshelf.getBooknum();
-
- // 遍历置为 null
- for (int i = 0; i <sz ; i++) {
- bookshelf.setBooks(i,null);
- }
-
-
- System.out.println("图书系统正在退出中...");
-
- // 系统退出
- System.exit(-1);
- }
- }

这时我们就可以用如下方法来整合了:
- super(name);
- this.iOperations=new IOperation[]{
- new ExitOperation(),
- new FindOperatino(),
- new AddOperation(),
- new DeleteOperation(),
- new ShowOperation()
- };
这样就可以通过数组的不同下标来实现功能了,会变得方便许多。
作为一个图书管理系统,我们应当设置不同的用户特性,如增删书籍应该是管理员才有的权限,借阅书籍是普通用户需要实现的功能,但同时他们又有许多的共性,如姓名等信息,这时我们就可以利用继承的思想先定义一个父类User来记录用户的共性:
- abstract public class User {
- protected String name;
- protected IOperation[] iOperations;
- public User(String name) {
- this.name = name;
- }
-
- public void doIoperation(int choice, BookList bookList){
- this.iOperations[choice].work(bookList);
- }
-
- public abstract int menu();
- }
接着我们就可以写出各个具体的子类用户了
管理员用户:
- public class AdminUser extends User {
- public AdminUser(String name) {
-
- super(name);
- this.iOperations=new IOperation[]{
- new ExitOperation(),
- new FindOperatino(),
- new AddOperation(),
- new DeleteOperation(),
- new ShowOperation()
- };
- }
- public int menu(){
- System.out.println("*********管理员菜单*********");
- System.out.println("1.查找图书");
- System.out.println("2.新增图书");
- System.out.println("3.删除图书");
- System.out.println("4.显示图书");
- System.out.println("0.退出系统");
- System.out.println("**************************");
- System.out.println("请输入你的操作:");
- Scanner in=new Scanner(System.in);
- int choice=in.nextInt();
- return choice;
- }
- }

普通用户:
- public class NormalUser extends User{
- public NormalUser(String name) {
- super(name);
- this.iOperations=new IOperation[]{
- new ExitOperation(),
- new FindOperatino(),
- new BorrowedOperation(),
- 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 in=new Scanner(System.in);
- int choice=in.nextInt();
- return choice;
- }
- }

- public class Main {
- public static User login(){
- Scanner in =new Scanner(System.in);
- System.out.println("欢迎来到图书管理系统");
- System.out.println("请输入你的名字:");
- String name=in.nextLine();
- System.out.println("请输入你的身份:");
- String identity=in.nextLine();
- if(identity.equals("管理员")){
- AdminUser adminUser=new AdminUser(name);
- return adminUser;
- }else{
- NormalUser normalUser=new NormalUser(name);
- return normalUser;
- }
- }
-
- public static void main(String[] args) {
- BookList bookList=new BookList();
- User user=login();
- while(true){
- int choice=user.menu();
- user.doIoperation(choice,bookList);
- }
- }
- }

通过主函数逻辑来整合我们写过的各个模块,从而实现最终功能。
从这个项目中我们可以看到,在父类User中实例化了iOperations对象,建立了一个以IOperation为元素的数组,接着在子类中按顺序建立创建好的功能接口,从而可以直接用下标来访问相应接口,这利用继承、多态、接口等思想,可谓是对面向对象思想的深度诠释。
那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。