目录
功能
功能实现
Book包
Book类
?BookList类
Operation包
User包
user类
?Administrator类
Normaluser类
Main包
初步调试
方法实现
AddOperation(增添)
DisplayOperation(打印)
FindOperation(查找)
BorrowOperation(借书)
ReturnOperation(还书)
DelOperation(删除)
ExitOperation(退出 )
运行截图
完整代码
功能
面向不同对象有不同的功能选择,分为管理员和普通用户。管理员登录需要密码,普通用户则不需要。管理员能增加图书或删除图书,其余与普通用户一样,普通用户则有查阅图书信息,借阅和归还图书等。前提:需要了解java面向对象编程的一些应用。
可以参考:java面向对象编程
功能实现
Book包
首先我们需要建一个存储图书基本信息的Book类,里面有名称,作者,价格,类型,是否被借出。在建立一个Booklist类,作为类似书架的东西存储书,Booklist存储每本书的基本信息,书的最大容量,书的现有容量。再将它们一起装在一个Book包下。
Book类
考虑到后续需要增添或删除图书,我们为Book类搭建一个构造方法为图书基本信息赋值。为了让图书信息按照我们所需求的格式输出,我们需要重写toString方法。不了解toString的如下图所示:
?
?
?我们通过将鼠标放在方法上按住ctrl点过去,到达toString方法,它是返回一个“类名+符号@+对象所包含哈希值”,其实就是返回一串字符串。我们通过重写让其按照我们所需的格式输出即可,具体信息有兴趣的可以去查阅资料,博主在此不在多说了。
?BookList类
为了合理我们首先为书架存储四本书--四大名著。建立一个Book类型的数组,为其赋予最大容量值10,以及现有容量4,因为考虑后面需要增删,因此我们将usedSize设置为static型。
因为涉及查找,我们为书架构造几个方法,一个知道现有容量额方法,一个能通过下标访问图书信息。还有增添和删除,因此还要构造改变现有容量的方法,为书架改变书的方法(其实是按照下标给书赋值,增添一本书,但后续的这个方法有妙用)。
Operation包
这是一个方法包,我们将所有的方法都写在这个包里,如:增添图书,删除图书,查找图书,显示图书,借阅图书,归还图书,退出系统等。我们先简单实现一下这些方法,之后等系统完善后再来为这些方法写入逻辑。因为这些方法都是在一个书架上实现的嘛,所以我们为这些方法传入一个BookList类型的参数。
public class AddOperation{
public void work(BookList bookList) {
System.out.println("增添成功!");
}
}
?把所有方法基本都先写成这个样,之后再完善。
因为我们之后要面向对象--管理员和用户,所以不同对象的功能肯定要不同,那我们又怎样在不同对象时调用不同的方法呢。这就是我们需要考虑的多态了,我们知道只要一个类实现了一个接口,那么就可以通过接口的引用调用这个类重写接口的方法,那么为这些类都实现一个共同的接口IOperation,让这个接口定义一个work方法,其他的类都去重写这个方法,那么我们就可以通过接口调用这些方法了,而在接口内实例化了一个scanner对象,那么实现这个接口的类也同样继承了这个对象,所以免去了冗余代码。
public interface IOperation {
public void work(BookList bookList);
Scanner scanner = new Scanner(System.in);
}
public class AddOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("增添成功!");
}
}
......
等等
......
User包
有了接口,我们能通过接口调用这些方法了,但是怎么面向对象呢?
我们定义一个user类作为父类,Administrator类作为管理员类,Normaluser作为普通用户类。
接口有一个很大的好处,那就是可以建造一个接口数组,而数组里的成员则可以是实现这个接口的类,这就意味着当我们数组里的成员不同时,可以调用的方法也将不同。
user类
我们在父类user下设立一个IOperation接口的引用,那么在管理员类和普通用户类下面则可以实现这个接口数组。因为需要对象知道他有哪些功能,于是我们在user类下面构造了一个菜单界面,方便对象使用功能。而有了菜单后,对象怎么调用功能就是通过 接口数组了,而数组需要传下标,所以加入了choice作为选择功能。
public abstract class User {
protected IOperation[] iOperations;
abstract public int Menu();
abstract public void DoWork(int choice, BookList bookList);
}
?Administrator类
管理员继承了user类,需要重写user的方法,菜单界面很简单,将功能写上即可。
public int Menu(){
System.out.println("-------------菜单--------------");
System.out.println("1.增加图书");
System.out.println("2.查找图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
}
至于功能调用方法则稍复杂了点。我们首先需要为管理员类构造一个构造方法,这样才可以真正有了接口的引用,然后再通过这个引用实例化一个接口数组,并为其写入成员。
public Administrator(){
super();
this.iOperations = new IOperation[]{
new AddOperation(),
new FindOperation(),
new DelOperation(),
new DisplayOperation(),
new ExitOperation()
};
}
这样分行写只是为了好看,也可以一行写。
而要调用这个数组里的方法,我们写了一个Dowork方法,为其传入下标及书架。
调用就很简单了,通过接口数组的下标引用指向了这个类,在通过类下的work方法真正的实现方法。
public void DoWork(int choice, BookList bookList) {
iOperations[choice].work(bookList);
}
Normaluser类
普通用户类与管理员类大同小异,只是改了数组成员的顺序。
public NormalUser(){
super();
this.iOperations = new IOperation[]{
new BorrowOperation(),
new FindOperation(),
new ReturnOperation(),
new DisplayOperation(),
new ExitOperation()
};
}
public int Menu(){
System.out.println("-------------菜单--------------");
System.out.println("1.借阅图书");
System.out.println("2.查找图书");
System.out.println("3.归还图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
public void DoWork(int choice, BookList bookList) {
iOperations[choice].work(bookList);
}
Main包
有了这么多包后,我们需要进入这个系统,那么就需要建立一个新的包了。
Main包下只有一个Test类。而这个类需要对象来使用。
登录系统之前我们需要输入姓名及身份,当是管理员时,需要输入登录密码,而登录密码我们可以设在管理员类里,只要对象输入的密码与管理员密码匹配时,则登录成功,不然则重新输入。
如果登录成功后则给他返回一个user类型的参数,管理员就是new Administrator();,普通用户则是new Normaluser();这其中又发生了向上转型。
public static User Login() {
System.out.println("请输入你的姓名:");
Scanner user = new Scanner(System.in);
String name = user.nextLine();
System.out.println("请输入你的身份->> 1.管理员 0.用户");
int choice = user.nextInt();
if (choice == 1) {
System.out.println("请输入管理员密码:");
String on = user.nextLine();
int in = user.nextInt();
if (in == Administrator.password) {
System.out.println("hello " + name + " 欢迎回来!");
return new Administrator();
} else {
System.out.println("密码错误!");
return null;
}
} else {
System.out.println("hello " + name + " 欢迎回来!");
return new NormalUser();
}
}
我们在test类下建立一个书架类,在用一个user类型的引用接收Login。
在通过一个循环可以调用这些方法,直至退出系统。
BookList bookList = new BookList();
User user = Login();
while(true) {
int choice = user.Menu();
user.DoWork(choice, bookList);
}
可别小看这几行代码,这几行代码可以说是整个系统的精髓,发生了向上转型、动态绑定,也就是多态。
初步调试
当我们写完了如上这些代码后,我们的登录界面基本就搞定了,面向对象也行的通了。那么我们来进行初步调试系统:
运行结构后为如下界面:
?
?调试结果很成功,那么接下来就是完成这些类里面的方法了。
方法实现
AddOperation(增添)
System.out.println("请输入书的姓名");
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();
这几行没什么难度,但有个注意点,将int类型最后写,否则你会写的很难受,这就是java不好的一个点了,输入输出做的很差劲。
其次因为java的输入输出会将我们的增添方法搞乱,就是当我们连续增加两本书时,第一本输完的price后的那个回车会被我们第二次增加书的name接收,导致第二本书的名字为空。于是我们又设计了一个scanner去将这个回车接收掉,使它不在被我们需要的接收。
String in = scanner.nextLine();
最后在给书架上增添一本书:
int size = bookList.getusedSize();
Book book = new Book(name,author,price,type);
bookList.setBooks(size,book);
bookList.setusedSize(size+1);
那么增添的逻辑就完全了。
DisplayOperation(打印)
打印有点小难度,主要是数组里的成员怎么打印?
我们发现数组里的成员都是Book类型,那么我们再通过Book创建一个对象指向这个成员,再输出呗!于是我们之前埋下的伏笔就应验了,通过下标访问书架类的书的信息。
for(int i = 0;i<bookList.getusedSize();i++){
Book book = bookList.getBook(i);
System.out.println(book);
}
那么这三行代码想到就不难了吧。
那么打印逻辑也好了。
FindOperation(查找)
打印都完成了,那么查找其实和打印也差不多,都是创建一个Book类对象指向书架上的书。然后将对象指向的书的名称与要查找的书的名称进行比较,逻辑不又通了吗!
int i;
System.out.println("请输入书名");
String name = scanner.nextLine();
for(i = 0;i<bookList.getusedSize();i++){
Book book = bookList.getBook(i);
if(book.name.equals(name)){
System.out.println("查找成功!");
System.out.println(bookList.getBook(i));
break;
}
}
if(i>=bookList.getusedSize()){
System.out.println("查找失败");
}
BorrowOperation(借书)
借书又和上面的查找有点类似,当我们查到这本书后,直接将书的一个属性是否被借出改为true就行了。
public void work(BookList bookList) {
System.out.println("请输入要借的的书名");
String name = scanner.nextLine();
int size = bookList.getusedSize();
for (int i = 0; i < size; i++) {
Book book = bookList.getBook(i);
if(book.name.equals(name)){
book.isBorrow = true;
System.out.println("借阅成功!");
return;
}
}
System.out.println("没有你要借的书");
}
ReturnOperation(还书)
还书直接和借书一模一样,将true改为false即可。
public void work(BookList bookList) {
System.out.println("请输入要归还的的书名");
String name = scanner.nextLine();
int size = bookList.getusedSize();
for (int i = 0; i < size; i++) {
Book book = bookList.getBook(i);
if(book.name.equals(name)){
book.isBorrow = false;
System.out.println("归还成功!");
return;
}
}
}
DelOperation(删除)
删除与上述类似,但略有不同。首先要找出要删除书的下标,与查找类似,接着借用之前BookList的一个方法插入方法setBook():这个方法有两个参数,下标和Book类型,那么在回忆顺序表的删除是怎样删的?后一个的数据等于前一个,进行覆盖删除,那么这个setBook直接将后一个位置的下标和信息赋给前一个,直接就相当于边插入边删除了。逻辑通了,直接上代码:
public void work(BookList bookList) {
System.out.println("请输入要删除的书名");
String name = scanner.nextLine();
int i = 0;
int size = bookList.getusedSize();
for (i = 0;i<size;i++){
Book book = bookList.getBook(i);
if(book.name.equals(name)){
break;
}
}
if(i < size ){
for (int j = i; j < size-1; j++) {
Book book = bookList.getBook(j+1);
bookList.setBooks(j,book);
}
System.out.println("删除成功!");
bookList.setBooks(size,null);
bookList.setusedSize(size-1);
}else if(i>=size){
System.out.println("没有你要删除的书");
}
}
ExitOperation(退出 )
退出更简单了,直接借用system的方法
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);
}
运行截图
系统的所有逻辑已经实现了,那么直接看结果:
管理员:
?
?普通用户:
?
完整代码
Book包
package Book;
public class Book {
public String name;//图书名称
private String author;//图书作者
private int price;//图书价格
private String type;//图书类型
public boolean isBorrow;//是否借出
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +" "+
((isBorrow==true)? "已借出" : "未借出")+'}';
}
}
package Book;
import java.util.Arrays;
public class BookList {
private Book[] books = new Book[10];
public static int usedSize;
public BookList(){
books[0] = new Book("三国演义","罗贯中",20,"小说");
books[1] = new Book("水浒传","施耐庵",20,"小说");
books[2] = new Book("西游记","吴承恩",20,"小说");
books[3] = new Book("红楼梦","曹雪芹",20,"小说");
usedSize = 4;
}
public Book getBook(int pos){
return this.books[pos];
}
public int getusedSize(){
return usedSize;
}
public void setusedSize(int size){
usedSize = size;
}
public void setBooks(int size,Book book){
this.books[size] = book;
}
}
?Operation包
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("请输入书的姓名");
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();
String in = scanner.nextLine();
int size = bookList.getusedSize();
Book book = new Book(name,author,price,type);
bookList.setBooks(size,book);
bookList.setusedSize(size+1);
System.out.println("增添成功!");
}
}
package Operation;
import Book.Book;
import Book.BookList;
public class BorrowOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("请输入要借的的书名");
String name = scanner.nextLine();
int size = bookList.getusedSize();
for (int i = 0; i < size; i++) {
Book book = bookList.getBook(i);
if(book.name.equals(name)){
book.isBorrow = true;
System.out.println("借阅成功!");
return;
}
}
System.out.println("没有你要借的书");
}
}
package Operation;
import Book.Book;
import Book.BookList;
public class DelOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("请输入要删除的书名");
String name = scanner.nextLine();
int i = 0;
int size = bookList.getusedSize();
for (i = 0;i<size;i++){
Book book = bookList.getBook(i);
if(book.name.equals(name)){
break;
}
}
if(i < size ){
for (int j = i; j < size-1; j++) {
Book book = bookList.getBook(j+1);
bookList.setBooks(j,book);
}
System.out.println("删除成功!");
bookList.setBooks(size,null);
bookList.setusedSize(size-1);
}else if(i>=size){
System.out.println("没有你要删除的书");
}
}
}
package Operation;
import Book.Book;
import Book.BookList;
public class DisplayOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("打印图书!");
for(int i = 0;i<bookList.getusedSize();i++){
Book book = bookList.getBook(i);
System.out.println(book);
}
}
}
package Operation;
import Book.BookList;
public class ExitOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("退出系统!");
System.exit(0);
}
}
package Operation;
import Book.Book;
import Book.BookList;
public class FindOperation implements IOperation{
public void work(BookList bookList) {
int i;
System.out.println("请输入书名");
String name = scanner.nextLine();
for(i = 0;i<bookList.getusedSize();i++){
Book book = bookList.getBook(i);
if(book.name.equals(name)){
System.out.println("查找成功!");
System.out.println(bookList.getBook(i));
break;
}
}
if(i>=bookList.getusedSize()){
System.out.println("查找失败");
}
}
}
package Operation;
import Book.Book;
import Book.BookList;
public class ReturnOperation implements IOperation{
public void work(BookList bookList) {
System.out.println("请输入要归还的的书名");
String name = scanner.nextLine();
int size = bookList.getusedSize();
for (int i = 0; i < size; i++) {
Book book = bookList.getBook(i);
if(book.name.equals(name)){
book.isBorrow = false;
System.out.println("归还成功!");
return;
}
}
}
}
package Operation;
import Book.BookList;
import java.util.Scanner;
public interface IOperation {
public void work(BookList bookList);
Scanner scanner = new Scanner(System.in);
}
?user包
package User;
import Book.BookList;
import Operation.*;
import java.util.Scanner;
public class Administrator extends User{
public static int password = 123456;
public Administrator(){
super();
this.iOperations = new IOperation[]{
new ExitOperation(),
new AddOperation(),
new FindOperation(),
new DelOperation(),
new DisplayOperation()
};
}
@Override
public void DoWork(int choice, BookList bookList) {
iOperations[choice].work(bookList);
}
public int Menu(){
System.out.println("-------------菜单--------------");
System.out.println("1.增加图书");
System.out.println("2.查找图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
package User;
import Book.BookList;
import Operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(){
super();
this.iOperations = new IOperation[]{
new ExitOperation(),
new BorrowOperation(),
new FindOperation(),
new ReturnOperation(),
new DisplayOperation()
};
}
@Override
public void DoWork(int choice, BookList bookList) {
iOperations[choice].work(bookList);
}
public int Menu(){
System.out.println("-------------菜单--------------");
System.out.println("1.借阅图书");
System.out.println("2.查找图书");
System.out.println("3.归还图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
package User;
import Book.BookList;
import Operation.IOperation;
public abstract class User {
protected IOperation[] iOperations;
abstract public int Menu();
abstract public void DoWork(int choice, BookList bookList);
}
?Main包
package Main;
import Book.BookList;
import User.Administrator;
import User.NormalUser;
import User.User;
import java.util.Scanner;
public class Test {
public static User Login() {
System.out.println("请输入你的姓名:");
Scanner user = new Scanner(System.in);
String name = user.nextLine();
System.out.println("请输入你的身份->> 1.管理员 0.用户");
int choice = user.nextInt();
if (choice == 1) {
System.out.println("请输入管理员密码:");
String on = user.nextLine();
int in = user.nextInt();
if (in == Administrator.password) {
System.out.println("hello " + name + " 欢迎回来!");
return new Administrator();
} else {
System.out.println("密码错误!");
return null;
}
} else {
System.out.println("hello " + name + " 欢迎回来!");
return new NormalUser();
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = Login();
while(true) {
if (user == null) {
user = Login();
}else if(user !=null){
break;
}
}
while(true) {
int choice = user.Menu();
user.DoWork(choice, bookList);
}
}
}
图书管理系统到此结束了,感兴趣的可以继续研究下去哦。
|