圖書館管理系統
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);
}
}
}