组成
- 用户------管理员,普通用户(属性,方法)
- 图书
- 书架------放置图书
大概逻辑如下
接着就是创建各个类
1.图书类
package Library.book; public class Book { private String name; private String author; private String type; private boolean isBorrow; public Book(){} public Book(String name,String author,String type){ this.name=name; this.author=author; 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 String getType() { return type; } public void setType(String type) { this.type = type; } public boolean getBorrow() { return isBorrow; } public void setBorrow(boolean borrow) { isBorrow = borrow; } @Override public String toString() { if(this.isBorrow) return "书名:"+this.name +",作者:"+this.author +",类型:"+this.type +"已借出"; else return "书名:"+this.name +",作者:"+this.author +",类型:"+this.type +",未借出"; } }
2.书架类(有必要用到集合这一概念,书是书架的一部分)
package Library.book; public class BookShelf { private Book[] bookList; private int bookNum=3; //书架的构造方法,初始化三本书 public BookShelf(){ this.bookList=new Book[10]; this.bookList[0]=new Book("三国演义","罗贯中","小说"); this.bookList[1]=new Book("西游记","吴承恩","小说"); this.bookList[2]=new Book("水浒传","施耐庵","小说"); } public Book[] getBookList() { return bookList; } public void setBookList(Book book) { this.bookList[this.bookNum]=book; } public int getBookNum() { return bookNum; } public void setBookNum(int bookNum) { this.bookNum = bookNum; } }
3.功能类初始化(都实现一个为工作功能的接口)
3.1接口类
package Library.function; import Library.book.Book; import Library.book.BookShelf; public interface IFunction { void work(BookShelf bookShelf); }
3.2功能类(为了方便管理,将每个功能都写成一个类)
所有的功能其实都是围绕书架来展开,就是每个功能其实都是在操作书架,自然书架都是为了功能的参数了
3.2.1 增加图书功能
import java.util.Scanner; public class AddFunction implements IFunction{ @Override public void work(BookShelf bookShelf) { Scanner sc=new Scanner(System.in); Book book=new Book(); System.out.print("输入书名:"); String name=sc.next(); book.setName(name); System.out.print("请输入作者名字:"); String author=sc.next(); book.setAuthor(author); System.out.print("请输入小说类型:"); String type=sc.next(); book.setType(type); bookShelf.setBookList(book); bookShelf.setBookNum(bookShelf.getBookNum()+1); System.out.println("《"+name+"》添加成功"); } }
3.2.2 借阅图书功能
package Library.function; import Library.book.Book; import Library.book.BookShelf; import java.util.Scanner; public class BorrowFunction implements IFunction{ @Override public void work(BookShelf bookShelf) { System.out.print("请输入要借阅的书名: "); Scanner sc=new Scanner(System.in); String name=sc.next(); int i=0; for (i=0;i<bookShelf.getBookNum();i++) { if(name.equals(bookShelf.getBookList()[i].getName())){ if(bookShelf.getBookList()[i].getBorrow()){ System.out.println("该书已经借出。"); }else{ System.out.println("确认借阅该书吗?1.是 2.否"); int YN=sc.nextInt(); if(YN==1){ bookShelf.getBookList()[i].setBorrow(true); System.out.println("你已经借阅"+name+",祝你阅读越快。"); for(int j=i;j<bookShelf.getBookNum()-1;j++){ bookShelf.getBookList()[j]=bookShelf.getBookList()[j+1]; } } } break; } } if(i==bookShelf.getBookNum()) System.out.println("抱歉,《"+name+"》暂未录入系统。"); } }
3.2.3. 删除图书功能
package Library.function; import Library.book.BookShelf; import java.util.Scanner; public class DeleteFunction implements IFunction { @Override public void work(BookShelf bookShelf) { System.out.print("请输入要删除的书名: "); Scanner sc=new Scanner(System.in); String name=sc.next(); int i=0; boolean delete=false; for (i=0;i<bookShelf.getBookNum();i++) { if(name.equals(bookShelf.getBookList()[i].getName())){ if(bookShelf.getBookList()[i].getBorrow()){ System.out.println("该书已经借出。"); }else{ System.out.println("确认删除该书吗?1.是 2.否"); int YN=sc.nextInt(); if(YN==1){ for(int j=i;j<bookShelf.getBookNum()-1;j++){ bookShelf.getBookList()[j]=bookShelf.getBookList()[j+1]; } bookShelf.setBookNum(bookShelf.getBookNum()-1); System.out.println(name+"删除成功"); delete=true; } } break; } } if(!delete) { System.out.println("抱歉,《" + name + "》暂未删除成功。"); } } }
3.2.4 退出系统功能(其实就是结束进程)
package Library.function; import Library.book.Book; import Library.book.BookShelf; public class ExitFunction implements IFunction{ @Override public void work(BookShelf bookShelf) { System.exit(0); } }
3.2.5 查找图书功能
package Library.function; import Library.book.Book; import Library.book.BookShelf; import java.util.Scanner; public class FindFunction implements IFunction{ @Override public void work(BookShelf bookShelf) { System.out.print("请输入要借阅的书名: "); Scanner sc=new Scanner(System.in); String name=sc.next(); int i=0; for (i=0;i<bookShelf.getBookNum();i++) { if(name.equals(bookShelf.getBookList()[i].getName())){ System.out.println("找到了:"); System.out.println(bookShelf.getBookList()[i].toString()); break; } } if(i==bookShelf.getBookNum()) System.out.println("抱歉,《"+name+"》暂未录入系统。"); } }
3.2.6 归还图书功能
package Library.function; import Library.book.Book; import Library.book.BookShelf; import java.util.Scanner; public class FindFunction implements IFunction{ @Override public void work(BookShelf bookShelf) { System.out.print("请输入要借阅的书名: "); Scanner sc=new Scanner(System.in); String name=sc.next(); int i=0; for (i=0;i<bookShelf.getBookNum();i++) { if(name.equals(bookShelf.getBookList()[i].getName())){ System.out.println("找到了:"); System.out.println(bookShelf.getBookList()[i].toString()); break; } } if(i==bookShelf.getBookNum()) System.out.println("抱歉,《"+name+"》暂未录入系统。"); } }
3.2.7 展示图书功能(按照一定的格式打印所有的图书信息)
package Library.function; import Library.book.Book; import Library.book.BookShelf; public class ShowFunction implements IFunction{ @Override public void work(BookShelf bookShelf){ for(int i=0;i<bookShelf.getBookNum();i++){ System.out.println(bookShelf.getBookList()[i].toString()); } } }
4.用户(用来作为管理者和普通用户的父类)
package Library.user; import Library.book.Book; import Library.book.BookShelf; import Library.function.IFunction; public class User { private String name; protected IFunction[] iFunction; public User() { } public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void function(){ } public void work(BookShelf bookShelf, int choice){ } }
4.1 管理者
package Library.user;
import Library.book.BookShelf;
import Library.function.*;public class Administrator extends User{
public Administrator() {
}public Administrator(String name) {
super(name);
this.iFunction=new IFunction[]{new ExitFunction(),
new FindFunction(),
new AddFunction(),
new DeleteFunction(),
new ShowFunction()
};
}public void function(){
System.out.println("***********************");
System.out.println("1.查找图书");
System.out.println("2.增加图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
System.out.println("***********************");
}
public void work(BookShelf bookShelf, int choice){
iFunction[choice].work(bookShelf);
}
}
4.2 普通用户
package Library.user; import Library.book.Book; import Library.book.BookShelf; import Library.function.*; public class Consumer extends User{ public Consumer() { } public Consumer(String name) { super(name); this.iFunction=new IFunction[]{new ExitFunction(), new FindFunction(), new BorrowFunction(), new ReturnFunction() }; } public void function(){ System.out.println("***********************"); System.out.println("1.查找图书"); System.out.println("2.借阅图书"); System.out.println("3.归还图书"); System.out.println("0.退出系统"); System.out.println("***********************"); } public void work(BookShelf bookShelf, int choice){ iFunction[choice].work(bookShelf); } }
3 接口为什么可以作为数组
父类的一个属性,接口数组,并且没有进行初始化
protected IFunction[] iFunction;
//在子类中的构造方法进行了初始化,new出来的每一个对象都实现了这个功能接口
在某种意义上形成了一种羁绊
this.iFunction=new IFunction[]{new ExitFunction(),
new FindFunction(),
new BorrowFunction(),
new ReturnFunction() };
可以使用接口的主要目的是为了实现代码的灵活性和可扩展性。通过定义一个接口,可以将不同的实现类归为一类,并且可以在代码中使用这个接口来引用它们。
在这种情况下,IFunction 接口定义了一组方法或行为,而具体的实现类(如 ExitFunction、FindFunction 等)则提供了实现这些行为的具体逻辑。通过将这些实现类存储到数组中,可以在程序运行时动态地选择需要使用的实现类。
这种方式使得代码更加灵活,因为可以轻松地添加、删除或替换不同的实现类,而无需修改大量的代码。同时,这也提高了代码的可扩展性,因为可以根据需要添加新的实现类,而不会对现有的代码造成不必要的影响。
总之,使用接口可以将不同的实现类组织起来,并通过统一的方式来操作它们,从而实现代码的灵活性和可扩展性。
调试
package Library; import Library.book.BookShelf; import Library.user.Administrator; import Library.user.Consumer; import Library.user.User; import java.util.Scanner; public class LibraryTest { public static User checkID(){//返回类型是父类,是因为不正确的 Scanner sc=new Scanner(System.in); System.out.println("图书管理系统"); System.out.print("请输入你的名字: "); String name=sc.next(); System.out.println("请选择你的身份: 1.管理员 2.普通用户"); int id=sc.nextInt(); if(id==1) return new Administrator(name);//根据你的身份选择,返回对应的对象 return new Consumer(name); } public static void main(String[] args) { Scanner sc=new Scanner(System.in); BookShelf bookShelf=new BookShelf(); User user=checkID();//这里返回的就是你的身份(管理者或者普通用户),向上转型 int choice=0;//功能选择 do{ user.function();//发生了动态绑定,实际调用的是子类的方法 System.out.print("请选择:"); choice=sc.nextInt(); user.work(bookShelf,choice); }while(choice!=0);//因为每一个子类中的退出系统功能都是第一个,下标就是零 } }