提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
图书管理系统
4.管理员操作
提示:这里可以添加本文要记录的大概内容:
用已经学过的面向对象的思想来设计一个图书页面(用到的技术有继承,多态,封装,抽象类,接口)
提示:以下是本篇文章正文内容,下面案例可供参考
书架里面默认放置三本书,有俩个角色管理员和普通用户,角色各自有四个功能,这四个功能对于角色具体实现是不同的
Book{name='三国演义', author='罗贯中', price=42, type='小说', 未借出}
Book{name='红楼梦', author='曹雪芹', price=50, type='小说', 未借出}
Book{name='西游记', author='吴承恩', price=58, type='小说', 未借出}
Book{name='水浒传', author='施耐庵', price=40, type='小说', 未借出}







见界面设计处

类似于用户的新增图书
类似于用户删除图书

注意toString 方法,为了便于输出借还状态,根据isborrowed真假来输出借出还是没借出,由于初始执行都没借出,所以借还状态不需要set方法(成员变量默认值false)
- package 图书管理系统.book;
-
- public class Book {
- private String name;
- private String author;
- private int price;
- private String type;
- private boolean isBorrowed;//是否被借出
-
- public Book(String name, String author, int price, String type) {
- this.name = name;
- this.author = author;
- this.price = price;
- this.type = type;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getAuthor() {
- return author;
- }
-
- public void setAuthor(String author) {
- this.author = author;
- }
-
- public int getPrice() {
- return price;
- }
-
- public void setPrice(int price) {
- this.price = price;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public boolean isBorrowed() {
- return isBorrowed;
- }
-
- public void setBorrowed(boolean borrowed) {
- isBorrowed = borrowed;
- }
-
- @Override
- public String toString() {
- return "Book{" +
- "name='" + name + '\'' +
- ", author='" + author + '\'' +
- ", price=" + price +
- ", type='" + type + '\'' +
- ((isBorrowed == true) ? "已经借出" : "未借出") +
- '}';
- }
- }

- package 图书管理系统.book;
-
- import 图书管理系统.book.Book;
-
- public class BookList {
- private Book[] books = new Book[10];
- private int usdSize;
-
- public BookList() {
- books[0]=new Book("三国演义","罗贯中",42,"小说");
- books[1]=new Book("红楼梦","曹雪芹",50,"小说");
- books[2]=new Book("西游记","吴承恩",58,"小说");
- books[3]=new Book("水浒传","施耐庵",40,"小说");
- this.usdSize=4;
- }
- //修改图书数量
- public void setUsdSize(int usdSize){
- this.usdSize=usdSize;
- }
- //获得图书数量
- public int getUsdSize(){
- return usdSize;
- }
- //放书
- public void setBook(int pos,Book book){
- books[pos]=book;
- }
- //取书
- public Book getBook(int pos){
- return books[pos];
- }
-
- }
将相关的操作统一规范成接口,接口里面操作图书,有一个work抽象方法,七个实现类需要重写该方法。
- public interface IOperation {
- public abstract void work(BookList bookList);
- }
注意:退出系统,由于要回收资源(释放图书资源),所以还是需要实现接口
具体实现类见下文:
遍历一遍书籍,书籍的总个数在currentSize保存,在书架中调,书架中的具体书是book,
判断找没找到,直接在书架中依次遍历book,用book名字和输出的字符串比较,由于字符串比较直接调用equals方法即可,找到返回book信息
- package operation;
-
- import 图书管理系统.book.Book;
- import 图书管理系统.book.BookList;
-
- import java.util.Scanner;
-
- public class FindOperation implements IOperation {
- @Override
- public void work(BookList bookList) {
- System.out.println("查找图书");
- Scanner scanner = new Scanner(System.in);
- System.out.println("请输入你要查找图书的名字");
- String name = scanner.nextLine();
- //遍历一遍书籍,书名相同返回图书
- int currentSize = bookList.getUsdSize();
- for (int i = 0; i < currentSize; i++) {
- Book book=bookList.getBook(i);
- if(book.getName().equals(name)){
- System.out.println("找到了这本书");
- System.out.println(book);
- return;
- }
- }
- System.out.println("没找到你要的这本书");
- }
- }
直接遍历书籍,输出每本书的信息即可,由于book对象已经重写了toString()方法,打印book对象时,实际上调用的是我们重写的tostring方法,打印相关信息
- package operation;
-
- import 图书管理系统.book.BookList;
-
- import java.util.Scanner;
-
- public class DisplayOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("显示图书");
- int currentSize=bookList.getUsdSize();
- for (int i = 0; i
- System.out.println(bookList.getBook(i));
- }
-
- }
- }
Addoperation新增图书
由用户自己输入书籍的信息,新建一本书(调用book构造方法),然后获取当前书籍的数量currentSize,由于图书下标从0开始,直接将新书放到书架第currentSize位置处,书架中书籍数量+1

目前三本书将第四本书放到空白位置,也就是currentSize==3,下标为4,放完后usesized+1
- package operation;
-
- import 图书管理系统.book.Book;
- import 图书管理系统.book.BookList;
-
- import java.util.Scanner;
-
- public class AddOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("新增图书");
- Scanner scanner=new Scanner(System.in);
- 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();
- Book book=new Book(name,author,price,type);
- int currentSize=bookList.getUsdSize();
- bookList.setBook(currentSize,book);
- bookList.setUsdSize(currentSize+1);
- System.out.println("新增书籍成功");
-
- }
- }
删除图书:
类似于新增图书,只不过要将setusedsize-1
- package operation;
-
- import 图书管理系统.book.Book;
- import 图书管理系统.book.BookList;
-
- import java.util.Scanner;
-
- public class DeleteOperation implements IOperation {
- @Override
- public void work(BookList bookList) {
- System.out.println("删除图书");
- Scanner scanner = new Scanner(System.in);
- System.out.println("请输入你要删除图书的名字");
- String name = scanner.nextLine();
- int currentSize = bookList.getUsdSize();
- for (int i = 0; i < currentSize; i++) {
- Book book = bookList.getBook(i);
- if (book.getName().equals(name)) {
- bookList.setUsdSize(currentSize - 1);
- System.out.println("删除成功");
- return;
- }
- }
- }
- }
-
退出系统:
库函数exit 0是状态码,退出成功的意思
- package operation;
-
- import 图书管理系统.book.BookList;
-
- public class ExitOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("退出程序");
- System.exit(0);
- }
- }
2.普通用户
借阅图书
类似于查找图书,找到借阅的图书,将状态(setborrowed)改为true
- package operation;
-
- import 图书管理系统.book.Book;
- import 图书管理系统.book.BookList;
-
- import java.util.Scanner;
-
- public class BorrowOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("借阅图书");
- Scanner scanner=new Scanner(System.in);
- System.out.println("请输入你要借阅图书的名字");
- String name=scanner.nextLine();
- int currentSize=bookList.getUsdSize();
- for (int i = 0; i
- Book book=bookList.getBook(i);
- if(book.getName().equals(name)) {
- book.setBorrowed(true);
- System.out.println("借阅成功");
- return;
- }
- }
- }
- }
归还图书
类似于查找图书,找到借阅的图书,将状态(setborrowed)改为false
- package operation;
-
- import 图书管理系统.book.Book;
- import 图书管理系统.book.BookList;
-
- import java.util.Scanner;
- public class ReturnOperation implements IOperation{
- @Override
- public void work(BookList bookList) {
- System.out.println("归还图书");
- Scanner scanner=new Scanner(System.in);
- System.out.println("请输入你要归还图书的名字");
- String name=scanner.nextLine();
- int currentSize=bookList.getUsdSize();
- for (int i = 0; i
- Book book=bookList.getBook(i);
- if(book.getName().equals(name)) {
- book.setBorrowed(true);
- System.out.println("归还成功");
- return;
- }
- }
- }
- }
-
四.User包

- package User;
-
- import operation.IOperation;
- import 图书管理系统.book.BookList;
-
- public abstract class User {
- protected String name;
- protected IOperation[] iOperations;
-
- public User(String name) {
- this.name = name;
- }
-
- public abstract int menu();
-
- public void doOperation(int choice, BookList bookList){
- this.iOperations[choice].work(bookList);
- }
- }
1.NormalUser类
- package User;
-
- import operation.*;
-
- import java.util.Scanner;
-
- public class NormalUser extends User {
- public NormalUser(String name){
- super(name);
- this.iOperations = new IOperation[]{
- new ExitOperation(),
- new FindOperation(),
- new BorrowOperation(),
- new ReturnOperation(),
- };
- }
- public int menu(){
- System.out.println("hello "+name+" 欢迎来到图书小练习");
- System.out.println("1.查找图书!");
- System.out.println("2.借阅图书!");
- System.out.println("3.归还图书!");
- System.out.println("0.退出系统!");
- System.out.println("请输入你的操作:");
- Scanner scanner=new Scanner(System.in);
- int choice=scanner.nextInt();
- return choice;
- }
- }
2.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 AddOperation(),
- new DeleteOperation(),
- new DisplayOperation()
- };
- }
- public int menu(){
- System.out.println("hello "+name+" 欢迎来到图书小练习");
- System.out.println("1.查找图书!");
- System.out.println("2.新增图书!");
- System.out.println("3.删除图书!");
- System.out.println("4.显示图书");
- System.out.println("0.退出系统!");
- System.out.println("请输入你的操作:");
- Scanner sc=new Scanner(System.in);
- int n=sc.nextInt();
- return n;
- }
- }
五.最难的整合
Main类
首选我们先准备好图书,调用构造方法,进入登录页面,登录页面输入姓名,身份后,选择,注意根据你的选择来决定登录的返回值是普通用户,还是管理员,由于他们俩个都继成了user类,所以返回值填user(动态绑定和向上转型),当普通用户调用login(选择是0),实际上返回的是normaruser,返回值由user接受,这是向上转型,此时调用user.menu实际上就是重写的normaruse这是动态绑定。打印出界面之后,绑定的user(用户或者管理员),调用其doOperation方法,这是根据用户选的操作数来决定调用哪个接口里的work方法,如图所示:

- import User.AdminUser;
- import User.NormalUser;
- import User.User;
- import 图书管理系统.book.BookList;
-
- import java.util.Scanner;
-
-
- public class Main {
- //动态绑定
- public static User login(){//登陆 发生了向上转型
- Scanner sc=new Scanner(System.in);
- System.out.println("请输入你的姓名");
- String name=sc.nextLine();
- System.out.println("请输入你的身份:1:-》管理员,0-》普通用户");
- int choice=sc.nextInt();
- if(choice==1){
- return new AdminUser(name);
- }else{
- return new NormalUser(name);
- }
- }
- public static void main(String[] args) {
- //开始整合,最难的部分
- BookList bookList = new BookList();//准备图书
- //登陆user这个引用,引用哪个对象?
- User user=login();
- while(true){
- int choice=user.menu();
- user.doOperation(choice, bookList);
- }
- }
- }
这样初步的系统框架就搞定了
-
相关阅读:
【审视】Scrum Master的检查清单
C++:栈与队列,优先级队列
AI全栈大模型工程师(十九)Semantic Kernel
ubuntu-hadoop伪分布
交互设计主要做什么?新手入门必读
PG SQL 问题:Character with value 0x0a must be escaped
全志 d1 licheerv opensbi uboot linux debian
Pandas性能优化:进阶篇
Eureka添加@Loadbalanced 报错 No instances available for XXXXX
B/S 架构 与 C/S 架构
-
原文地址:https://blog.csdn.net/panpanaa/article/details/127949503
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU