目录
1.实现效果
在实现这个小项目前,我们首先需要了解我们需要实现上面功能及实现后的效果。
2.大体思路
首先在我们实现这个简易的图书管理系统之前,我们需要用面向对象的思维去思考。抽象出我们大致要实现哪些对象。比如我们在这里根据效果图不难想到应该有user(用户),operation(操作),book(书籍)这三大对象。
所以我们决定创建三个包,user,operation,book,便于我们后续的管理与功能的实现
1.首先我们要有书,所以创建Book类存放每本书的基本信息
2.图书馆有很多书,所以创建Books类存放好几本书,里面放了一个Book类型的数组和一个usedSize表示总共书的数目,同时初始化book的构造方法以及get和set方法其余成员变量/方法设置为private实现封装
3.有两种不同的人,管理员和用户,总共有7个功能,也就是要写7个功能类
4.然后我们发现,这7个功能类都要定义这么一个work方法,而且都是对BookList进行操作的,因此我们可以设置一个接口IOperation增加代码规范性,让这些功能类实现这个接口
5.接下来我们看到User这个包,这里面有两种用户,一个是管理员,一个是普通用户,注意到他们都有各自的菜单,同时他们都有姓名等一些公共的属性,所以这里我们可以定义一个User父类,让AdminUser和 NormalUser去继承这个类,以减少代码冗余。
6.注意到这里两种用户的菜单不一样,所以我们可以在User类里面定义一个空的menu方法,然后让另外两个类去实现,以后还可以方便进行多态,更加灵活,因此我们用到了抽象方法,所以需要将User类和menu方法用abstract修饰。
7.menu显示了要输入一个数字代表你要使用的功能,所以需要返回一个数字代表你所使用的功能,这里可以把menu方法定义为返回值为int型的方法
8.接下来我们实现main方法,在main方法前我们首先需要实现login(登录)方法,通过读入用户的名称以及用户类型来创建并返回相对应的用户,然后接收相对应用户并调用相应的menu方法(user.menu),这里的实现便运用了多态,通过返回值让父类引用引用了子类的对象,同时父类的引用调用了子类重写过的同名方法。
9.经过了上述的步骤,我们的user已经完成了动态绑定,就相当于我们已经知道了他是普通用户还是管理员。那么接下来的关键就是我们如何根据用户的选择来调用相应的方法呢?
此时我们需要在User父类里创建一个接口数组便于我们调用相对应方法。
之后我们要在相应的用户类里去初始化。我们以NormalUser为例。
接下来我们需要在User父类一个doOperation方法来去调用数组里面的方法。
3.代码实现
由于java与c的实现大同小异,区别基本只在于面向对象的思想,这里我们仅以Add方法为例子进行讲解,其余代码可参考C语言实现通讯录——有关文件操作介绍_invictusQAQ的博客-CSDN博客
AddOperation,让用户输入图书相应的信息,然后新建一个book类,初始化放到bookList的usedSize位置即可,之后别忘了更新usedSize ,代码如下:
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration{
public void work(BookList bookList){
System.out.println("新增图书");
System.out.println("请输入图书的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入图书的作者:");
String author = scanner.nextLine();
System.out.println("请输入图书的类型:");
String type = scanner.nextLine();
System.out.println("请输入图书的价格:");
int price = scanner.nextInt();
Book book=new Book(name,author,price,type);
int currentSize=bookList.getUsedSize();
bookList.setBooks(currentSize,book);
bookList.setUsedSize(currentSize+1);
System.out.println("新增成功!");
}
}
其余项目完整代码我将放在gitee上供大家参考,链接见下: