了解一下
先来了解要实现一个怎样的图书管理系统
从中可以看到有操作的 使用者 和 不同 的 功能
而不同的使用者有不同的 菜单
那要如何实现呢?
请继续看下去
如何实现
首先了解我们 需要什么
图书系统需要 书,放书的 书架 ,用户 中有 管理员 和 普通用户,以及 实现功能
也就是说
书:书 书架
用户:管理员 普通用户
操作功能:管理员功能 普通用户功能
书
1.书
写一个书类,创建它的书名,作者,价格,类型,是否借出(boolean类型),全部使用private修饰
创建get 和 set方法获取书的属性
创建构造方法以便之后的传值,boolean类型不需要创建构造方法,boolean默认为false,创建构造方法反而显得繁琐
由于之后需要打印重写一个toString方法
而boolean类型的打印为false,可以使用 三元操作条件运算符 来解决
public String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrowed == true ? " 已借出":" 未借出")+//这里用三元条件运算符可以解决打印出来false和true的问题
// ", isBorrowed=" + isBorrowed +'}';}
此时我们的book类就写完了
public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;//首先给变量创建构造方法,赋值public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}//再创建get set方法,以便后续的调用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;}//创建to String方法,便于打印@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrowed == true ? " 已借出":" 未借出")+//这里用三元条件运算符可以解决打印出来false和true的问题
// ", isBorrowed=" + isBorrowed +'}';}
}
2.书架
写一个书架类,创建一个Book数组,给上合适的空间
创建构造方法用来放书,使书架被创建的时候就能有书
定义当前书的数量useSize
给Book数组和useSize创建get 和 set方法
注意:需要再写一个能获取和设置单本书的方法,以便后续需要增加图书和删除图书
到这里我们的书架类也写完了
//书架类
public class BookList {//书架类用来放书,new一个书类型的数组,给上合适的空间Book[] books = new Book[10];//建立一个当前使用数private int useSize;//给书架创建构造方法,使书一开始就存在于书架public BookList() {books[0] = new Book("三块钱如何活一个月","Zack",3,"人生哲理");books[1] = new Book("如何征服美丽少女","Zack",999,"杂志");books[2] = new Book("为什么作者这么帅","Zack",666,"小说");this.useSize = 3;}//创建get 和set 方法便于后续使用//这里修改加入参数便于后续获取一本书public Book getBook(int pos) {return books[pos];}//这里为了获取全部的书public Book[] getBooks() {return books;}//同样设置一本书public void setBook(Book books,int pos) {this.books[pos] = books;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}
}
那么书结束,接下来是用户
用户
1.User类
这里有 普通用户 和 管理员,我们很容易想到利用多态,写一个User抽象类
定义名字
创建构造方法
创建抽象方法menu
注意:这里返回类型需要定义为int类型,以便接收操作值
//由于这个类不能具体指向某个对象,所以定义为抽象类
public abstract class User {//想要这个变量被其他类使用,又想要有一点限制使用protectedprotected String name;//创建接口的数组,对应接收操作的数字protected IOperation[] iOperations;//同样创建构造方法public User(String name) {this.name = name;}//创建一个menu菜单方法,子类继承的时候会需要续写,设置成int类型方便返回值public abstract int menu();//实现向下转型public void doOperation(int choice, BookList bookList){iOperations[choice].work(bookList);}}
2.普通用户
继承父类User,
重写父类构造方法,
重写menu,
由于不同类型的用户的菜单不同,所以需要根据不同用户的功能设计
从输入2开始就是进入了系统,那么根据需要设计想要实现的样子,这里仅供参考
public int menu() {System.out.println("-----欢迎 "+this.name+" 来到图书管理系统-----");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 scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
那么管理员也是同理,只需要修改需要的功能
到这里我们的用户类完成
接下来是写一个主类运行
主类
可以看到运行时优先出来的是要求输入姓名和身份
那么可以设置为静态方法
1.login静态方法
按照想要的要求来实现,这里的返回值设置成User方便之后接收返回值
具体实现
//构造静态方法,一开始执行就会运行这个方法public static User login(){//这里把返回类型设置成User,这样不论是什么类型都可以接收Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = scanner.nextLine();System.out.println("请输入你的身份:");System.out.println("1. 管理员 2. 普通用户");int choice = scanner.nextInt();if (choice == 1){return new Admin(name);}else {return new Normal(name);}}
先创建一个书架对象,使书架里有
创建一个User对象,接收login方法的传来的值
用User创建的对象调用子类的方法,这样就形成了多态
具体实现
BookList bookList = new BookList();//用User类型来接收就可以形成多态User user = login();
//用一个choice来接收返回的操作值int choice = user.menu();
这里还可以写一个循环让菜单一直出现直到退出系统
接下来是操作方法的实现
操作方法
可以实现一个操作方法的接口,这样所有实现这个接口的类都需要重写它的方法,便于调用
由于操作的是书架所以需要输入书架的值
//创建接口使实现接口的子类都需要实现方法,注意这里要操作的是书架所以参数是BookList。。。。
public interface IOperation {void work(BookList bookList);
}
把要创建的方法实现这个接口,重写work方法
例如这种
public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统-----");exit(0);}
}
这样就完成了操作方法
(本文章仅搭建一个框架,不包含功能的实现,功能的实现我会单独放在一篇文章)
如何调用方法
既然通过数字来确定操作方法,不如直接创建一个接口的数组,把操作方法放到数组里
那么首先在User类里创建一个接口的数组ioperations,这样子类会继承
//创建接口的数组,对应接收操作的数字protected IOperation[] iOperations;
而管理员和普通用户的方法不同,数组就需要放入不同的值
形如,放到构造方法中同样创建就会执行
iOperations = new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DeleteOperation(),new ShowOperation()};
调用的时候就再在User类中写一个调用的doOperation
参数放入书架BookList booklist 和下标pos
public void doOperation(int choice, BookList bookList){iOperations[choice].work(bookList);}
在主类中调用后就将框架实现了
public class Main {//构造静态方法,一开始执行就会运行这个方法public static User login(){//这里把返回类型设置成User,这样不论是什么类型都可以接收Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = scanner.nextLine();System.out.println("请输入你的身份:");System.out.println("1. 管理员 2. 普通用户");int choice = scanner.nextInt();if (choice == 1){return new Admin(name);}else {return new Normal(name);}}public static void main(String[] args) {BookList bookList = new BookList();//用User类型来接收就可以形成多态User user = login();//写一个死循环让菜单循环while(true){//用一个choice来接收返回的操作值int choice = user.menu();//利用这个返回的操作值来进行下一步user.doOperation(choice,bookList);}}
}
梳理运行步骤
首先主类的login方法会优先执行,返回一个类型
然后根据返回的类型调用方法
接收操作值之后就找到操作方法类并调用work方法
这里只是实现一个框架,功能的实现会放到下一篇文章
若有不足请及时指正