实现效果
它将面对 管理员 和 普通用户 两种用户来提供服务,并且各自的服务并不相同。
实现思路
一般写项目,每个独立的功能都会写成一个类,而有关联的功能,都会将多个类存放在一个包中,此项目我们将用 3 个包来体现我们的效果
book包
Book类 —> 用来定义一本书
既然是图书系统,那么必然不可能仅仅只有一本书,我们还需要一个书架,来存储书籍 BookList 类
user包
因为我们有两种用户可以使用这个图书系统,而且每种用户都有自己的特性,所以也需要定义成类
有 User类(后面两个类的共同特征抽取出来的,User类可以是一个抽象类),adminUser类,normalUser类
opertion包
这个包底下就是我们的基本操作
查询图书,借阅图书,归还图书,退出系统,新增图书,删除图书,显示所有图书
这里我们增加一个操作接口,让所有功能来实现这个接口,从而完善各自的内容。
Main类
上面的类就已经实现了我们需要的功能了,Main类就是来整合这些操作功能的,在Main类中,我们需要根据登陆的账户类型不同,来显示不同的菜单供其使用图书系统.
book包的实现
创建book类用来存储书的各种信息,BookList类当做书架管理书籍.
book类
Book类中包含五个属性[书名,作者,书的描述,价格,是否被借出]。
一个构造方法(isBorrowed不用放到构造方法中,因为这个属性随着借入和归还一直变化,所以创建setter方法对他进行修改。
重写toString方法,这样打印出来才能看出来书籍信息
public class Book {private String name;private String author;private String describe;private double price;private boolean isBorrowed=false;public Book(String name, String author, String describe, double price) {this.name = name;this.author = author;this.describe = describe;this.price = price;}public String getName() {return name;}public String getAuthor() {return author;}public String getDescribe() {return describe;}public double getPrice() {return price;}public void setName(String name) {this.name = name;}public void setAuthor(String author) {this.author = author;}public void setDescribe(String describe) {this.describe = describe;}public void setPrice(double price) {this.price = price;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}public boolean isBorrowed() {return isBorrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", describe='" + describe + '\'' +", price=" + price +", isBorrowed=" + isBorrowed +'}';}
}
BookList类中设置了书的数组,用来存放书。
当前书的数量。
一些方法
获得书架上某个位置的书【getBooks】
修改架上某个位置的书【setBooks】
获取当前存储了书的数量【getUsedSized】
修改当前存储的书的数量【setUsedSized】
public class BookList {Book[] books=new Book[5];//这里最多可以放置5本书private int usedSized=3;//已存数的数量public BookList() {books[0]=new Book("红楼梦","曹","小说",11);books[0]=new Book("红楼","网","说",1111);books[0]=new Book("红","照","小",111111);}public void setBooks(int pos,Book book) {//设置某个位置的书,用于查找和删除图书this.books[pos]=book;}public void setUsedSized(int usedSized) {this.usedSized = usedSized;}public Book getBooks(int pos) {//获取某个位置的书,返回值为对象return this.books[pos];}public int getUsedSized() {return usedSized;}
}
user包
用户分为管理员和普通用户,我们抽象出管理员和普通用户的共同点创建User类,然后让管理员和普通用户继承User类,再去创建他们特有的属性或方法。
User类
每个用户都有自己的姓名;
每个用户都可以操作一些功能;
管理员和普通用户的菜单是不一样的,需要在不同类型的用户下重写,我们这里只提供抽象方法
由于普通用户和管理员权限不同,一些操作的结果会不同,这里我们提供动态绑定
public abstract class User {protected String name;protected IOperation[] ioperations;//创建一个数组,这个数组里面存放可以进行操作的功能public User(String name) {this.name = name;}public abstract int menu();管理员和普通用户的菜单肯定是不一样的,所以让他们自己去重写方法。public void doOperation(int choice, BookList bookList){ioperations[choice].work(bookList);}
}
AdminUser类
这里我们需要继承user类,
自己创建构造函数,要用到user类中的name成员变量,并初始化一个数组,这个数组中的成员为当前用户权限下可以进行的操作,成员类型为对象。
重写menu函数;
public class AdminUser extends User {public AdminUser(String name) {super(name);this.ioperations=new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};}@Overridepublic int menu() {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 sc=new Scanner(System.in);int choice=sc.nextInt();//choice用于选择操作类型return choice;}
}
NomalUser类
与上述 的AdminiUser类几乎是一样的道理
public class NormalUser extends User{public NormalUser(String name) {super(name);this.ioperations=new IOperation[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}@Overridepublic int menu() {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 sc=new Scanner(System.in);int choice=sc.nextInt();//choice用于选择操作类型return choice;}
}
main类
这里我们通过一个login方法提示用户输入姓名和身份类型,利用login方法的返回值返回身份类型,这里发生向上转型
public class Main {public static User login(){System.out.println("请输入你的姓名");Scanner sc=new Scanner(System.in);String name= sc.nextLine();System.out.println("请输入你的身份:1 管理员 0 普通用户");int choice=sc.nextInt();if(choice==1){return new AdminUser(name);//向上转型}else{return new NormalUser(name);//向上转型}}public static void main(String[] args) {User user=login();//返回值方式向上转型,确定操作者的身份类型BookList bookList=new BookList();//new一个书库的对象while(true){//可以循环输入int choice=user.menu();//操作者可以输入要进行怎么样的操作user.doOperation(choice,bookList);//对书库进行功能操作}}
}
opertion包
IOperation接口
这里我们只提供一个抽象方法,用于对Booklist类的对象进行功能上的操作
至此,我们的框架已经搭建完毕,可以进行简单的试跑
下面我们补全对应的功能操作
AddOperation类
public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入书的名字");String name=sc.nextLine();System.out.println("请输入书的作者");String author=sc.nextLine();System.out.println("请输入书的类型");String describe=sc.nextLine();System.out.println("请输入书的价格");double price=sc.nextDouble();Book book =new Book(name,author,describe,price);//new一个新的book对象,并完成初始化int pos=bookList.getUsedSized();//获取booklist中的书总数,为增加新书获取位置bookList.setBooks(pos,book);//将新书放置在数组库中的最后一个位置bookList.setUsedSized(pos+1);//书的总数+1System.out.println("添加书籍成功");}
}
运行结果如下
FindOperation类
ublic class FindOperation implements IOperation{public void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要查找图书的名字");String name=sc.nextLine();//遍历书架,去查找有无此书int currentSize=bookList.getUsedSized();for (int i = 0; i <currentSize; i++)if (name.equals(bookList.getBooks(i).getName())) {System.out.println("查到了,该书的信息如下");System.out.println(bookList.getBooks(i));return;}System.out.println("找不到该书");}
}
BorrowOperation类
public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要借阅图书的名字");String name=sc.nextLine();//遍历书架,去查找有无此书int currentSize=bookList.getUsedSized();for (int i = 0; i <currentSize; i++) {if(name.equals(bookList.getBooks(i).getName())){//如果有,看它是否有被借出if(bookList.getBooks(i).isBorrowed()==false){System.out.println("借阅成功");bookList.getBooks(i).setBorrowed(true);return;}else{System.out.println("该书已被借出");return;}}}System.out.println("没有此书");}
}
运行结果如下
DelOperation类
public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要删除的书籍");String name=sc.nextLine();int index=-1;for (int i = 0; i < bookList.getUsedSized(); i++) {if(bookList.getBooks(i).getName().equals(name)){//查找有无该书index=i;break;}}if(index==-1){System.out.println("没有你要删除的图书");return;}//找到了,准备开始向前覆盖for (int i = index; i < bookList.getUsedSized()-1; i++) {Book book=bookList.getBooks(i+1);bookList.setBooks(i,book);}//覆盖之后,最后一个数组位置赋null,并设置书的数量-1bookList.setBooks((bookList.getUsedSized())-1,null);bookList.setUsedSized(bookList.getUsedSized()-1);System.out.println("删除成功");}
}
ExitOperation类
public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出成功");System.exit(0);}
}
ReturnOperation类
逻辑同借阅类的逻辑相似
public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要归还图书的名字");String name=sc.nextLine();//遍历书架,去查找有无此书int currentSize=bookList.getUsedSized();for (int i = 0; i <currentSize; i++) {if(name.equals(bookList.getBooks(i).getName())){//如果有,看它是否有被借出if(bookList.getBooks(i).isBorrowed()==true){System.out.println("归还成功");bookList.getBooks(i).setBorrowed(false);return;}else{System.out.println("该书未被借出");return;}}}System.out.println("没有此书");}}
ShowOperation类
直接遍历即可
public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {for (int i = 0; i < bookList.getUsedSized(); i++) {System.out.println(bookList.getBooks(i));}}
}