实现效果
它将面对 管理员 和 普通用户 两种用户来提供服务,并且各自的服务并不相同。
实现思路
一般写项目,每个独立的功能都会写成一个类,而有关联的功能,都会将多个类存放在一个包中,此项目我们将用 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;
}
@Override
public 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()};
}
@Override
public 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()};
}
@Override
public 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类的对象进行功能上的操作
public class AddOperation implements IOperation{
@Override
public 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);//书的总数+1
System.out.println("添加书籍成功");
}
}
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{
@Override
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())){
//如果有,看它是否有被借出
if(bookList.getBooks(i).isBorrowed()==false){
System.out.println("借阅成功");
bookList.getBooks(i).setBorrowed(true);
return;
}else{
System.out.println("该书已被借出");
return;
}
}
}
System.out.println("没有此书");
}
}
public class DelOperation implements IOperation{
@Override
public 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,并设置书的数量-1
bookList.setBooks((bookList.getUsedSized())-1,null);
bookList.setUsedSized(bookList.getUsedSized()-1);
System.out.println("删除成功");
}
}
ExitOperation类
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出成功");
System.exit(0);
}
}
ReturnOperation类
逻辑同借阅类的逻辑相似
public class ReturnOperation implements IOperation{
@Override
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())){
//如果有,看它是否有被借出
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{
@Override
public void work(BookList bookList) {
for (int i = 0; i < bookList.getUsedSized(); i++) {
System.out.println(bookList.getBooks(i));
}
}
}