行业知识
java项目——图书管理系统
文章目录
- 前言
- 图书管理系统
- 整体框架:
- book包
- user包
- Main包:
- iooperation包
- 总结:
前言
针对这些天所学的javaSE的知识,用一个小项目来实践一下。
图书管理系统
整体框架:
采取面向对象的思想实现此项目,首先分析出此项目中涉及的对象有哪些:
有用户,书籍,业务操作!
用户又分为普通用户与管理员。
书籍相关的对象又分为书籍与书架。
操作又分为七种不同的功能操作。
book包
有关书的类均创建在book包中,有书籍与书架两个类:
书籍Book类:
书籍类中有4种属性,均设置成private修饰,封装起来,用getter和setter方法进行获取与修改!
package book;public class Book { private String name; //书籍的名称 private double price; //书籍的价格 private String author; //书籍的作者 private boolean state; //书籍当前的状态 -是否可借出 public Book(String name, double price, String author) { this.name = name; this.price = price; this.author = author; this.state = true; //默认均为true,表示可借出 } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", price=" + price + ", author='" + author + '\'' + ((state == true)?",状态:未借出":",状态:已借出")+ '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public boolean getState() { return state; } public void setState(boolean state) { this.state = state; }}书架类BookList:
在书架类中,有一个Book类型的数组,用于表示书架,书架的空间为5
属性number表示当前书架上书的数目。
用getter和setter来获取与设置number的信息。
package book;public class BookList { //书架的本质应该是一个数组 public Book [] books = new Book[5]; private int number = 3; //初始化放入三本书 //通过构造方法,初始化放入三本书 public BookList() { this.books[0] = new Book("红楼梦",10.5,"曹雪芹"); this.books[1] = new Book("西游记",15,"吴承恩"); this.books[2] = new Book("三国演义",15.2,"罗贯中"); } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; }}user包
user包中有user抽象类,有普通用户类NormalUser,有管理员类AdminUser.
user抽象类:
user抽象类中有属性,用户的名字
有接口数组:即可以用于存放实现菜单中功能的业务实现类
有一个menu抽象方法,对于管理员与普通用户进行不同的重写。
选择操作的抽象方法,可以参考普通用户类与管理员类AdminUser理解!
package user;import book.BookList;import iooperation.IOperation;public abstract class User { protected String name; //用户的名字 ! IOperation [] iOperations; //操作接口数组 //定义一个menu抽象方法 public abstract int menu(); //菜单的抽象方法 public User(String name) { this.name = name; } public abstract void dooperation(int choice, BookList bookList); //选择操作方法!}普通用户类NormalUser:
在本类中,构造方法为iOperation数组进行了初始化,针对呈现给普通用户的菜单,赋值了对应的业务实现类对象。
对于dooperation方法,在接收了用户输入的choice值后,便针对选定的书架,iOperations数组中相应的实现类对象!
menu方法如代码中所示:
package user;import book.BookList;import iooperation.*;import java.util.Scanner;public class NormalUser extends User { public NormalUser(String name) { super(name); //创建一个接口数组: this.iOperations = new IOperation[]{ new SearchOperation(), //搜寻功能的实现类——多写一行是为了菜单中选项与数组下标一致, //便于调用相应的实现类对象。 new SearchOperation(), //搜寻功能的实现类对象 new BorrowOperation(), //借阅功能的实现类对象 new ReturnOperation(), //归还功能的实现类对象 new ExitOperation() //退出功能的实现类对象 }; } public void dooperation(int choice, BookList bookList){ //根据choice,调用相应的业务类对象 this.iOperations[choice].work(bookList); } public int menu(){ System.out.println("*****************************"); System.out.println("******普通用户菜单*******"); System.out.println("******1. 查找图书**********"); System.out.println("******2. 借阅图书***********"); System.out.println("******3. 归还图书**********"); System.out.println("******4. 退出系统**********"); System.out.println("*****************************"); System.out.println("请选择你要执行的操作!"); //用于接收从键盘上输入的数字,并返回! return new Scanner(System.in).nextInt(); }}管理员类AdminUser:
本类中亦根据菜单中功能,为iOperations进行了相应的初始化。
对于dooperation的实现与普通用户类相同,均用于接收相应的choice值,而调用
iOperations中相应的实现类对象!
package user;import book.BookList;import iooperation.*;import java.util.Scanner;public class AdminUser extends User { public AdminUser(String name) { super(name); this.iOperations = new IOperation[]{ new SearchOperation(), //用于使数组的下标与菜单选项值一致 new SearchOperation(), //搜寻功能实现类对象 new AddOpearation(), //新增图书功能实现类对象 new DeleteOperation(), //删除图书功能实现类对象 new ShowOperation(), //展示图书功能实现类对象 new ExitOperation() //退出系统功能实现类对象 }; } @Override public void dooperation(int choice, BookList bookList) { this.iOperations[choice].work(bookList); } public int menu() { System.out.println("**欢迎" + super.name + "****"); System.out.println("******管理员菜单*******"); System.out.println("*****1. 查找图书**********"); System.out.println("*****2. 新增图书************"); System.out.println("*****3. 删除图书***********"); System.out.println("*****4. 显示图书***********"); System.out.println("*****5. 退出系统***********"); System.out.println("请选择你要执行的操作!"); return new Scanner(System.in).nextInt(); }}Main包:
Main包中用于放置测试类:
下面中代码的内容体现了本项目大体框架的实现:
首先:针对系统的登录,创建一个静态方法。
其次:在main方法中,先实例一个书架对象,
然后新建一个User 引用 接收从登录方法中传来的用户对象。
然后用choice局部变量接收用户针对菜单 选择的功能选项。
最后,调用dooperation方法,传入实参bookList1与choice,实现对应的功能!
package Main;import book.BookList;import user.AdminUser;import user.NormalUser;import user.User;import java.util.Scanner;public class Test { public static User Login() { System.out.println("请输入你的名字:"); String name = new Scanner(System.in).next(); System.out.println("请输入你的身份:1. 管理员 2. 普通用户"); int choice = new Scanner(System.in).nextInt(); if (choice == 1) { return new AdminUser(name); } else { return new NormalUser(name); } } public static void main(String[] args) { //先创建一个书架 BookList bookList1 = new BookList(); //接收登录后返回的对象值: while (true) { User user = Login(); int choice = user.menu(); //调用相应的业务类对象 user.dooperation(choice, bookList1); } }}iooperation包
本包是业务功能实现包,具有一个操作接口与七个业务实现类。
IOperation接口:
本接口中只有一个抽象方法work,参数为书架对象,其余七个实现类均实现本接口。
package iooperation;import book.BookList;public interface IOperation { void work(BookList bookList);}AddOperation类:
此类实现新增图书功能:
package iooperation;import book.Book;import book.BookList;import java.util.Scanner;public class AddOpearation implements IOperation { public void work(BookList bookList){ System.out.println("请输入您要添加的图书的信息"); System.out.println("请输入书籍的名字:"); String name = new Scanner(System.in).next(); //先判断书架上是否已经有此书籍,如果有则拒绝添加!!! for (int i = 0; iBorrowOperation类:
本类用于实现借阅功能:
package iooperation;import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation { public void work(BookList bookList){ //借阅图书 System.out.println("请输入你要借阅的图书名称:"); String name = new Scanner(System.in).next(); for (int i = 0; iDeleteOperation类:
本类用于实现删除图书功能!
package iooperation;import book.BookList;import java.util.Scanner;public class DeleteOperation implements IOperation { //删除图书 //在顺序表中删除一条数据,在被删除的数据的位置之后的所有数据往后移动一位!!! public void work(BookList bookList){ System.out.println("请输入你要删除的图书名字:"); String name = new Scanner(System.in).next(); //先查找这本书,看其是否存在在书架上! for (int i = 0; iExitOperation类:
本类用于实现退出系统功能!
package iooperation;import book.BookList;public class ExitOperation implements IOperation { public void work(BookList bookList){ //退出系统:status==0!!! System.exit(0); }}ReturnOperation 类:
本类用于实现归还图书功能!
package iooperation;import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOperation { public void work(BookList bookList) { //归还图书 //首先搜索的书籍,判断要归还的书籍是否有存档! System.out.println("请输入你要归还的图书名称:"); String name = new Scanner(System.in).next(); for (int i = 0; iSearchOperation类:
本类用于实现查找图书功能!
package iooperation;import book.BookList;import java.util.Scanner;public class SearchOperation implements IOperation { //进行查找 public void work(BookList bookList){ System.out.println("请输入您要查找的图书名称:"); String name = new Scanner(System.in).next(); for (int i = 0; iShowOperation类:
本类用于展示书架上所有书籍的功能!
package iooperation;import book.BookList;public class ShowOperation implements IOperation { //显示书架上的所有图书: public void work(BookList bookList){ // 将所有的书籍均遍历出来 for (int i = 0; i总结:
在最开始写此项目时,我是创建了两个类(普通用户类菜单相关一个,管理员相关一个)根据接受到的choice值,用switch语句来调用相应的实现类对象,
但是这并不是面向对象的思想,是面向过程的思想,
应该尽量的将属于一个对象的东西封装到一个类中去,比如专属于普通用户的菜单,专属于普通用户的业务实现类对象数组,用户对象可以调用自己的方法实现功能(如dooperation方法)等。
在实现方法时,尽量的不要超出其应该的功能范围,比如在实现Login方法时,之前便添加了将登录后返回值加工的代码,这不利于代码的可读性与结构的梳理,应该遵循高内聚,低耦合的思想!
下一篇:怎么样样制作网站?