[Java SE] 图书管理系统 - 框架

1.创建3个包+一个存在main的文件

2.包:

operation:和操作相关的

1.IOperation :接口

2.AddOperation 类  等操作类

1.这些类都实现了IOperation接口

 2.每个类都对应一种操作,这个操作在类的方法work()里

3.把 work(BookList bookList)方法写在接口里

4.实现了接口的类要重写 work( BookList bookList ) 方法,用来实现各自的操作

5.所有的类对外都可以当做是IOperation接口(存放在IOperation的数组里)

package operation;      // 导入operation包 - 里面存放和搓澡相关的类

import book.BookList;              //导入book包里的BookList类

public interface IOperation {      //接口
    void work(BookList bookList);  //抽象方法,专门给各种操作类重写的
}

user:和人有关的

父类:User类型

子类:Admin类型

子类:NormalUser类型

1.Admin对象、NormalUser对象都可以传给User的引用来引用。

2.只有一个对象可以给User引用,对User的操作其实是对其中一个对象的操作

3.User类型有人继承,干脆把成员变量写成protected

4.User里有 (protected):

    用户的名字、一个抽象菜单menu、

    一个IOperation类型的数组(这个数组里可以放各种操作类)

    一个根据用户选项执行操作的方法

package user;

import book.BookList;
import operation.IOperation;

//这是一个抽象类
public abstract class User {
    //该类要被继承,干脆成员变量就写 protected 修饰
    protected String name;

    //存各种操作类
    protected  IOperation[] iOperations;

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

    //抽象方法 - 显示菜单
    abstract public int menu();


    //用来调用各操作类 - 根据用户选项执行操作
    public abstract void doOperations(BookList bookList,int choice) ;

}

1.两个子类重写menu菜单 ( user.menu()即可输出对应子类的菜单 ),返回choice

2.这个IOperation类型的数组初始化放在他两个子类里,根据menu菜单new出对应的类的对象 

3.因为IOperation类型的数组被protected修饰,要在User里写一个public方法接收choice

   在主函数里这样用:user.doOperations( bookList,choice )

book:和书有关的

1.书的类型 Book

2.书单【顺序表】 BookList   

1.Book里: 书的组成

2..BookList 里:

一个Book类型的数组

一个存有效数据的useSize

 构造方法:一创建对象就给数组存三本书

                   useSize=3

3.BookList都没有人继承,干脆把那些个成员变量设为private

4.private -> 要提供set 、get方法。在操作类中对一些成员属性进行修改

3.代码 : 

主函数:

import book.BookList;
import user.Admin;
import user.NormalUser;
import user.User;
import java.util.Scanner;

public class TestDemo {
    //创建用户
    public static User identi(int choice,String user_name){
        if(choice==1){
            return new Admin(user_name);
        }
         return new NormalUser(user_name);
    }


    public static void main(String[] args) {
        //先建一个通讯录
        BookList bookList=new BookList();

        System.out.println("请输入你的姓名");
        Scanner scanner=new Scanner(System.in);
        String user_name=scanner.nextLine();
        System.out.println("请输入你的身份 : 1.管理员  2.用户");
        int choice=scanner.nextInt();
        //向上转型 - 创建用户
        User user= identi(choice,user_name);       
        //根据choice2来确定调用那个类
        while(true){
            //多态 - 打印菜单
            int choice2=user.menu();
           //用户的操作
            user.doOperations(bookList,choice2);
        }
    }
}

book包:

 (1)Book类  

package book;

public class Book {
    //没有人要继承BookList,干脆成员变量都用private修饰
    private String book_name;
    private String author;
    private int price;
    private  String type;
    private boolean is_borrowed=false;     //不写默认也是false

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

    //后面肯定要打印,重写一个toString
    @Override
    public String toString() {
        return "Book{" +
                "book_name='" + book_name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", is_borrowed=" + is_borrowed +
                '}';
    }

    //借阅时对is_borrowed进行修改
    public boolean isIs_borrowed() {
        return is_borrowed;
    }

    public void setIs_borrowed(boolean is_borrowed) {
        this.is_borrowed = is_borrowed;
    }

    //通过地址获得名字
    public String getBook_name() {
        return book_name;
    }
}

 (2)BookList类

package book;

public class BookList {
    //没有人要继承BookList,干脆成员变量都用private修饰
    private Book []books=new Book[100];     //顺序表底层是个数组
    private int useSize;

    public BookList(){         //构造方法一般都是public?
        books[0]=new Book ("三国演义","罗贯中",100,"小说");
        books[1]=new Book ("水浒传","施耐庵",100,"小说");
        books[2]=new Book ("西游记","吴承恩",100,"小说");
        this.useSize=3;
    }

    //对数组的一些操作可以写在这里,不过现在我想写在operation的包里,便于管理
    
    //后面肯定会对useSize进行修改
    public int getUseSize() {
        return useSize;
    }

    public void setUseSize(int useSize) {
        this.useSize = useSize;
    }
    //在末尾增添一本书
    public void addBook(Book book) {
        books[useSize] = book;
    }
    
    public Book getBook(int index) {
        return books[index];
    }
    //在index位置插入一本书
    public void setBook(int index,Book book) {
        books[index] = book;
    }

operation包: 

说明:因为很多类的属性被protected/private修饰了,所以在操作类里我们要注意该如何获取/修改被修饰类的属性

 (1)IOperation接口

package operation;

import book.BookList;

public interface IOperation {
    void work(BookList bookList);    //实现了该接口的类,都必须实现该接口的所有方法
}

 一点关于接口的说明:

1.接口就是一个完全抽象的类,和抽象类一样不能产生对象,但是可以作为(实现了该接口的类的)引用,可以发生向上转型

2.只要类实现了这个接口,该类的引用都可以是该接口类型的引用。但是,这个引用只能调用接口中已有的方法,不能调用接口中没有的方法

3.所以,假如一个类实现了很多接口,他可以有很多接口类型的引用,每个引用都只能调用该接口类型中的方法,不能调用接口类型中没有的方法

(2) AddOperation类  - 增加操作

package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class AddOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("增加");

        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入书名");
        String name=scanner.nextLine();
        System.out.println("请输入作者");
        String author=scanner.nextLine();
        System.out.println("请输入价格");
        int  price=scanner.nextInt();
        System.out.println("请输入类型");
        String type=scanner.next();          //不能写成nextLine  因为上面整形的回车会被吸收
        //创造这本书
        Book book=new Book(name,author,price,type); 
        //在bookList中传入这本书
        bookList.addBook(book);   
        //useSize要变
        bookList.setUseSize(bookList.getUseSize()+1);

        System.out.println("新增图书 - 成功");
        
    }
}

(3)BrrowOperation类 - 借阅操作

package operation;
import book.BookList;
import java.util.Scanner;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {

        java.util.Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要借阅的书名");
        String name=scanner.nextLine();
        //因为booklist的成员属性都被protected修饰,所以属性只能通过Booklist里的一个公共方法获取
        for (int i=0;i<bookList.getUseSize();i++){
            if(bookList.getBook(i).getBook_name().equals(name)){   //比较字符串: 字符串. equals(字符串)
                if(bookList.getBook(i).isIs_borrowed()==true){     //bookList.getBook(i) 获得书的地址 //.isIs_borrowed()看该书是否被借阅
                    System.out.println("对不起,该数已被借出");
                    return ;
                }
                bookList.getBook(i).setIs_borrowed(true);   //.setIs_borrowed(true) 把该书置为已借出
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("找不到这本书");
    }
}

(4)DelOperation类 - 删除操作

package operation;
import book.BookList;
import java.util.Scanner;

public class DelOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要删除的书名");
        String name=scanner.nextLine();

        for (int i=0;i<bookList.getUseSize();i++){
            if(bookList.getBook(i).getBook_name().equals(name)){
                for (int j = i; j < bookList.getUseSize()-1; j++) {
                    //不可以bookList[j] - 因为bookList数组被private修饰
                    bookList.setBook(j,bookList.getBook(j+1));  
                }              
                //更改useSize
                bookList.setUseSize(bookList.getUseSize()-1);
                System.out.println("已删除");
                return ;
            }
        }
        System.out.println("找不到这本书");
    }
}

(5)DisplayOperation类 - 打印所有书目

package operation;
import book.BookList;

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        for (int i=0;i<bookList.getUseSize();i++){
            System.out.println(bookList.getBook(i));
        }
    }
}

(6)ExitOperation类 - 退出程序

package operation;
import book.BookList;

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出");
        //System.exit(0);  0表示正常退出  //非0表示异常退出
        System.exit(0);
    }
}

(7)FindOperation类 - 查找书

package operation;
import book.BookList;
import java.util.Scanner;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要查找的书名");
        String  name=scanner.nextLine();

        for (int i=0;i<bookList.getUseSize();i++){
            if(bookList.getBook(i).getBook_name().equals(name)){
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("找不到这本书");
    }
}

(8)ReturnOperation类 - 归还书

package operation;
import book.BookList;
import java.util.Scanner;

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要归还的书籍");
        String name=scanner.nextLine();

        for (int i=0;i<bookList.getUseSize();i++){
            if(bookList.getBook(i).getBook_name().equals(name)){
                bookList.getBook(i).setIs_borrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("找不到这本书");
    }
}

user包:

(1)User类 - 父类

package user;
import book.BookList;
import operation.IOperation;

//这是一个抽象类
public abstract class User {
    //该类要被继承,干脆成员变量就写 protected 修饰
    protected String name;
    //存各种操作类
    protected  IOperation[] iOperations;

    public User(String name) {
        this.name = name;
    }
    //抽象方法 - 显示菜单
    abstract public int menu();    
    //用来调用各操作类 - 根据用户选项执行操作
    public abstract void doOperations(BookList bookList,int choice) ;

}

(2)Admin类

package user;
import book.BookList;
import operation.*;
import java.util.Scanner;

public class Admin extends User{

    public Admin(String name) {
        super(name);
        //一调用,就给这个数组初始化
        iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }
    //重写menu方法
    @Override
    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("=====================");
        Scanner scanner=new Scanner(System.in);
        int choice =scanner.nextInt();
        return choice;
    }
    //重写Admin用户对应的操作
    @Override
    public void doOperations(BookList bookList, int choice) {
        iOperations[choice].work(bookList);
    }
}

(3)NormalUser类

package user;
import book.BookList;
import operation.*;
import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        //一调用,就给这个数组初始化
        iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
        };
    }
    //重写menu方法
    @Override
    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("0.退出");
        System.out.println("=================");

        Scanner scanner=new Scanner(System.in);
        int choice =scanner.nextInt();
        return choice;
    }
   //重写NormalUser对应的操作
    @Override
    public void doOperations(BookList bookList, int choice) {
        iOperations[choice].work(bookList);
    }
}

总结:每次写项目时,都来看看这个项目的思想(封装、继承、多态)

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值