小项目——图书管理系统

一、设计思路

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方法的具体操作实现了。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值