文章目录
- 项目介绍
- 项目功能
- 代码讲解
- 如何实现不同用户之间的操作权限不同
项目介绍
该项目是用的是javase的一些知识包括了类和对象封装,继承多态等面向对象的三大特性。主要是为了让我们能够更好的使用之前学到的知识。
接下来给大家讲解一下这个项目的一个特点。首先就是登录
登录的时候给大家了两个选择一个是普通用户一个是超级用户,并且这些用户的权限也是不一样的。
如果你选择普通用户那么你的操作权限是上面那些
超级用户是下面这些。
项目功能
项目的功能也就是上面两张图所显示的哪些,当然这里面比较难的几个是哪些呢?我认为比较困难的是增加图书、删除图书、如何实现不同用户类型之间可以操作的权限不同、如何实现按下不同的数字达到实现相应的操作。
那么这些也就是这个项目我认为比较重要的地方
然后我们先来了解一下这个项目比较重要的两个类那就是Book和BookList这两个类是我们接下来最重要的两个类,因为首先既然是图书管理系统那么这个图书肯定是要用一个类的,其次存放图书的是什么呢?是书架因此书架也应该用一个类接下来我们看一下这两个类的代码
Book
package Book;
/**
* @Author 12629
* @Description: 书
*/
public class Book {
private String name;
private int Price;
private String Book_Type;
public boolean isBrow=false;
public Book(String name,int Price,String Book_Type){
this.name=name;
this.Price=Price;
this.Book_Type=Book_Type;
}
public String toString() {
return "Book{" + "name='" + name + '\'' +
", price=" + Price +
", type='" + Book_Type +
'\''
+ ((isBrow == true) ? " 已经借出" : " 未被借出") +
/*", isBorrowed=" + isBorrowed +*/
'}';
}
public boolean GetisBrow(){
return isBrow;
}
public String GetName(){
return this.name;
}
}
BookList
package Book;
import java.lang.reflect.Array;
public class BookList {
private Book[] books;
private int Upsize;
private static final int DEFAULT_CAPACITY = 10;
public BookList(){
this.books=new Book[DEFAULT_CAPACITY];
this.books[0]=new Book("三国演义",20,"小说");
this.books[1]=new Book("红楼梦",10,"小说");
this.books[2]=new Book("西游记",25,"小说");
this.books[3]=new Book("zyficl",100,"爱情");
this.Upsize=4;
}
public int GetBookListLength(){
return books.length;
}
public int GetUpsize(){
return Upsize;
}
public void Expansion(){
Book[] books1=new Book[Upsize*2];
System.arraycopy(books,0,books1,0,books.length);
books=books1;
books1=null;
}
public void Add(String name,int Price,String bookType){
books[Upsize]=new Book(name,Price,bookType);
Upsize++;
}
public void show(){
for(int i=0;i<Upsize;i++){
System.out.println(books[i]);
}
}
public Book FindBook(String name){
for(int i=0;i<Upsize;i++){
if(books[i].GetName().equals(name)){
return books[i];
}
}
System.out.println("没有这本书");
return null;
}
public boolean DeleteBook(String name){
int ansi=-1;
for(int i=0;i<Upsize;i++){
if(books[i].GetName().equals(name)){
ansi=i;
}
}
if(ansi==-1){
System.out.println("您想删除的书籍并不存在");
return false;
}
else{
for(int i=ansi;i<Upsize;i++){
books[i]=books[i+1];
}
for(int i=0;i<Upsize;i++){
System.out.println(books[i]);
}
Upsize--;
for(int i=0;i<Upsize;i++){
System.out.println(books[i]);
}
return true;
}
}
}
代码讲解
如何实现不同用户之间的操作权限不同
在这里其实就涉及到继承和多态了,我们想使得我们输入不同的参数从而实现实例化出不同的对象有些同学可能会想到很简单啊我用if和else不就行了吗但是我们需要知道一点就是我们可以使用if和else去实现的是调用不同类的构造函数但是我们怎么才能知道哪个类实例化出对象了呢?
那么这时候有些同学可能会想到这样一个办法那就是下面这个代码
假设AdminUser(该类是超级用户)NormalUser(该类是普通用户)
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int t=scan.nextInt();
AdminUser Ad;
NormalUser No;
if(t==1){
No=new NormalUser("zyficl");
}
else if(t==2){
Ad=new AdminUser("zyficl");
}
if(Ad==null){
}
else if(No==null){
}
}
有些同学可能会想到使用这个方法来进行从语法角度这样子做能不能做到呢?答案是可以的,但是我们会发现什么呢?这样太麻烦了,因为这样子的话我们代码更像是面向过程,而不是我们希望的面向对象,因此我们该怎么办呢?很简单那就是创造一个新的抽象类User并让普通用户和超级用户都继承这个抽象类,然后实例化对象的时候使用向上转型,这样子我们就能实现既能让两个用户类型不一样又可以使得我们在敲写代码的时候保留面向对象的特性那么该怎么做呢?代码如下
首先要创建一个用户包
USER
package user;
import Book.BookList;
import Operation.IOperation;
public abstract class User {
public String name;
protected IOperation[] iOperations;
public abstract int menu();
public User(String name){
this.name=name;
}
public void doOpeeration(int choice,BookList bookList){
iOperations[choice].work(bookList);
}
}
NormalUser
package user;
import Operation.*;
import com.sun.source.tree.ReturnTree;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name){
super(name);
this.iOperations=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowBooks(),
new ReturnBook(),
};
}
public int menu(){
System.out.println("0.退出系统");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("请选择你的操作");
Scanner scan=new Scanner(System.in);
int SelecAction=scan.nextInt();
return SelecAction;
}
}
AdminUser
package user;
import Operation.*;
import java.util.Scanner;
public class AdminUser extends User {
public AdminUser(String name){
super(name);
this.iOperations=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new DeleteOperation(),
new AddOperation(),
};
}
public int menu(){
System.out.println("0.退出系统");
System.out.println("1.查找图书");
System.out.println("2.删除图书");
System.out.println("3.增加图书");
Scanner scan=new Scanner(System.in);
int SelecAction=scan.nextInt();
return SelecAction;
}
}
然后我们的主函数中该怎么去调用这些呢主函数的话我们可以写一个方法这个方法的返回类型是User就可以解决了
import Book.*;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
System.out.println("请输入你的用户名称");
Scanner scan=new Scanner(System.in);
String name;
name=scan.nextLine();
System.out.println("请选择你的用户类型");
System.out.println("1.普通用户-------2.超级用户");
int SelectUsers;
SelectUsers=scan.nextInt();
if(SelectUsers==1){
return new NormalUser(name);
}
else{
return new AdminUser(name);
}
}
public static void main(String[] args) {
User us=login();
BookList bookList=new BookList();
String zyficl;
while(true) {
int sc = us.menu();
us.doOpeeration(sc, bookList);
}
}
}
好的那么此时我们解决了第一个问题那就是刚刚说的不同用户的权限不一样,那么接下来就是第二个难点如何使得我们按下不同的数字之后去做不同的任务呢?
这里我们可以用一个数组,让这个数组去存储每一个任务,而每一种任务或者说是行为我们可以单独设置为一个类,并且让这个些类实例化出的对象存到一个数组里然后通过输入数字访问数组的下标从而达到实现不同的行为
那么这时候就又出现一个问题了如何让这些行为能够存到一个数组里呢?因为我们刚刚讲了我们是把这些行为单独写成一个类的想要放进一个数组里最起码要保证这个数组是里存储的是同一种类型,这里其实有了上面的启发我们应该可以想到的那就是用一个父类让子类去继承就可以了但是呢为了保证我们的知识点覆盖全面这里我们可以用一个接口去实现这个接口就是下面这个IoOperation
package Operation;
import Book.*;
import user.*;
public interface IOperation {
public void work(BookList bookList);
}
然后让其他的行为去继承这个接口这里主要以增加和删除为例
package Operation;
import Book.*;
import java.util.Scanner;
public class AddOperation implements IOperation {
public void work(BookList bookList){
System.out.println("请输入要新增的书籍名称");
Scanner scan=new Scanner(System.in);
String BooksName=scan.nextLine();
System.out.println("请输入要新增的书籍的价格");
int Price=scan.nextInt();
scan.nextLine();
System.out.println("请输入要插入书籍的类型");
String BooksType=scan.nextLine();
if(bookList.GetBookListLength()==bookList.GetUpsize()){
bookList.Expansion();
}
bookList.Add(BooksName,Price,BooksType);
bookList.show();
}
}
删除书本
package Operation;
import Book.*;
import java.util.Scanner;
public class DeleteOperation implements IOperation {
public void work(BookList bookList){
System.out.println("请输入你要删除的书籍");
Scanner scan=new Scanner(System.in);
String name=scan.nextLine();
bookList.DeleteBook(name);
}
}
在删除书本的时候其实就是对数组的内容做删除那么假如说我们要删除的书本下标是2那么就要把2后面的书籍依次往前挪动一位。而增加书本的时候只需要在末尾增加即可。
我们一定会开开心心快快乐乐的生活在一起的,一直一直在一起的无论如何我都不会分开