目录
1.book包
我们需要创建一个包存的是与书相关的类
1.1BOOK类
储存的是一些关于书的属性比如书名 作者 价格 等等的成员变量
注意:成员变量一般用private修饰
用get and set 进行访问
构造函数时可以省略状态的初始化(如果没有初始化时默认值为false,没必要多此一举)
代码实现
package Book;
import function.Addbook;
public class Book {
//创建书的属性书名 作者
private String name;//书名
private String author;//作者
private int price;//价格
private boolean state;//状态
//初始化,state的默认值为false,所以初始化省略掉state的
public Book(String name, String author, int price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public int getPrice() {
return price;
}
public boolean isState() {
return state;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(int price) {
this.price = price;
}
public void setState(boolean state) {
this.state = state;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +" "+
//", state=" + state +
"state="+ ((state==true)?"已借出":"未借出")+
'}';
}
public static void main(String[] args) {
}
}
1.2bookshelf类(书架类)
可以先在书架上初始化几本书
//问题一:怎么解决书架上放若干本书 用数组
问题 2:而且还要定义一个数来记录书籍的个数
实现功能需要访问数组等成员变量受到了限制
创建方法用于访问
代码实现
package Book;
//书架
public class bookshelf {
//问题一:怎么解决书架上放若干本书 用数组
private Book []books=new Book[10];//书架数组
private int usesize;//书架数的个数
public int getUsesize() {
return usesize;
}
public void setUsesize(int usesize) {
this.usesize = usesize;
}
//属于bookshelf的构造方法,这个类中没有成员变量,只有其他类中调用这个类就会初始化对象
public bookshelf(){
books[0]=new Book("红楼梦","曹雪芹",11);
books[1]=new Book("三国演义","罗贯中",14);
books[2]=new Book("西游记","吴承恩",22);
this.usesize=3;
}
//对查找书籍
public Book getBooks(int sop) {
return books[sop];
}
//对进行增加书籍的时候有用
public void setBooks(int sop,Book book) {
this.books[sop]=book;
}
//对进行判满的时候有用
public Book [] setlong(){
return books;
}
public static void main(String[] args) {
}
}
2.user包
这里图书管理系统的用户群体分为普通用户和管理员用户
所以可以设置三个类 1.User类(抽象类)2.Adminuser类(管理员类)3.Normaluser类(普通类),并且后面两个类都要继承抽象类
2.1User类
第一点
包括其他两个类的共性比如name成员变量
注意用p'rotected修饰
第二点
在不同用户是所展现的的功能也是不一样的
所以可以把功能建成一个数组
这时候接口的作用体现出来了
所有的功能类都要继承这个接口,
第三点
关键点:连接功能区和主系统的节点
调用菜单功能的方法
从主函数中传过来的choice和bookshelf1
function:代表的是数组(功能数组)
最后就会传到function包中实现功能操作
第四点
代码实现
package user;
import Book.*;
import function.Function;
//用户是个代表,所以设置为抽象方法
public abstract class User {
protected String naem;
//此时这个数组没有初始化
//调用构造方法的时候,就对数组进行了初始化,所以在抽象类中是可以调用到已经初始化好的数组
protected Function[] functions;
public User(String name){
this.naem=name;
}
//不能被static修饰,会影响重写
public abstract int mune();
// 定义一个调用菜单功能的方法
public void func(int choice ,bookshelf bookshelf1){
functions[choice].work(bookshelf1);
//调用对象的work方法
}
}
2.2Adminuser类
第一点
User类中有构造方法,子类也需要进行j
第二点
第三点
把抽象类中的功能数组成员变量放进子类中的构造方法中,只要你选择好用户,用户的功能就初始化好了
注意:有个小小的注意点 ,我们可以把退出系统放在数组下标为0的位置,可以和菜单下标进行相呼应
第四点
代码实现
package user;
import function.*;
import java.util.Scanner;
public class Adminuser extends User {
public Adminuser(String name) {
super(name);
//对数组进行初始化,因为选择好什么用户这个用户的功能就要初始化好
this.functions=new Function[]{
new Exitbook(),
new Finebook(),
new Addbook(),
new Deletebook(),
new Lookbook()
};
}
//管理员界面菜单
public int mune(){
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("***********************************");
System.out.println("请选择你的操作");
Scanner sc=new Scanner(System.in);
int choice=sc.nextInt();
return choice ;
}
}
2.3Normaluser类
第一点
User类中有构造方法,子类也需要进行构造
第二点
第三点
把抽象类中的功能数组成员变量放进子类中的构造方法中,只要你选择好用户,用户的功能就初始化好了
注意:有个小小的注意点 ,我们可以把退出系统放在数组下标为0的位置,可以和菜单下标进行相呼应
第四点
代码实现
package user;
import function.*;
import java.util.Scanner;
//普通用户
public class Normaluser extends User{
//构造方法
public Normaluser(String name) {
super(name);
//对数组进行初始化,因为选择好什么用户这个用户的功能就要初始化好
this.functions=new Function[]{
new Exitbook(),
new Finebook(),
new Borrowbook(),
new Returnbook()
};
}
//普通用户操作界面
public int mune(){
System.out.println("**********普通用户菜单**************");
System.out.println("1.查找书籍");
System.out.println("2.借阅书籍");
System.out.println("3.归还书籍");
System.out.println("0.退出系统");
System.out.println("***********************************");
System.out.println("请选择你的操作");
Scanner sc=new Scanner(System.in);
int choice=sc.nextInt();
return choice;
}
}
3.主包
3.1Main类
进入图书管理系统需要界面
第一点
User的好处就体现出来了
这里(返回值的不同)使用了向上转型来接受
第二点
选好身份后,普通用户和管理员用户的菜单界面是不同的
调用菜单时就可以在User中写mune方法,然后在子类中中进行重写
使用了多态
第三点
另外一开始就需要对建立一个书架的对象(因为功能的实现需要在书架上完成)
第四点
选择完用户身份后进行功能的调用
choice:代表的是从用户菜单传回的的值
bookshelf1:因为功能的实现需要在书架上完成所以要穿一个书架给方法
第五点
代码实现
import user.Adminuser;
import user.Normaluser;
import user.User;
import Book.bookshelf;
import java.util.Scanner;
public class Main {
//进入界面系统
public static User lonin(){
System.out.println("请输入你的姓名");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
// next:
System.out.println("请输入您的身份 1:普通用户 2:管理员用户");
int tmp=sc.nextInt();
if(tmp==1){
return new Normaluser(name);
}
//有一个问题如果输入的既不是1也不是2也会进入这里面,但如果改成else if就会检测成无返回值
else {
return new Adminuser(name);
}
// else{
// System.out.println("输入错误请重新输入");
// // goto next;
// }
}
public static void main(String[] args) {
//一开始书架就要初始化好
bookshelf bookshelf1=new bookshelf();
while(true){
User user=lonin();
int choice= user.mune();
//choice代表的是第几个操作
//开始调用用户功能kk
user.func(choice,bookshelf1);
}
}
}
4.function包
储存的是普通用户和管理员用户的功能菜单
因为都是功能所以我们可以设计成接口,再对接口进行具体重写,
4.1Function接口
注意:接口的成员变量还是成员方法都是由public abstra修饰的
package function;
import Book.*;
public interface Function {
void work(bookshelf bookshelf1);
}
4.2Addbook类
增加书籍
第一步
对书架进行判满
第二步
创建增加书籍对象
第三步
查看书架上是否已经有这本书
第四步
把书增加到书籍上
注意点:
//加之后需要有效书籍加一
代码实现
package function;
import Book.Book;
import Book.bookshelf;
import java.util.Scanner;
//新增book
public class Addbook implements Function{
@Override
public void work(bookshelf bookshelf1) {
System.out.println("新增书籍");
//1.需要进行判满
if(bookshelf1.getUsesize()==bookshelf1.setlong().length){
System.out.println("书架已满,无法增加");
return;
}
//2.创建增加书籍对象
System.out.println("请输入要增加的书名");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
System.out.println("请输入要增加书名的作者");
String author=sc.nextLine();
System.out.println("请输入书的价钱");
int price =sc.nextInt();
Book newbook=new Book(name,author,price);
//3.查看书架上是否已经有这本书
for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
if(bookshelf1.getBooks(i).getName().equals(name)){
System.out.println("已经有这本书了"+bookshelf1.getBooks(i));
return ;
}
System.out.println("没有这本书,可以增加");
}
//4.增加书
int sop=bookshelf1.getUsesize();
bookshelf1.setBooks(sop,newbook);
//加之后需要有效书籍加一
bookshelf1.setUsesize(sop+1);
System.out.println("增加成功");
}
public static void main(String[] args) {
}
}
4.3Borrowbook类
借阅书籍
第一步
/第一步输入书籍名称
第二步
//第二步找到书籍
注意事项:
借阅书籍的改变点就是改变书籍的状态
这里改变书籍状态改变了自带的tostring
三目操作符
代码实现
package function;
import Book.bookshelf;
import java.util.Scanner;
//借阅book
public class Borrowbook implements Function{
@Override
public void work(bookshelf bookshelf1) {
System.out.println("借阅书籍");
//第一步输入书籍名称
System.out.println("请输入你要借阅书籍的名称");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
//第二步找到书籍
int sop=0;
for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
if(bookshelf1.getBooks(i).getName().equals(name)){
System.out.println("找到了"+bookshelf1.getBooks(i));
sop=i;
if(bookshelf1.getBooks(sop).isState()==true){
System.out.println("不好意思,书已经被借出去了");
return ;
}
else{
bookshelf1.getBooks(sop).setState(true);
System.out.println("恭喜你借阅成功");
return;
}
}
}
System.out.println("不好意思,没有这本书");
}
}
4.4Deletebook类
删除书籍
第一步
第二步
注意点:
1.采用向前覆盖的方式进行删除
2.记得将有效个数减一
代码实现
package function;
import Book.bookshelf;
import java.util.Scanner;
//删除book
public class Deletebook implements Function{
@Override
public void work(bookshelf bookshelf1) {
System.out.println("删除书籍");
//第一步输入需要删除书籍的名称
System.out.println("请输入你要删除书籍的名字");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
//第二部找到书籍
int sop=0;
for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
if(bookshelf1.getBooks(i).getName().equals(name)){
System.out.println("找到了"+bookshelf1.getBooks(i));
sop=i;
break;
}
}
if(sop==0){
System.out.println("不好意思没有你找的书");
return;
}
else{
System.out.println("找到了正在删除");
//采用向前覆盖的方式
for(int j=sop;j< bookshelf1.getUsesize();j++){
bookshelf1.setlong()[j]=bookshelf1.setlong()[j+1];
}
//将有效书籍个数减一
bookshelf1.setUsesize(bookshelf1.getUsesize()-1);
System.out.println("删除成功");
return;
}
}
public static void main(String[] args) {
}
}
4.5Exitbook类
退出系统
package function;
import Book.bookshelf;
//退出系统
public class Exitbook implements Function {
@Override
public void work(bookshelf bookshelf1) {
System.out.println("退出系统");
System.exit(0);
}
public static void main(String[] args) {
}
}
4.6Findbook
查找书籍
第一步
第二步
代码实现
package function;
import Book.bookshelf;
import java.util.Scanner;
//查找book
public class Finebook implements Function{
@Override
public void work(bookshelf bookshelf1) {
System.out.println("查找图书");
//输入
System.out.println("请输入你要查找书的书名");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
//第二步遍历
for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
if(bookshelf1.getBooks(i).getName().equals(name)){
System.out.println("找到了"+bookshelf1.getBooks(i));
return ;
}
}
System.out.println("没有你找的这本书");
}
}
4.7Lookbook
显示书籍
遍历数组就行了
package function;
import Book.bookshelf;
//显示book
public class Lookbook implements Function{
@Override
public void work(bookshelf bookshelf1) {
System.out.println("显示图书");
for(int i=0;i<bookshelf1.getUsesize();i++){
System.out.println(bookshelf1.getBooks(i));
}
}
}
4.8Returnbook
归还书籍
package function;
import Book.bookshelf;
import java.util.Scanner;
//归还book
public class Returnbook implements Function {
@Override
public void work(bookshelf bookshelf1) {
System.out.println("归还书籍");
System.out.println("请输入你要归还书籍的名称");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
for (int i = 0; i <bookshelf1.getUsesize() ; i++) {
if(bookshelf1.getBooks(i).getName().equals(name)){
System.out.println("找到了"+bookshelf1.getBooks(i));
bookshelf1.getBooks(i).setState(false);
System.out.println("归还成功");
}
}
System.out.println("没有你要归还的图书");
}
}