• 图书管理系统(Java实现)[附完整代码]


    作者:爱塔居的博客_CSDN博客-JavaSE领域博主

    专栏:JavaSE

    作者专栏:大三学生,希望跟大家一起进步!

    wx:csy1330748830

    需要可以加,免费给。我是女孩子,别叫我哥,呜呜。

    一、图书管理系统菜单

    🍓管理员菜单

    1.查找图书

    2.新增图书

    3.删除图书

    4.显示图书

    0.退出系统

    ---------------------------------------------------------------------------------------------------------------------------------

    🌼用户菜单

    1.查找图书

    2.借阅图书

    3.归还图书

    0.退出系统

    二、实现基本框架

    先建立一个新的文件,命名为TestBook,在文件内建立两个包,分别命名为user(用户)、book(图书)。

     先写book相关的代码。于是,我们先在book包中新建一个java类,名为:Book。

    显示图书时,我们希望它能显示出所有图书的名称、作者、价格、类型和图书目前是否借出。

    1. private String name;//书名
    2. private String author;//作者
    3. private int price;//价格
    4. private String type;//类型
    5. private boolean isBorrowed;//是否被借出,初始值是false,在构造方法中不用写

     右击鼠标,选择Generate,选择Getter and Setter 选项,点击shift,点最后一个,就能全选:

    自动生成:

    1. public String getName() {
    2. return name;
    3. }
    4. public void setName(String name) {
    5. this.name = name;
    6. }
    7. public String getAuthor() {
    8. return author;
    9. }
    10. public void setAuthor(String author) {
    11. this.author = author;
    12. }
    13. public int getPrice() {
    14. return price;
    15. }
    16. public void setPrice(int price) {
    17. this.price = price;
    18. }
    19. public String getType() {
    20. return type;
    21. }
    22. public void setType(String type) {
    23. this.type = type;
    24. }
    25. public boolean isBorrowed() {
    26. return isBorrowed;
    27. }

    再写它们的构造方法:

    当我们新增一本图书时,它默认就是未被借出的,所以不用构造方法。

    快捷键:alt+insert。按ctrl,可以多选,直接生成下面代码块:

    1. public Book(String name, String author, int price, String type) {//构造方法
    2. this.name = name;
    3. this.author = author;
    4. this.price = price;
    5. this.type = type;
    6. }

     我们再右键选择Generate,选择ToString,全选,点OK,自动生成:

    1. @Override
    2. public String toString() {
    3. return "Book{" +
    4. "name='" + name + '\'' +
    5. ", author='" + author + '\'' +
    6. ", price=" + price +
    7. ", type='" + type + '\'' +
    8. ", isBorrowed=" + isBorrowed +
    9. '}';
    10. }

    此时,在book包中新建一个类:BookList(书架):

    在这个书架中,我们希望能在里面固定的位置放书,并且能知道放了几本书:

    1. private Book[] books=new Book[10];//这个书架可以放十本书
    2. private int usedSize;//记录下当前book数组中有几本书

    然后依旧是右键Generate ,getter and setter,自动生成:

     当前界面:

    我们还记得在C语言中,我们用到的 define,用define语句来定义一个常量,同理,我们这边也可以定义一个能放多少本书的常量:

    1. private static final int DEFAULT_SIZE=10;
    2. private Book[] books=new Book[DEFAULT_SIZE];

    我们这边就是先按思路慢慢写,慢慢补充。在后面,我会放完整的代码。

    book包已经告一段落了,现在来写user包。

    我们在user包中新建三个类:AdminUser(管理员)、NormalUser(用户)、User。

    NormalUser、AdminUser,这也就是我们图书管理系统面对的两个对象了,管理员和用户,他们具有一些相同的属性。我们就可以写一个User类,让两个类去继承,来省一些代码了。

    🥗我们先写User类叭~

    1. package user;
    2. public class User {
    3. protected String name;//名字.这边的protect代表的是名字的权限。如果是private,它只能在同一个包的同一类使用。就不能让AdminUser类继承了。
    4. //写public的话,权限太大了,不是很好。
    5. public User(String name) {//构造方法
    6. this.name = name;
    7. }
    8. }

    所以在AdminUser类中:

    1. package user;
    2. public class AdminUser extends User{
    3. public AdminUser(String name) {
    4. super(name);
    5. }
    6. }

    可以直接用快捷键,alt+insert,直接生成构造方法。

    同理,NormalUser类中:

    1. package user;
    2. public class NormalUser extends User{
    3. public NormalUser(String name) {
    4. super(name);
    5. }
    6. }

    我们书的属性和用户属性的包和类已经写了大概。我们现在回归到我前面列的功能上:

     

     然后,我们就会发现我们想要实现的功能和操作基本上是针对图书的。所以,这边,我们可以选择直接在图书book包中写方法,也可以选择另外再创建一个包。

    我这边是新建了一个包,命名为:opera,再创建一个接口命名为IOPeration。

    创建接口:点oper,右击,点击java Class:

     然后页面为:

     创建接口:

    1. package opera;
    2. import book.BookList;
    3. public interface IOPeration {//创建接口
    4. void work(BookList bookList);//抽象方法
    5. //功能主要是针对图书的,也就是针对书架。
    6. }

     我们在opera(实现功能的包)中,创建两个类,AddOperation、FindOperation,这两个类。

    我们会发现这两个类的实现也都要依靠BookList(书架)来实现。所以,在这两个类中,实现接口:

    FindOperation类中:

    1. package opera;
    2. import book.BookList;
    3. public class FindOperation implements IOPeration{//继承
    4. @Override
    5. public void work(BookList bookList) {//重写IOPeration类中的work方法
    6. System.out.println("查找图书!");
    7. }
    8. }

    AddOperation类中:

    1. package opera;
    2. import book.BookList;
    3. public class AddOperation implements IOPeration {
    4. public void work(BookList bookList){
    5. System.out.println("新增图书!");
    6. }
    7. }

     同理,新建类DelOperation(删除图书):

    1. package opera;
    2. import book.BookList;
    3. public class DelOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("删除图书!");
    7. }
    8. }

     新建一个类:ShowOperation(显示图书):

    1. package opera;
    2. import book.BookList;
    3. public class ShowOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("打印所有图书!");
    7. }
    8. }

     再新建一个类:ExitOperation(退出系统):

    1. package opera;
    2. import book.BookList;
    3. public class ExitOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("退出系统!");
    7. }
    8. }

    新建一个BrrowOperation类(借阅图书):

    1. package opera;
    2. import book.BookList;
    3. public class BrrowOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("借阅图书!");
    7. }
    8. }

     再新建一个类:ReturnOperation(借阅图书):

    1. package opera;
    2. import book.BookList;
    3. public class ReturnOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("归还图书!");
    7. }
    8. }

    接着,我们来细化我们的类。

    🍅我们还没有给user添加菜单。

    我们先给管理员添加菜单:

    1. public void menu(){
    2. System.out.println("____________________________________");
    3. System.out.println("1.查找图书");
    4. System.out.println("2.新增图书");
    5. System.out.println("3.删除图书");
    6. System.out.println("4.显示图书");
    7. System.out.println("0.退出系统");
    8. }

    再给用户添加菜单:

    1. public void manu(){
    2. System.out.println("_________________");
    3. System.out.println("hello,"+name+"~");
    4. System.out.println("1.查找图书!");
    5. System.out.println("2.借阅图书!");
    6. System.out.println("3.归还图书!");
    7. System.out.println("0.退出系统!");
    8. }

    现在,我们写main方法。在src下新建一个类:Main:

    1. import user.AdminUser;
    2. import user.NormalUser;
    3. import user.User;
    4. import java.util.Scanner;
    5. public class Main {
    6. //登录
    7. public static User login(){
    8. System.out.println("请输入你的姓名:");
    9. Scanner scanner=new Scanner(System.in);
    10. String name=scanner.nextLine();
    11. System.out.println("请选择你的身份:1->管理员 0->普通用户");
    12. int choice =scanner.nextInt();
    13. if(choice==1){
    14. //说明是管理员
    15. //由于有返回值,所以我们的方法返回值就不能写void了。但是我们也无法确定返回值是什么,可能是管理员,可能是用户。所以,用向上转型,写User.
    16. return new AdminUser(name);//返回实例化一个管理员对象
    17. }else {
    18. return new NormalUser(name);//返回实例化一个用户对象
    19. }
    20. }
    21. public static void main(String[] args) {
    22. User user=login();//执行上面的login方法
    23. user.menu();//实现打印菜单
    24. }
    25. }

    执行login方法时,我们是还不知道new的对象是管理员还是用户的。所以,在打印菜单时,我们也不能直接使用我们在AdminUser类和NormalUser类中写的menu()方法。

    ✨🎉所以在写user.menu();这个语句时,不行!

    所以,我们想到了重写。

    我们把User类改成抽象类,在抽象类中写一个menu的抽象方法。

    1. package user;
    2. public abstract class User {//抽象类
    3. protected String name;//名字.这边的protect代表的是名字的权限。如果是private,它只能在同一个包的同一类使用。就不能让AdminUser类继承了。写public的话
    4. //权限太大了,不是很好。
    5. public User(String name) {//构造方法
    6. this.name = name;
    7. }
    8. public abstract void menu();//抽象方法,打印菜单
    9. }

    那么, 在AdminUser类和NormalUser类中,也应该有相应的改动,把里面的menu()写成重写的形式。

    这也仅仅是实现了打印菜单:

     这个过程还是有一些弯弯绕绕的。我们可以通过调试,来捋清我们的思路:

    调试的话:

     然后,编译器就会带我们一步步地看它是怎么执行的。

    接着,我们继续完善我们的代码。光打印一个菜单,不执行我们想要的功能,可不行。

    所以,我们在我们的menu菜单中,需要输入我们的功能选择:

    1. Scanner scanner=new Scanner(System.in);
    2. int choice=scanner.nextInt();
    3. return choice;

    输入功能选择,我们就要通过这个选择就实现:

    首先,我们要根据对象(管理员或用户),选择引用哪一个菜单方法:

    NormalUser类中:

    1. public NormalUser(String name) {
    2. super(name);
    3. this.ioPerations=new IOPeration[]{//引用,这边用super也可以,因为这里没有同名的,不需要做区分。用this最好
    4. new FindOperation(),
    5. new BrrowOperation(),
    6. new ReturnOperation(),
    7. new ExitOperation()//以动态方式申请内存。拿到变量后,我们就给他们分配内存
    8. };

     AdminUser类中:

    1. public AdminUser(String name) {
    2. super(name);
    3. this.ioPerations=new IOPeration[]{
    4. new ExitOperation(),
    5. new FindOperation(),
    6. new AddOperation(),
    7. new DelOperation(),
    8. new ShowOperation()
    9. };
    10. }

     当我们在构造方法中,写了这些,也就为它们分配了内存。当main类中login()方法下,new一个对象时,就会执行相应的构造方法,在这里就是开辟内存:

     在User类中:

    我们加上这样一段代码:

    1. public void doWork(int choice, BookList bookList){//通过选择的操作,去选择执行数组下的哪个操作
    2. this.ioPerations[choice].work(bookList);
    3. }

    this.ioPerations[choice]其实就是new了一个对象。后面的.work(bookList)是调用图书中对应的work方法。

    由此一来,我们就可以根据我们一步步的选择,调用book包中对应的work方法。

    为了让代码在输入0的时候退出系统,我们用while语句(在Main方法中修改):

    1. while (true){
    2. int choice=user.menu();//实现打印菜单
    3. user.doWork(choice,bookList);
    4. }

     

    这下子基本框架就构造好了。

    先看一下测试结果:

     三、实现业务

    3.1 打印所有图书

     我们先在BookList类,也就是书架中先添加图书:

    1. public BookList(){//构造方法
    2. books[0]=new Book("《三国演义》","罗贯中",40,"小说");
    3. books[1]=new Book("《西游记》","吴承恩",60,"小说");
    4. books[2]=new Book("《红楼梦》","曹雪芹",45,"小说");
    5. this.usedSize=3;
    6. }
    7. //通过这个方法,实现ShowOperation中的通过下标打印数组元素
    8. public Book getBook(int pos){
    9. return this.books[pos];
    10. }

    然后,我们实现打印所有图书这个业务 。

    🍍在ShowOperation类中,添加打印所有图书的程序,利用for循环。

     在ShowOperation类中:

    1. package opera;
    2. import book.BookList;
    3. public class ShowOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("显示图书!");
    7. int currentSize= bookList.getUsedSize();
    8. for (int i=0;i
    9. System.out.println(bookList.getBook(i));
    10. }
    11. }
    12. }

    实现的结果:

     我们会发现一些小瑕疵,比如这边输出的false。我们想把它改成已借出,未借出。

    这时,我们要用到三目运算符。条件?符合输出:不符合输出

    在book类中修改:

    1. public String toString() {
    2. return "Book{" +
    3. "name='" + name + '\'' +
    4. ", author='" + author + '\'' +
    5. ", price=" + price +
    6. ", type='" + type + '\'' +
    7. ", isBorrowed=" +(isBorrowed==true?" 已借出":" 未借出") +
    8. '}';
    9. }

     3.2 退出系统

    退出系统很简单,只需要加上👇语句即可。0代表正常退出。

    System.exit(0);

     实现结果:

     3.3 查找图书

    查找图书是跟刚才打印图书差不多的思路。通过for循环,利用equal()进行比对,输出图书信息。

    在FindOperation类中补充代码:

    1. public class FindOperation implements IOPeration{//继承
    2. @Override
    3. public void work(BookList bookList) {//重写IOPeration类中的work方法
    4. System.out.println("查找图书!");
    5. System.out.println("请输入要查找的图书名字");
    6. Scanner scanner=new Scanner(System.in);
    7. String name=scanner.nextLine();
    8. int currentSize= bookList.getUsedSize();
    9. for (int i=0;i
    10. Book book=bookList.getBook(i);
    11. if(book.getName().equals(name)){//判断查找图书名字是否相同
    12. System.out.println("查到了:");
    13. System.out.println(book);//输出图书信息
    14. }else {
    15. System.out.println("没有这本书");
    16. }
    17. }
    18. }
    19. }

     3.4 增加图书

    我们要先输入新增图书信息,new一个对象,判断这本图书是否已经存在,如果不存在,则存入书架中。

    AddOperation类:

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class AddOperation implements IOPeration {
    6. public void work(BookList bookList){
    7. System.out.println("新增图书!");
    8. Scanner scanner=new Scanner(System.in);
    9. System.out.println("请输入新增图书名字:");
    10. String name= scanner.nextLine();
    11. System.out.println("请输入新增图书作者:");
    12. String author=scanner.nextLine();
    13. System.out.println("请输入价格");
    14. int price=scanner.nextInt();
    15. Scanner scanner2=new Scanner(System.in);
    16. System.out.println("请输入小说类型:");
    17. String type=scanner2.nextLine();
    18. Book book=new Book(name,author,price,type);
    19. int currentSize= bookList.getUsedSize();
    20. for (int i=0;i
    21. Book temp=bookList.getBook(i);
    22. if(temp.getName().equals(name)){//判断查找图书名字是否相同
    23. System.out.println("已经有这本书了");
    24. return;
    25. }
    26. }
    27. bookList.setBooks(book);
    28. System.out.println("新增图书成功!");
    29. //修改图书数量
    30. bookList.setUsedSize(currentSize+1);
    31. }
    32. }

     bookList.setBooks(book);这个语句,我们需要在书架那个类加上setBooks()方法:

    1. public void setBooks(Book book){
    2. this.books[usedSize]=book;
    3. }

     🍓注意!!!

    在增加图书的时候,我遇到了困难。

    我在价格的地方,设置的是int类型。 int price=scanner.nextInt();这个语句执行完,它就不会执行后面的输入语句了。这是我疏忽的一个点。

    有三种解决方案。

    1.像我上面的代码一样,多写一个  Scanner scanner2=new Scanner(System.in); 这是改动最小的方法了。

    2.就是把图书的价格和类型的顺序调换一下,就是要几个文件都改一小下,其实也很快。这样子int price=scanner.nextInt();,最后输这个输入命令的话,就能保证输入命令全部执行

    3.这个方法也比较简单,就是把图书的价格类型改成String,那样子,就没有影响了。

    3.5 删除图书 

    🍆删除图书,我们要注意,不仅仅是把那本书删除就好了,还需要把后面的书往前挪。

    DelOperation类:

    1. public void work(BookList bookList) {
    2. System.out.println("删除图书!");
    3. System.out.println("请输入要删除图书的名称");
    4. Scanner scanner=new Scanner(System.in);
    5. String name=scanner.nextLine();
    6. int currentSize= bookList.getUsedSize();
    7. int index=-1;
    8. for (int i=0;i
    9. Book temp=bookList.getBook(i);
    10. if(temp.getName().equals(name)){//判断查找图书名字是否相同
    11. index=i;
    12. break;
    13. }
    14. }
    15. //删除图书,把后面的图书往前面挪
    16. for (int j=index;j1;j++){
    17. Book book=bookList.getBook(j+1);//拿到j下标后面的书
    18. bookList.setBooks(j,book);//放到j下标的位置
    19. }
    20. bookList.setUsedSize(currentSize-1);//修改size值
    21. bookList.setBooks(currentSize-1,null);//因为删除的是对象,所以把地址置为null,就没有人引用了
    22. }

    BookList类:

    1. public void setBooks(int pos,Book book){
    2. this.books[pos]=book;
    3. }

    我们可以注意到在BookList新添加的这个方法跟刚才在写增加图书时放置图书的方法相似。不过,我们可以注意到,增加图书,就是在最后面放一本书,就好了。而这里,是把后面的书一本本往前挪一个书位。

    3.6 借阅图书

    思路:判断图书是否在书库中存在,判断图书是否已经被借出。满足条件,执行

    temp.setBorrowed(true);

    3.7 归还图书 

    思路:判断图书是否在书库中存在,判断书是否已被借出。

    满足条件:

    temp.setBorrowed(false);

    总代码

    Book:

    1. package book;
    2. public class Book {
    3. private String name;//书名
    4. private String author;//作者
    5. private int price;//价格
    6. private String type;//类型
    7. private boolean isBorrowed;//是否被借出,初始值是false,在构造方法中不用写
    8. public Book(String name, String author, int price, String type) {//构造方法
    9. this.name = name;
    10. this.author = author;
    11. this.price = price;
    12. this.type = type;
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. this.name = name;
    19. }
    20. public String getAuthor() {
    21. return author;
    22. }
    23. public void setAuthor(String author) {
    24. this.author = author;
    25. }
    26. public int getPrice() {
    27. return price;
    28. }
    29. public void setPrice(int price) {
    30. this.price = price;
    31. }
    32. public String getType() {
    33. return type;
    34. }
    35. public void setType(String type) {
    36. this.type = type;
    37. }
    38. public boolean isBorrowed() {
    39. return isBorrowed;
    40. }
    41. @Override
    42. public String toString() {
    43. return "Book{" +
    44. "name='" + name + '\'' +
    45. ", author='" + author + '\'' +
    46. ", price=" + price +
    47. ", type='" + type + '\'' +
    48. ", isBorrowed=" +(isBorrowed==true?" 已借出":" 未借出") +
    49. '}';
    50. }
    51. public void setBorrowed(boolean borrowed) {
    52. isBorrowed = borrowed;
    53. }
    54. }

     BookList

    1. package book;
    2. //书架
    3. public class BookList {
    4. private static final int DEFAULT_SIZE=10;
    5. private Book[] books=new Book[DEFAULT_SIZE];//这个书架可以放十本书
    6. public BookList(){//构造方法
    7. books[0]=new Book("《三国演义》","罗贯中",40,"小说");
    8. books[1]=new Book("《西游记》","吴承恩",60,"小说");
    9. books[2]=new Book("《红楼梦》","曹雪芹",45,"小说");
    10. this.usedSize=3;
    11. }
    12. //通过这个方法,实现ShowOperation中的通过下标打印数组元素
    13. public Book getBook(int pos){
    14. return this.books[pos];
    15. }
    16. public void setBooks(Book book){
    17. this.books[usedSize]=book;
    18. }
    19. public void setBooks(int pos,Book book){
    20. this.books[pos]=book;
    21. }
    22. private int usedSize;//记录下当前book数组中有几本书
    23. public int getUsedSize() {
    24. return usedSize;
    25. }
    26. public void setUsedSize(int usedSize) {
    27. this.usedSize = usedSize;
    28. }
    29. }

    AddOperation

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class AddOperation implements IOPeration {
    6. public void work(BookList bookList){
    7. System.out.println("新增图书!");
    8. Scanner scanner=new Scanner(System.in);
    9. System.out.println("请输入新增图书名字:");
    10. String name= scanner.nextLine();
    11. System.out.println("请输入新增图书作者:");
    12. String author=scanner.nextLine();
    13. System.out.println("请输入价格");
    14. int price=scanner.nextInt();
    15. Scanner scanner2=new Scanner(System.in);
    16. System.out.println("请输入小说类型:");
    17. String type=scanner2.nextLine();
    18. Book book=new Book(name,author,price,type);
    19. int currentSize= bookList.getUsedSize();
    20. for (int i=0;i
    21. Book temp=bookList.getBook(i);
    22. if(temp.getName().equals(name)){//判断查找图书名字是否相同
    23. System.out.println("已经有这本书了");
    24. return;
    25. }
    26. }
    27. bookList.setBooks(book);
    28. System.out.println("新增图书成功!");
    29. //修改图书数量
    30. bookList.setUsedSize(currentSize+1);
    31. }
    32. }

    BorrwOperation:

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class BrrowOperation implements IOPeration{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("借阅图书!");
    9. System.out.println("请输入要借阅的图书名字:");
    10. Scanner scanner=new Scanner(System.in);
    11. String name=scanner.nextLine();
    12. int curentSize= bookList.getUsedSize();
    13. int x=1;
    14. for(int i=0;i
    15. Book temp=bookList.getBook(i);
    16. if((temp.getName().equals(name))&&!temp.isBorrowed()){
    17. {
    18. temp.setBorrowed(true);
    19. x=0;
    20. System.out.println("借阅成功!");
    21. return;
    22. }
    23. }
    24. }
    25. if(x==1){
    26. System.out.println("没有该图书");
    27. }
    28. }
    29. }

    DelOperation:

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class DelOperation implements IOPeration{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("删除图书!");
    9. System.out.println("请输入要删除图书的名称");
    10. Scanner scanner=new Scanner(System.in);
    11. String name=scanner.nextLine();
    12. int currentSize= bookList.getUsedSize();
    13. int index=-1;
    14. int z=0;
    15. for (int i=0;i
    16. Book temp=bookList.getBook(i);
    17. if(temp.getName().equals(name)){//判断查找图书名字是否相同
    18. index=i;
    19. z=1;
    20. break;
    21. }
    22. }
    23. if(z==0){
    24. System.out.println("没有这本书!");
    25. return;
    26. }
    27. //删除图书,把后面的图书往前面挪
    28. for (int j=index;j1;j++){
    29. Book book=bookList.getBook(j+1);//拿到j下标后面的书
    30. bookList.setBooks(j,book);//放到j下标的位置
    31. }
    32. bookList.setUsedSize(currentSize-1);//修改size值
    33. bookList.setBooks(currentSize-1,null);//因为删除的是对象,所以把地址置为null,就没有人引用了
    34. System.out.println("删除成功!");
    35. }
    36. }

    ExitOperation:

    1. package opera;
    2. import book.BookList;
    3. public class ExitOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("退出系统!");
    7. System.exit(0);//退出系统。0代表正常退出
    8. }
    9. }

     FindOperation:

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class FindOperation implements IOPeration{//继承
    6. @Override
    7. public void work(BookList bookList) {//重写IOPeration类中的work方法
    8. System.out.println("查找图书!");
    9. System.out.println("请输入要查找的图书名字");
    10. Scanner scanner=new Scanner(System.in);
    11. String name=scanner.nextLine();
    12. int currentSize= bookList.getUsedSize();
    13. for (int i=0;i
    14. Book book=bookList.getBook(i);
    15. if(book.getName().equals(name)){//判断查找图书名字是否相同
    16. System.out.println("查到了:");
    17. System.out.println(book);//输出图书信息
    18. return;
    19. }
    20. }
    21. System.out.println("没有这本书!");
    22. }
    23. }

    IOPeration: 

    1. package opera;
    2. import book.BookList;
    3. public interface IOPeration {//创建接口
    4. void work(BookList bookList);//抽象方法
    5. //功能主要是针对图书的,也就是针对书架。
    6. }

     ReturnOperation:

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class ReturnOperation implements IOPeration{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("归还图书!");
    9. System.out.println("请输入要归还的图书名字:");
    10. Scanner scanner=new Scanner(System.in);
    11. String name=scanner.nextLine();
    12. int curentSize= bookList.getUsedSize();
    13. for(int i=0;i
    14. Book temp=bookList.getBook(i);
    15. if((temp.getName().equals(name))&&temp.isBorrowed()){
    16. {
    17. temp.setBorrowed(false);
    18. System.out.println("归还成功!");
    19. return;
    20. }
    21. }
    22. }
    23. }
    24. }

    ShowOperation:

    1. package opera;
    2. import book.BookList;
    3. public class ShowOperation implements IOPeration{
    4. @Override
    5. public void work(BookList bookList) {
    6. System.out.println("显示图书!");
    7. int currentSize= bookList.getUsedSize();
    8. for (int i=0;i
    9. System.out.println(bookList.getBook(i));
    10. }
    11. }
    12. }

    Main

    1. import book.BookList;
    2. import user.AdminUser;
    3. import user.NormalUser;
    4. import user.User;
    5. import java.util.Scanner;
    6. public class Main {
    7. //登录
    8. public static User login() {
    9. System.out.println("请输入你的姓名:");
    10. Scanner scanner = new Scanner(System.in);
    11. String name = scanner.nextLine();
    12. System.out.println("请选择你的身份:1->管理员 0->普通用户");
    13. int choice = scanner.nextInt();
    14. if (choice == 1) {
    15. //说明是管理员
    16. //由于有返回值,所以我们的方法返回值就不能写void了。但是我们也无法确定返回值是什么,可能是管理员,可能是用户。所以,用向上转型,写User.
    17. return new AdminUser(name);//返回实例化一个管理员对象
    18. } else {
    19. return new NormalUser(name);//返回实例化一个用户对象
    20. }
    21. }
    22. public static void main(String[] args) {
    23. User user = login();//执行上面的login方法
    24. BookList bookList = new BookList();
    25. while (true) {
    26. int choice = user.menu();//实现打印菜单
    27. user.doWork(choice, bookList);
    28. }
    29. }
    30. }

    测试的话,运行Main:

    user代码

    AdminUer

    1. package user;
    2. import opera.*;
    3. import java.util.Scanner;
    4. public class AdminUser extends User{
    5. public AdminUser(String name) {
    6. super(name);
    7. this.ioPerations=new IOPeration[]{
    8. new ExitOperation(),
    9. new FindOperation(),
    10. new AddOperation(),
    11. new DelOperation(),
    12. new ShowOperation()
    13. };
    14. }
    15. @Override
    16. public int menu() {//因为返回值choice是int类型的
    17. System.out.println("____________________________________");
    18. System.out.println("1.查找图书");
    19. System.out.println("2.新增图书");
    20. System.out.println("3.删除图书");
    21. System.out.println("4.显示图书");
    22. System.out.println("0.退出系统");
    23. System.out.println("请选择你需要的功能:");
    24. Scanner scanner=new Scanner(System.in);
    25. int choice=scanner.nextInt();
    26. return choice;
    27. }
    28. }

    NormalUser

    1. package user;
    2. import opera.*;
    3. import java.util.Scanner;
    4. public class NormalUser extends User{
    5. public NormalUser(String name) {
    6. super(name);
    7. this.ioPerations=new IOPeration[]{//引用,这边用super也可以,因为这里没有同名的,不需要做区分。用this最好
    8. new ExitOperation(),
    9. new FindOperation(),
    10. new BrrowOperation(),
    11. new ReturnOperation()
    12. //以动态方式申请内存。拿到变量后,我们就给他们分配内存
    13. };
    14. }
    15. @Override
    16. public int menu() {
    17. System.out.println("_________________");
    18. System.out.println("hello,"+name+"~");
    19. System.out.println("1.查找图书!");
    20. System.out.println("2.借阅图书!");
    21. System.out.println("3.归还图书!");
    22. System.out.println("0.退出系统!");
    23. Scanner scanner=new Scanner(System.in);
    24. int choice=scanner.nextInt();
    25. return choice;
    26. }

    User

    1. package user;
    2. import book.BookList;
    3. import opera.IOPeration;
    4. public abstract class User {//抽象类
    5. protected String name;//名字.这边的protect代表的是名字的权限。如果是private,它只能在同一个包的同一类使用。就不能让AdminUser类继承了。写public的话
    6. //权限太大了,不是很好。
    7. protected IOPeration[] ioPerations;
    8. public User(String name) {//构造方法
    9. this.name = name;
    10. }
    11. public abstract int menu();//抽象方法,打印菜单,因为有了choice返回值int类型,所以void改成int
    12. public void doWork(int choice, BookList bookList){//通过选择的操作,去选择执行数组下的哪个操作
    13. this.ioPerations[choice].work(bookList);
    14. }
    15. }

  • 相关阅读:
    java基础08
    HTML+CSS:实现心动的感觉!
    【准研一学习】狂肝15小时整理的Verilog语言入门知识
    C++启航跟沸羊羊有关系吗?
    C中的基本函数
    数据结构与算法之Hash&BitMap
    能添加任意贴图超级复布局的初级智能文本提示器
    半个小时!!! 项目轻松部署到Linux
    vue.js scss >>> 失效的问题
    hdfs集群的扩容和缩容
  • 原文地址:https://blog.csdn.net/m0_65683419/article/details/127936230