一、设计思路
Java是一门面向对象的语言,因此,要实现图书管理系统,我们要思考其中的对象是谁?有几个对象?
先不看操作,只看用户和书的话,有四个对象(普通用户,管理员,书和书架) ,首先,我们用这四个对象先把基本界面写出来,对书架的操作(增删查改)是最后完成的。
二、界面实现
1.用户的实现
由于用户分为普通用户和管理员,我们首先创建一个包命名为user,我们知道,图书管理员与普通用户都可以进行书籍的查阅等功能,我们可以把他们的共性抽取出来打包成一个类User,在创建管理员类和普通用户类继承User类
package user;
//用户分为普通用户和管理员用户,他们又相同的地方,因此我们创建一个user类
//将他们的共性抽取出来,在通过继承来增加不同用户特有的属性和方法
public abstract class User {
//使用者名字不使用private修饰,因为这个类一定会被继承
protected String name;
//这个构造方法是为了在子类当中初始化父类成员
public User(String name) {
this.name = name;
}
public abstract void menu();
}
package user;
import java.util.Scanner;
//管理员用户
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
}
//管理员菜单
public void menu(){
System.out.println("欢迎"+this.name+"来到图书系统");
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("***************************");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你的操作:");
int choice= scanner.nextInt();
}
}
package user;
import java.util.Scanner;
//普通用户
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
}
//普通用户菜单
public void menu(){
System.out.println("欢迎"+this.name+"来到图书系统");
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("*****************************");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你的操作:");
int choice= scanner.nextInt();
}
}
2.书的实现
同样,书分为书和书架,我们创建一个book包,然后在这个包里创建Book类和BookList类。
package book;
//书,对象之一
public class Book {
private String name;//书名
private String author;//作者
private int price;//价格
private String type;//书的类型
private boolean isBorrowed;//是否借出
//共用接口用于访问private修饰的属性,体现封装性
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 String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
//构造方法
//在构造方法中可以不对isBorrowed赋值,因为它的默认值为false
//表示未借出,符合一本书最初的状态
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
//重写toString方法,打印书籍内容
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
package book;
//书架,对象之一,用于存放书籍
//书放到书架上,怎么组织,放若干本书?——使用数组
public class BookList {
//最多存放10本书的书架
private Book[] books=new Book[10];
//有效的数据个数(实际放书的个数)
private int usedSize;
//构造方法(把书放到书架上)
public BookList(){
this.books[0]=new Book("三国演义","罗贯中",
10,"小说");
this.books[1]=new Book("西游记","吴承恩",
59,"小说");
this.books[0]=new Book("红楼梦","曹雪芹",
16,"小说");
this.usedSize=3;//实际放了3本书
}
}
现在,我们需要在src包中创建一个Main类作为程序的入口,对上面的代码进行测试。
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
//用户登录
//向上转型是为了接收返回值
public static User login(){
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name=scanner.nextLine();
System.out.println("请输入你的身份 1.管理员 2.普通用户");
int choice=scanner.nextInt();
//如果输入1,实例化管理员对象,否则实例化普通用户对象
if(choice==1){
return new AdminUser(name);
}else{
return new NormalUser(name);
}
}
//系统入口
public static void main(String[]args){
User user=login();//接收返回值
user.menu();//打印菜单
}
}
测试结果如下:
可以看到, 基本的界面已经被实现,下面就是具体操作(如查找书籍)的实现了。
三、具体操作的实现
同样的,我们创建一个包命名为iOperation,里面实现各种操作。
为了得到用户,选择的是那个操作User中的menu方法的返回值因改为int,其子类重写的方法返回值也因改为int,下面iOperation包中各种类和接口的初步实现(先不写出功能)
package iOperation;
import book.BookList;
//新增图书
public class AddOperation implements IOperation{
public void work(BookList bookList){
System.out.println("新增图书");
}
}
package iOperation;
import book.BookList;
public class BorrowedOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("借阅书籍");
}
}
package iOperation;
import book.BookList;
public class DeleteOperation implements IOperation{
public void work(BookList bookList){
System.out.println("删除书籍");
}
}
package iOperation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
}
}
package iOperation;
import book.BookList;
//查找书籍操作
public class FindOperation implements IOperation{
public void work(BookList bookList){
System.out.println("查找书籍");
}
}
下面这个接口是为了让所有的操作都在实现这个接口,这样就可以创建一个接口类型的数组,它的元素是各种操作。
package iOperation;
import book.BookList;
public interface IOperation {
public void work(BookList bookList);
}
package iOperation;
import book.BookList;
public class ReturnOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("归还书籍");
}
}
package iOperation;
import book.BookList;
public class ShowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("显示书籍");
}
}
现在我们已经将这些操作的代码实现了,但是如何调用它们的方法呢?很简单,它们都实现了IOperation接口,我们可以在User类里创建一个数组,在它的子类的构造方法里对数组进行赋值。
然后再在User类里面定义一个doOperation方法,用来调用具体操作中的work方法
然后在main方法里,创建一个书架,再调用doOperation方法
public class Main {
//用户登录
//向上转型是为了接收返回值
public static User login(){
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name=scanner.nextLine();
System.out.println("请输入你的身份 1.管理员 2.普通用户");
int choice=scanner.nextInt();
//如果输入1,实例化管理员对象,否则实例化普通用户对象
if(choice==1){
return new AdminUser(name);
}else{
return new NormalUser(name);
}
}
//系统入口
public static void main(String[]args) {
while (true) {
User user = login();//接收返回值
int choice = user.menu();//打印菜单,接收选择的操作,根据放回只来看调用哪种work方法
BookList bookList = new BookList();//创建书架
//确定当前对象包含了哪些方法,很简单,在User里定义数组,在子类里对数组进行赋值
//调用方法
user.doIoperation(choice, bookList);
}
}
}
现在,整个系统的框架就已经搭建好了,只差个中操作中work方法的具体操作实现了。