[日常一练]图书管理系统

大致思路:

管理员用户

 普通用户

 

 根据上两张图可以看出来,选择不同的用户打印不同的菜单

大致思路:

1.既然是图书管理系统,那么就是对书的进行管理,谁对书来进行管理呢?

这里就分为普通用户和管理员用户了,而不管是哪一个用户他们都是用户,所以先可以创建一个user包,创建一个User用户类,而在User包下又分为管理员用户和普通用户两种,再创建两个用户

 管理员用户代码实现和菜单打印:

public class Admin_user extends User {   //继承父类用户的所有成员
    public Admin_user(String name) {    //帮助父类的name初始化
        super(name);
    }
    @Override
    public void menu(){
        System.out.println("*****管理员菜单*****");
        System.out.println("hello" + this.name + "欢迎来到图书小练习");//
        System.out.println("1.查找图书");
        System.out.println("2.新增图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出系统");
        System.out.println("***************************************");
    }
}

普通用户代码实现和菜单打印:

public class Regular_users extends User{    //继承父类用户的所有成员

    public Regular_users(String name) {     //帮助父类的name初始化
        super(name);
    }

    @Override
    public void menu() {
        System.out.println("***************************************");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出图书");
        System.out.println("***************************************");

 }
}

 

 2.上图中的功能都是对书进行操作,所以再创建一个book包,创建一个Book的类,将书的属性(是书就有书名,作者,价格,是否被借出属性)进行封装,同时设立一个书架类(bookList),即存放的是书的数组。

书的封装:

public class Book {
    private String name;            //因为是private修饰的所以下面得提供get和set
    private String author;
    private int price;
    private String type;
    private boolean isBorrow;

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    
    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 boolean isBorrow() {
        return isBorrow;
    }

    public void setBorrow(boolean borrow) {
        isBorrow = borrow;
    }
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

书架--代码示例:

public class BookList {
    private Book[] books = new Book[10];

    public void setBooks(int pos,Book book) {
        //把这本书放到书架上去
        this.books = books;
        //把当前的书放到书架上面
        books[pos] = book;
    }

    private int usedSize;//记录当前书架上面有几本书;

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public int getUsedSize() {
        return usedSize;
    }
    public Book getBook(int p) {
        return books[p];
    }
    public BookList() {
        books[0] = new Book("我为国家捐石油", "吕佳乐",301,"小说");//随便写的
        books[1] = new Book("拯救危难中的国家","杨梦涛",988,"哲学");//如有同名
        books[2] = new Book("论鸡是怎么下蛋的","王许锟",9,"国学");//纯属巧合
        this.usedSize = 3;
    }
}

3.这些功能可以统一为一个接口,写一个工作接口,用哪个功能就去调用工作接口,让工
作接口去实现里面的这些功能

operation包下,有7个类和1个接口

 IOperation是统一接口,新增,借阅,删除,显示,退出,查找,归还,都通过此接口实现功能,而要实现操作就是对书架进行操作

我们将相关类都放在operation包中:

public interface IOperation {
    public void work(BookList bookList);
}

IOperation上面:代码示例

下面work功能实现:

public class Add_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书");
    }
}
public class Borrow_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
   
       System.out.println("****************借阅成功****************");
    }
}
public class Exit implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.exit(0);    //退出功能的实现
    }

}
public class Del_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("已经删除");
      
    }
}
public class Display_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");

}
public class Find_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
    }
}
public class Return_Book implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书:");
}

不同的方法通过调用IOperation接口来实现方法。

4.这些接口配置好之后,然后就是吧他们全部整合在一起,就和刚刚开始看到的两张图一样,程序运行起来之后,会提示你输入姓名,然后输入你的身份,根据你身份的不同,打印不同的菜单,选择不同的功能,这时我们可以创建main方法,在main方法里面创建一个登陆方法,在登陆方法里面去实现根据输入的不同打印不同的菜单,选择不同的功能

代码实现:

public class Main {
    //1.因为不管你选择哪一个用户,它都是用户
    //2.所以这里接收值就可以写成User类型,发生向上转型
    //3.如果输入1或者0,就去User用户里面去打印菜单,并选择功能
    public static User login() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的姓名: ");
        String name = sc.nextLine();
        System.out.println("请选择你的身份:1>>管理员,0>>普通用户");
        int choose = sc.nextInt();
        if(choose == 1) {
                 return new Admin_user(name);
        } else {
                 return new Regular_users(name);
        }
    }
    public static void main(String[] args) {
        User user = login();
        //1.创建一个方法login在里面实现登陆等功能;---
        //最终User会指向哪个对象???
        //2.创建一个User类型的变量,存放返回值(选择的用户)
}

5.在创建好菜单之后,用户需要根据菜单选择功能,选择功能就要用户去输入选择功能,选择的功能需要一个变量来接收,这时定义一个变量,返回你的选择,返回到谁调用你的菜单(main方法中,第一步登陆,第二步调用菜单)

public class Main {
    //1.因为不管你选择哪一个用户,它都是用户
    //2.所以这里接收值就可以写成User类型,发生向上转型
    //3.如果输入1或者0,就去User用户里面去打印菜单,并选择功能
    public static User login() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的姓名: ");
        String name = sc.nextLine();
        System.out.println("请选择你的身份:1>>管理员,0>>普通用户");
        int choose = sc.nextInt();
        if(choose == 1) {
                 return new Admin_user(name);
        } else {
                 return new Regular_users(name);
        }
    }
    public static void main(String[] args) {
        User user = login();
        //1.创建一个方法login在里面实现登陆等功能;---
        //最终User会指向哪个对象???
        //2.创建一个User类型的变量,存放返回值(选择的用户)
        
        int choose = user.menu();
        //先使用user类去调用菜单,然后创建一个choose类来接收用户选择的功能
}
         

6.创建一个数组里面,在第一步登陆时,已经初始化好了数组中下标的每一个方法,
然后再通过user.dooperation(调用菜单用户选择的功能,work)

在User类中创建一个dooperation方法:

public abstract class User {
    protected String name;//这里也可以吧访问修饰限定符修改为protected
    //不同包中的子类可以访问
    public IOperation[] ioPerations;//没有分配空间,动态数组
    //定义一个数组,利用数组的选择来进行功能的实现;

    public void setName(String name) {
        this.name = name;
    }

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();//因为此方法和User类不能代表具体的某个用户,修改为abstract修饰的抽象类

    public void doOperation(int choose, BookList bookList) {
        this.ioPerations[choose].work(bookList);
    }
}

管理员用户的this.dooperation初始化:

public class Admin_user extends User {   //继承父类用户的所有成员
    public Admin_user(String name) {    //帮助父类的name初始化
        super(name);
        this.ioPerations = new IOperation[] {
                new Exit(),
                new Find_Book(),
                new Add_Book(),
                new Del_Book(),
                new Display_Book(),
        };
    }
    @Override
    //public void menu(){
    public int menu() {
        System.out.println("*****管理员菜单*****");
        System.out.println("hello" + this.name + "欢迎来到图书小练习");//
        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 sc = new Scanner(System.in);
        int choose = sc.nextInt();
        return choose;      //直接定义整形类型获取输入的数字为几!再进行调用操作中的方法
    }
}

 普通用户的this.dooperation初始化:

public class Regular_users extends User{    //继承父类用户的所有成员

    public Regular_users(String name) {     //帮助父类的name初始化
        super(name);
        this.ioPerations = new IOperation[] {
                new Exit(),
                new Find_Book(),
                new Borrow_Book(),
                new Return_Book(),
        };
    }

    @Override
    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 sc = new Scanner(System.in);
        int choose = sc.nextInt();
        return choose;
 }
}

 7.根据调用用户的菜单的选择,去调用不同的功能

框架功能实现:


上述就是框架的实现

下面则是对每一个功能的实现:


IOperation中7个类的实现和一个接口:
public interface IOperation {
    public void work(BookList bookList);
}

Add_Book :

1.想要吧新增的图书放到书架上面去,就要知道书架上面的有效图书有几本 : 可以创建一个变量把记录图书的计数器传给新变量current

2.创建一个Book类型变量book,把输入进去的名称、作者、类型、价格存放进去初始化,

3.然后把当前的book,放到当前有效图书的位置,然后添加成功后再让有效图书个数+1

新增图书功能代码实现:

public class Add_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc = new Scanner(System.in);
        System.out.println("新增图书");
        System.out.println("****************************");
        System.out.println("请输入新增的图书名称:");
        String name = sc.nextLine();
        System.out.println("请输入新增的图书作者:");
        String author = sc.nextLine();
        System.out.println("请输入新增的图书类型:");
        String type = sc.nextLine();
        System.out.println("请输入新增的图书价格:");
        int price = sc.nextInt();
        //把新增的图书放到书架中去,就需要下标
        int current = bookList.getUsedSize();
        Book book = new Book(name,author,price,type);
        bookList.setBooks(current,book);
        bookList.setUsedSize(current+1);
        System.out.println("新增图书成功*******************");

    }
}

 上面setBooks中对有效图书和当前输入图书的操作:

public class BookList {
    private Book[] books = new Book[10];

    public void setBooks(int pos,Book book) {
        //把这本书放到书架上去
        this.books = books;
        //把当前的书放到书架上面
        books[pos] = book;
    }

    private int usedSize;//记录当前书架上面有几本书;

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public int getUsedSize() {
        return usedSize;
    }
    public Book getBook(int p) {
        return books[p];
    }
    public BookList() {
        books[0] = new Book("我为国家捐石油", "吕佳乐",301,"名著");
        books[1] = new Book("拯救危难中的国家","杨梦涛",988,"哲学");
        books[2] = new Book("论鸡是怎么下蛋的","王昆",9,"国学");
        this.usedSize = 3;
    }
}

Borrow_book:

如果找到想要借的图书之后,可以在book里面的写一个setBorrow方法,把true赋给isBorrow,此时就是已借出,可以在toString方法中判断isBorrow变量是否为true,是则借出,否则未借出

借阅和归还图书,在Book方法中重写toString方法,因为默认是false(未借出),

public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrow;

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }


    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 boolean isBorrow() {
        return isBorrow;
    }

    public void setBorrow(boolean borrow) {
        isBorrow = borrow;
    }
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((isBorrow == true) ? "已经借出" : "没有被借出 ") +
                '}';
    }
}

遍历数组中每一个对象的内容和用户输入的内容作比较

public class Borrow_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你想要借的书:");
        String name = sc.nextLine();
        int current = bookList.getUsedSize();  //写一个变量存储当前书架有基本书;以便进行遍历对比
        int i = 0;
        for (; i < current; i++) {
            Book book = bookList.getBook(i);
            //equals方法用来对比输入的书名和书架中书名的对比
            if(book.getName().equals(name)) {
                book.setBorrow(true);
                break;
            }
        }
        //如果程序走到这,就代表没有找到书,并打印
        //此处的if是用来判断是break结束的循环,还是遍历完所有图书结束的循环
        if(i == current) {
            System.out.println("没找到这本书");
        } else {
            System.out.println("****************借阅成功****************");
        }
    }
}

Return_book:

public class Return_Book implements IOperation {
    @Override
    public void work(BookList bookList) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要归还的图书:");
        String name = sc.nextLine();
        int current = bookList.getUsedSize();  //写一个变量存储当前书架有基本书;以便进行遍历对比
        int i = 0;
        for (; i < current; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)) {
                book.setBorrow(false);
                break;
            }
        }
        //
        if(i == current) {
            System.out.println("没找到这本书");
        } else {
            System.out.println("归还成功");
        }

    }
}

 

 Del_book:

让数组中最后一个位置,覆盖掉想要删除图书的位置

public class Del_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要删除的图书");
        //进行查找
        String name = sc.nextLine();
        int current = bookList.getUsedSize();
        int delIndex = 0;
        int i = 0;
        for (; i < current; i++) {
            //进行判断,当前查找书名 和 书架下标的数组内容元素进行对比
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)) {
                //设置计数器,找到之后的下标赋值进行删除功能
                delIndex = i;
                break;
            }
        }
        //判断是找到了,还是没找到
        if(i == current) {
            System.out.println("没找到你想删除的这本书");
        }
        //如果找到了,1.遍历;2.使用计数器的下标赋值进行删除
        //从有效数组,让J+1本书,覆盖掉当前想要删除的图书!
        for (int j = delIndex; j < current; j++) {
            //让J+1本书,覆盖掉当前下标(已经使用delIndex找到删除的书的下标)--图书
            Book book = bookList.getBook(j+1);
            bookList.setBooks(j,book);
        }
        //这里可以吧多余出来的数组置为null
        bookList.setBooks(current-1,null);
        //这里删除成功之后使有效图书个数-1
        bookList.setUsedSize(current-1);
        System.out.println("删除成功");
    }
}
Dispaly_book

遍历数组并打印

public class Display_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        int current = bookList.getUsedSize();  //写一个变量存储当前书架有基本书;以便进行遍历对比
        for (int i = 0; i < current; i++) {
            Book book = bookList.getBook(i);
            //对数组进行遍历即可打印出所有的图书
                System.out.println(book);
        }
    }
}

Exit

public class Exit implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.exit(0);
    }

}

Find_book

和删除图书差不太多

public class Find_Book implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入书名进行查找:>>");
        String name = sc.nextLine();     //输入书名并进行查找
        int current = bookList.getUsedSize();  //写一个变量存储当前书架有基本书;以便进行遍历对比
        for (int i = 0; i < current; i++) {
            //进行判断,当前查找书名 和 书架下标的数组内容元素进行对比
            Book book = bookList.getBook(i);
          if(book.getName().equals(name)) {
              System.out.println("找到这本书了");
              System.out.println(book);
              return;
          }
        }
        //如果程序走到这,就代表没有找到书,并打印
        System.out.println("没找到这本书");

    }
}


Book包下的两个方法

Book:

public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrow;

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }


    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 boolean isBorrow() {
        return isBorrow;
    }

    public void setBorrow(boolean borrow) {
        isBorrow = borrow;
    }
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((isBorrow == true) ? "已经借出" : "没有被借出 ") +
                '}';
    }
}

BookList(书架):

public class BookList {
    private Book[] books = new Book[10];

    public void setBooks(int pos,Book book) {
        //把这本书放到书架上去
        this.books = books;
        //把当前的书放到书架上面
        books[pos] = book;
    }

    private int usedSize;//记录当前书架上面有几本书;

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public int getUsedSize() {
        return usedSize;
    }
    public Book getBook(int p) {
        return books[p];
    }
    public BookList() {
        books[0] = new Book("我为国家捐石油", "吕佳乐",301,"名著");
        books[1] = new Book("拯救危难中的国家","杨梦涛",988,"哲学");
        books[2] = new Book("论鸡是怎么下蛋的","王昆",9,"国学");
        this.usedSize = 3;
    }
}

 

User用户下的两用户:

管理员用户

public class Admin_user extends User {   //继承父类用户的所有成员
    public Admin_user(String name) {    //帮助父类的name初始化
        super(name);
        this.ioPerations = new IOperation[] {
                new Exit(),
                new Find_Book(),
                new Add_Book(),
                new Del_Book(),
                new Display_Book(),
        };
    }
    @Override
    //public void menu(){
    public int menu() {
        System.out.println("*****管理员菜单*****");
        System.out.println("hello" + this.name + "欢迎来到图书小练习");//
        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 sc = new Scanner(System.in);
        int choose = sc.nextInt();
        return choose;      //直接定义整形类型获取输入的数字为几!再进行调用操作中的方法
    }
}

普通用户

public class Regular_users extends User{    //继承父类用户的所有成员

    public Regular_users(String name) {     //帮助父类的name初始化
        super(name);
        this.ioPerations = new IOperation[] {
                new Exit(),
                new Find_Book(),
                new Borrow_Book(),
                new Return_Book(),
        };
    }

    @Override
    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 sc = new Scanner(System.in);
        int choose = sc.nextInt();
        return choose;
 }
}

main方法: 

public class Main {
    public static User login() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的姓名: ");
        String name = sc.nextLine();
        System.out.println("请选择你的身份:1>>管理员,0>>普通用户");
        int choose = sc.nextInt();
        if(choose == 1) {
                 return new Admin_user(name);
        } else {
                 return new Regular_users(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();//1.创建一个方法;---最终User会指向哪个对象???2.创建一个User类型的变量,存放返回值
        //1.打印菜单,并进行选择操作
        //2.根据返回的数字是几!,调用哪个功能
        while(true) {
            int choose = user.menu();
            user.doOperation(choose,bookList);
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Autumn60

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值