手把手教你写一个小型面向对象项目

写在前面:本文主要讲解Java语言面向对象的一个小型的总结性项目,图书管理系统,主要包含了封装、多态、继承、接口等知识。我的码云地址:OREOFox (oreork) - Gitee.com

目录

1.图书管理系统整体框架需求

2.设计

(1)图书相关类

(2)操作相关类

(3)用户相关类

User类:

a.普通用户类:

 b.管理员类

(3)Main函数 程序入口

(4)操作类细节

DisplayOperation //打印图书

AddOperation//增添图书

DelOperation//删除图书

 DisplayOperation //打印图书

ExitOperation //退出系统

FindOperation //查找图书

BorrowOperation //借阅图书

ReturnOperation //归还图书

3.总结


1.图书管理系统整体框架需求

1、简单的登录
2、管理端
      a.整理书籍(该功能为可扩展功能)
      b.查阅书籍
      c.增加书籍
      d.删除书籍
      e.打印书籍列表
      f.退出
3、用户端
      a.查询书籍
      b.借阅书籍
      c.归还书籍
      d.退出

2.设计

(1)图书相关类

首先创建图书相关的类,基础属性和构造方法:

public class Book {
    private String Name;
    private String Author;
    private String Type;
    private int Price;
    private boolean IsBorrowed;

    public Book(String name, String author, String type, int price) {
        Name = name;
        Author = author;
        Type = type;
        Price = price;
    }

Getter and Setter,toString方法

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getAuthor() {
        return Author;
    }

    public void setAuthor(String author) {
        Author = author;
    }

    public String getType() {
        return Type;
    }

    public void setType(String type) {
        Type = type;
    }

    public int getPrice() {
        return Price;
    }

    public void setPrice(int price) {
        Price = price;
    }

    public boolean isBorrowed() {
        return IsBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        IsBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "Name='" + Name + '\'' +
                ", Author='" + Author + '\'' +
                ", Type='" + Type + '\'' +
                ", Price='" + Price + '\'' +
                ", IsBorrowed=" + ((IsBorrowed==true)?  "已被借出" : "未被借出") +
                '}';
    }
}

然后我们创建书库类BookList,先对BookList进行初始化,放入三本书:

private Book[] books=new Book[100000];
    private int usedSize=0;
    public BookList(){
        books[0]=new Book("三国演义","lgz","小说",10);
        books[1]=new Book("水浒传","sna","小说",11);
        books[2]=new Book("西游记","wce","小说",12);
        this.usedSize=3;
    }

几个访问属性的方法,书本数目、获取某一位位置的书、放置图书:

    public int getUsedSize(){
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public Book getPos(int pos){
        return books[pos];
    }

//放置图书
    public void setBooks(int pos,Book book) {
        this.books[pos]=book;
    }

(2)操作相关类

1.创建接口 IOperation归总,work方法对图书进行操作,再创建用户的每个动作

public interface IOperation {
    Scanner scanner=new Scanner(System.in);
    void work(BookList bookList);
}

接下来创建一组操作类, 每个类对应一个用户的动作

AddOperation
DelOperation
FindOperation
RemoveOperation
DisplayOperation
BorrowOperation
ReturnOperation
ExitOperation

先把空类创建好, 不着急实现细节.

抽象出 Operation 的好处: 让操作和操作之间低耦合, 让操作和用户之间低耦合.

(3)用户相关类

这里我们先创建User类构建菜单和操作,然后分管理员 AdminUser和普通用户 NormalUser继承User

User类:

package user;

import book.BookList;
import operations.IOperation;

/**
 * Created with IntelliJ IDEA.
 * Description:抽象类 构建菜单和操作 分管理员和普通用户两个子类
 * User: RK
 * Date: 2022-06-28
 * Time: 10:19
 */
 abstract class User {
    protected String name;
    protected IOperation[] iOperations;

    public User(String name){
        this.name=name;
    }
     public abstract int menu();

    public void doWork(int choice, BookList bookList){
        iOperations[choice].work(bookList);
    }

    
}

a.普通用户类:

package user;

import book.BookList;
import operations.*;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:24
 */
public class NormalUser extends User{

    public NormalUser(String name){
        super(name);
        this.iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
        };
    }

    @Override
    public int menu() {
        System.out.println("==========普通用户菜单=========");
        System.out.println("Hello " + this.name + ", 欢迎使用图书管理系统!");
        System.out.println("1. 查找图书");
        System.out.println("2. 借阅图书");
        System.out.println("3. 归还图书");
        System.out.println("0. 退出系统");
        System.out.println("=============================");
        System.out.println("请输入您的选择: ");
        Scanner scanner=new Scanner(System.in);
        int choice= scanner.nextInt();
        return choice;//返回值为int
    }

    @Override
    public void doWork(int choice, BookList bookList) {
        super.doWork(choice, bookList);
    }
}

 数组下标和用户操作要一一对应。

 b.管理员类

package user;

import book.BookList;
import operations.*;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:24
 */


/**
 * @Author RK
 * @Description
 * @Date 13:57 2022/6/28
 * @Param 管理员类
 * @return
 */

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation(),

        };
    }

    @Override
    public int  menu() {
        System.out.println("===========管理员菜单=========");
        System.out.println("Hello " + this.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 scanner=new Scanner(System.in);
        int choice= scanner.nextInt();
        return choice;
    }


    @Override
    public void doWork(int choice, BookList bookList) {
        super.doWork(choice, bookList);
    }
}

原理和普通类用户一致。

(3)Main函数 程序入口

package user;

import book.BookList;

import java.util.Scanner;
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:30
 */
public class Main {

     /**
      * @Author RK
      * @Description 登录
      * @Date 15:48 2022/6/28
      * @Param
      * @return
      */
    public static User login(){
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入您的昵称");
        String name= scanner.nextLine();
        System.out.println("请输入您的身份 : 1-->管理员  2-->普通用户");
        int choice= scanner.nextInt();
        if(choice==1){
            return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
    }
    /**
     * @Author RK
     * @Description choice调用操作
     * @Date 16:09 2022/6/28
     * @Param [args]
     * @return void
     */

    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user=login();
        while (true){
            int choice=user.menu();
            user.doWork(choice,bookList);
        }
    }
}

(4)操作类细节

先完成管理员类操作

DisplayOperation //打印图书

package operations;

import book.Book;
import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:19
 */
public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书!");
        BookList bookList1=new BookList();
        int size=bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            System.out.println(bookList.getPos(i));
        }
    }
}

AddOperation//增添图书

package operations;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:18
 */
public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        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,type,price);
        BookList bookList1=new BookList();
        int size=bookList.getUsedSize();
        bookList.setUsedSize(size+1);
        bookList.setBooks(size,book);
        System.out.println("新增图书成功!");
    }
}

DelOperation//删除图书

package operations;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:18
 */
public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!" +
                "输入你要删除的书名");
        Scanner scanner = new Scanner(System.in);
        String name= scanner.nextLine();
        int i=0;
        int index=0;
        int size= bookList.getUsedSize();
        for (; i < size; i++) {
            Book book=bookList.getPos(i);
            if (name.equals(book.getName())){
                index=i;
                break;
            }
        }
        if(i>=size){
            System.out.println("没有你要删除的书!");
            return;
        }
        for (int j = index; j < size-1; j++) {
            Book book2=bookList.getPos(j+1);
            bookList.setBooks(j,book2);

        }
        bookList.setBooks(size,null);
        bookList.setUsedSize(size-1);
        System.out.println("删除成功!");
    }

}

运行如下:

 删除图书用到了顺序表的知识点

 DisplayOperation //打印图书

package operation;

import book.Book;
import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-22
 * Time: 11:07
 */

public class DisplayOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("打印图书!");
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getPos(i);//bookList[i]
            System.out.println(book);
        }
    }
}

ExitOperation //退出系统

package operations;

import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:19
 */
public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);
    }
}

FindOperation //查找图书

package operations;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:18
 */
public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!" +
                "请输入书名");
        Scanner scanner = new Scanner(System.in);
        String name= scanner.nextLine();
        int size=bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            Book book=bookList.getPos(i);
            if (name.equals(book.getName())){
                System.out.println("找到了这本书,信息如下: ");
                System.out.println(book);
        return;
            }
        }
        System.out.println("没有要找的书!");
        return;
    }
}

然后再是普通类用户NormalUser操作:

BorrowOperation //借阅图书

package operations;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:19
 */
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 i=0;
        int size= bookList.getUsedSize();
        for (; i < size; i++) {
            if (name.equals(bookList.getPos(i))){
                Book book=bookList.getPos(i);
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }else {
                System.out.println("无此书");
            return;
            }
        }
    }
}

ReturnOperation //归还图书

原理同借阅图书,只需在setIsborrowed做改动

package operations;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: RK
 * Date: 2022-06-28
 * Time: 10:19
 */
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 i=0;
        int size= bookList.getUsedSize();
        for (; i < size; i++) {
            if (name.equals(bookList.getPos(i))){
                Book book=bookList.getPos(i);
                book.setIsborrowed(false);
                System.out.println("还书成功!");
                return;
            }else {
                System.out.println("无此书");
                return;
            }
        }
    }
}

3.总结

这个项目比较精简,但包含了接口、封装、多态,及使用顺序表进行增删改查的功能,可以以此为基础作为大作业项目。

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值