大致思路:
管理员用户
普通用户
根据上两张图可以看出来,选择不同的用户打印不同的菜单
大致思路:
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);
}
}
}