天天看點

練習-圖書館管理系統

圖書館管理系統

1、需求分析

針對圖書進行管理

**角色:**使用者(NormalUser) 管理者(Admin)

使用者可以實作: 管理者可以實作

1、查找書籍 1、查找書籍

2、借閱書籍 2、增加書籍

3、歸還書籍 3、删除書籍

4、列印所有書籍資訊

2.概要設計

想清楚程程式應該分為幾個子產品,每個子產品幹啥,子產品之間如何互動。

3、詳細設計

每個子產品具體的一些細節在考慮清楚

4、開始編碼

先建立類,把核心的類設計好

設計類的過程很簡單,先找關鍵字

設計這個系統需要三個包

**1、Book包:**Book.java (書籍屬性) BookList.java(實作順序表管理若幹本書)

**2、Operation包:**AddOperation(增加書籍),BorrowOperation(借閱書籍),DelOperation(删除書籍),DisplayOperation(列印書籍),FindOperation(查找書籍),Exitoperation(t退出程式),ReturnOperation(歸還書籍),IOperation(共同的接口)。

**3、User包:**Admin(管理者),NormalUser(普通使用者包),User(用來被Admin和Normal繼承的抽象類)。

4、main.java(執行方法)。

把操作提取成類;這樣其實也進一步的把操作和使用者之間進行了“'解耦合”

耦合指的是代碼之間的關聯關系,越低越好

具體代碼實作

1、Book包

1)、Book.java

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 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? "已經被借出":"沒有被借出")+
                '}'+'\n';
    }
}
           

2)、BookLIst.java

package Book;

public class BookList {
    private Book[] books=new Book[100];
    private int size;

    public BookList(){
        books[0]=new Book("java程式設計","代",19,"學習");

        books[1]=new Book("C++程式設計","召",12,"學習");

        books[2]=new Book("python程式設計","勇",16,"學習");

        size =3;
    }
    //Book的get和set方法不能自動生成,因為這裡要加一個pos下标
    public Book getBook(int pos) {
        return this.books[pos];
    }

    public void setBook(int pos,Book book) {
        this.books[pos] = book;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}
           

2、Operation包

1)、IOperation

package Operation;

import Book.BookList;

import java.util.Scanner;

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

2)、AddOperation

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.next();
        System.out.println("請輸入作者:");
        String author =scanner.next();
        System.out.println("請輸入價格:");
        int price=scanner.nextInt();
        System.out.println("請輸入類型:");
        String type=scanner.next();
        //根據輸入的書籍資訊,構成一本書的對象
        Book book=new Book(name,author,price,type);
        //插入到bookList當中 尾插法
        int size= bookList.getSize();
        //尾插法
        bookList.setBook(size,book);
        bookList.setSize(size+1);
    }
}
           

3)、BorrowOperation

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("借閱書籍!");
     //1.輸入需要借閱書籍的名稱
     Scanner scanner=new Scanner(System.in);
     System.out.println("請輸入要借閱的書名:");
     String name=scanner.next();
     //2.根據書籍名稱查找書籍是否存在
     int i;
     for ( i = 0; i <bookList.getSize(); i++) {
         Book book=bookList.getBook(i);
         if(book.getName().equals(name)){
             //如果為真,則說明找到了相同的name,則要找的書就存在
             continue;
         }
     }
     //3.拿到書籍的對象,将書籍對象的isBorrowed=true
     if(i<bookList.getSize()){//此時i為借閱的書籍下标
         System.out.println("沒找到此書");
         return;
     }//找到指定圖書的位置 沒找到直接傳回
        Book book = bookList.getBook(i);
     if(book.isBorrowed()){
         System.out.println("此書已經被借出!");
     }else{
         book.setBorrowed(true);
         System.out.println("借閱成功");
     }
 }
}
           

4)、DelOperation

package Operation;

import Book.Book;
import Book.BookList;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList){
        System.out.println("删除圖書!");
        //1、輸入删除圖書的名字
        System.out.println("請輸入要删除圖書的名字:");
        String name =scanner.next();
        //2、根據書籍的名字查找書籍是否存在
        int i=0;
        for (i = 0; i <bookList.getSize(); i++) {
            if(bookList.getBook(i).getName().equals(name) ){
                //找到了
                break;
            }
        }
        if(i>=bookList.getSize()){
            System.out.println("沒有要删除的書籍");
            return;
        }
        //3、處理找到了的情況 進行尾部删除 删除的邏輯 i=i+1;  對象
        //1、拿到i+1下标的對象
        //2、把i+1下标的對象指派給i
        for(int j = i; j<bookList.getSize()-1; j++){
            Book book =bookList.getBook(j+1);
            bookList.setBook(j,book);
        }
        bookList.setSize(bookList.getSize()-1);
        System.out.println("删除成功");
    }
}
           

5)、DisplayOperation

package Operation;

import Book.BookList;

public class DisplayOperation implements IOperation{
    @Override
public void work(BookList bookList){
    int size=bookList.getSize();
    for (int i = 0; i <size; i++) {
        System.out.print(bookList.getBook(i));
      }
        System.out.println("共計"+bookList.getSize()+"本書");
    }
}
           

6)、Exitoperation

package Operation;

import Book.BookList;

public class Exitoperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("程式退出 goodbye!");
        System.exit(0);
        // System.exit(0);類似于return 0,0表示成功,非0表示失敗
    }
}
           

7)、FindOperation

package Operation;

import Book.BookList;
import Book.Book;
public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList){
        //1、輸入删除圖書的名字
        System.out.println("查找書籍");
        System.out.println("請輸入要查找圖書的名字");
        String name =scanner.next();
        //2、根據書籍的名字查找書籍是否存在
        int count=0;
        int i=0;
        for (i = 0; i <bookList.getSize(); i++) {
            Book book=bookList.getBook(i);
            if(bookList.getBook(i).getName().equals(name) ){
                //如果相同就列印這本書的資訊
                System.out.println(book);
                count++;
            }
        }
        if(i>bookList.getSize()){
            System.out.println("沒有這本書");
           // return;
        }
        System.out.println("共計找到"+count+"本書");
    }
}
           

8)、ReturnOperation

package Operation;
import Book.Book;
import Book.BookList;

public class ReturnOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("請輸入你要歸還的書籍");
        Book book=null;
        String name = scanner.next();
        int i = 0;
        for (i = 0; i <bookList.getSize(); i++) {
            if (bookList.getBook(i).getName().equals(name)) {
                 book = bookList.getBook(i);
                break;
            }
        }
        if(i< bookList.getSize()){
            System.out.println("沒有此書籍");
            return;
        }
        if(book!=null&& !book.isBorrowed()){
            System.out.println("此書沒有被您借閱");
            return;
        }
        if(book!=null&& !book.isBorrowed()){
            book.setBorrowed(false);
        }
        System.out.println("歸還完成");
    }
}
           

3、Usear包

1)、User.java

package Usear;

import Book.BookList;

import Operation.IOperation;

import java.util.Scanner;

public abstract class  User {
    protected String name;
    //持有目前使用者支援的操作對象
    protected IOperation [] operations;

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

    Scanner scanner=new Scanner(System.in);
    //列印一個操作菜單,不同的使用者,支援的操作不同,對應的菜單也就不同
    abstract public int menu();
    //根據使用者輸入的選項(menu傳回結果)
    //調用對應的操作對象
    //此處注意多态在這個代碼中的展現
    public void doOperation(int choice,BookList bookList){
        operations[choice].work(bookList);
    }
}
           

2)、Admin.java

package Usear;

import Operation.*;

import java.util.Scanner;
public class Admin extends User{
    public Admin(String name){
         super(name);
         operations=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("=============================");
        System.out.println("請輸入您的選擇: ");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}
           

3)、NormalUser.java

package Usear;
import Operation.*;

public class NormalUser extends User{
    public NormalUser(String name){
        super(name);
        //在這裡構造operation數組
        //讓數組中operation對象的順序和菜單中的序号相對應
        this.name=name;
        this.operations=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("請輸入你的選擇");
        int choice = scanner.nextInt();
        //close 本質上是在關閉 System.in
        //由于後面還需要用到System.in,此處不能關閉
        //scanner.close();
        return choice;
    }
}
           

4、主函數main.java

import Book.BookList;

import java.util.Scanner;
import Usear.User;
import Usear.Admin;
import Usear.NormalUser;
public class Main {
    public static void main(String [] args){
        //程式入口
        //1、先準備好書籍資訊資料
        BookList bookList=new BookList();
        //2、建立使用者(注意體會這裡的多态)
        User user=login();
        //3.進入主循環
        while(true){
            int choice = user.menu();
            user.doOperation(choice,bookList);
        }
    }
    public static User login(){
        System.out.println("請輸入你的姓名:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.next();
        System.out.println("請輸入您的身份(1 表示管理者,0表示普通使用者):");
        int choice =scanner.nextInt();
        //判斷使用者身份
        if(choice==1){
            return new Admin(name);
        }else{
            return new NormalUser(name);
        }
    }
}
           

繼續閱讀