Java入門教程之圖書管理系統(由簡入繁)(四)

作者:AlexTan

E-mail: [email protected]


上一篇博客我們提到代碼太臃腫,那麼這篇博客將來解決這個問題。這篇博客將把上篇博客的代碼改成MVC編程模式,MVC即models,views,controller,詳細介紹請繼續往下看。


MVC編程模式介紹:

MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式:[1] 
  • Model(模型)表示應用程序核心(比如數據庫記錄列表)。
  • View(視圖)顯示數據(數據庫記錄)。
  • Controller(控制器)處理輸入(寫入數據庫記錄)。
MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。

  通常模型對象負責在數據庫中存取數據。
View(視圖)是應用程序中處理數據顯示的部分。

  通常視圖是依據模型數據創建的。
Controller(控制器)是應用程序中處理用戶交互的部分。

  通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
MVC 分層有助於管理複雜的應用程序,因爲您可以在一個時間內專門關注一個方面。例如,您可以在不依賴業務邏輯的情況下專注於視圖設計。同時也讓應用程序的測試更加容易。
MVC 分層同時也簡化了分組開發。不同的開發人員可同時開發視圖、控制器邏輯和業務邏輯。


那麼根據MVC編程模式,我們把上次的代碼分成一下幾個模塊:

注:ui即view。

我們把增刪改查的函數放入control裏,把輸出輸入放在MainClass裏,把Book,以及BookList放在model下,這樣程序看起來就更系統化了,下面是具體代碼:

Operator.java:

package control;

import model.Book;
import model.BookList;

public class Operator {
	
	public boolean addBook(String bookname, String author, float price)
	{
		Book book = new Book(bookname,author,price);
		if (BookList.booklist.add(book))
		{
			return true;
		}
		else
			return false;
	}
	
	public boolean deleteBook(int id)
	{
		if(BookList.booklist.remove(id) != null)
		{
			return true;
		}
		else
			return false;
	}
	
	public boolean changeBoo(int id,String bookname, String author, float price)
	{
		Book book = (Book) BookList.booklist.get(id);
		if(book.setBook(bookname,author,price))
			return true;
		else
			return false;
	}
	
	public void findBoo(int id)
	{
		Book book = (Book)BookList.booklist.get(id);
		System.out.println("查找成功,您查找到的書爲第"+(id+1)+"本書!"+"書名爲:"+book.getBookname()+" 作者:"+book.getAuthor()+" 單價:"+book.getPrice()+"元/本");
	}
	
	public int orderFind(int number)
	{
		//System.out.println(number);
		if(number <= BookList.booklist.size())
		{
			int id = number - 1;
			return id;
		}
		else
			return -1;
	}
	
	public int nameFind(String name)
	{
		int id = -1;
		for(int i = 0; i < BookList.booklist.size(); i++)
		{
			Book book = (Book)BookList.booklist.get(i);
			if(book.getBookname().equals(name))
			{
				id = i;
				break;
			}
			else if(i<BookList.booklist.size())
				continue;
			else
			{
				System.out.println("未查找到您想要的書名");
				break;
			}
		}
		return id;
	}
	
	public void printAllBook()
	{
		for (int i = 0; i < BookList.booklist.size(); i++)
		{
			Book book = (Book)BookList.booklist.get(i);
			System.out.println("第"+(i+1)+"本書名:"+book.getBookname()+" 作者:"+book.getAuthor()+" 單價:"+book.getPrice()+"元/本");
		}
	}
}
Book.java和以前的一樣,沒發生任何變化。


BookList.java:

註釋部分是把load加進構造函數裏,但是這樣運行沒成功,所以還是用的tool:

package model;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

/*
public class BookList extends ArrayList{
	
	public static BookList booklist = new BookList();
	
	public BookList()
	{
		try {
			String filename = "D:\\Users\\alext\\workspace\\first\\book.txt";
			File file = new File(filename);
			BufferedReader reader = new BufferedReader(new FileReader(file));
			String temp;
			while((temp = reader.readLine()) != null)
			{
				String bookname = temp.split(",")[0];
				String author = temp.split(",")[1];
				String pricestr = temp.split(",")[2];
				float price = Float.parseFloat(pricestr);
				Book book = new Book(bookname,author,price);
				this.booklist.add(book);
			}
			reader.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
*/

public class BookList{
	
	public static ArrayList booklist = new ArrayList();

}

IO.java:

這個文件有一點小的變化,主要是用的booklist不一樣了:

package tool;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import model.Book;
import model.BookList;
import ui.MainClass;

public class IO {
	
	public void load()
	{
		try {
			String filename = "D:\\Users\\alext\\workspace\\first\\book.txt";
			File file = new File(filename);
			BufferedReader reader = new BufferedReader(new FileReader(file));
			String temp;
			while((temp = reader.readLine()) != null)
			{
				String bookname = temp.split(",")[0];
				String author = temp.split(",")[1];
				String pricestr = temp.split(",")[2];
				float price = Float.parseFloat(pricestr);
				Book book = new Book(bookname,author,price);
				BookList.booklist.add(book);
			}
			reader.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void save()
	{
		String fileName = "D:\\Users\\alext\\workspace\\first\\book.txt";
		String allbook="";
		for(int i = 0; i < BookList.booklist.size(); i++)
		{
			Book book = (Book)BookList.booklist.get(i);
			String temp = book.getBookname() + "," + book.getAuthor() + "," + book.getPrice() + "\r\n";
			allbook += temp;
		}
		try {
			File file1 = new File(fileName);
			FileWriter fileWriter;
			fileWriter = new FileWriter(file1);
			fileWriter.write(allbook);
			fileWriter.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

MainClass.java:

package ui;

import java.util.ArrayList;
import java.util.Scanner;

import control.Operator;
import model.Book;
import model.BookList;
import tool.IO;

public class MainClass {
	/*
	public static final int SIZE = 10;
	Book[] booklist = new Book[SIZE];
	*/
	
	public MainClass()
	{
		
		Scanner scan = new Scanner(System.in);
		IO io = new IO();
		io.load();
		printMenu();
		
		while(true)
		{
			//讀取用戶輸入
			int choice = scan.nextInt();
			
			if(choice == 5)
			{
				io.save();
				System.out.println("成功退出系統,歡迎再次光臨!");
				break;
			}
			switch(choice)
			{
			case 1: addBook(); break;
			case 2: deleteBoo(); break;
			case 3: changeBoo(); break;
			case 4: findBoo(); break;
			default: System.out.println("輸入非法"); printMenu(); continue;
			}
		}
		
		
		/*
		while(true)
		{	
			//根據用戶輸入調用不同方法
			if(choice == 1)
			{
				addBook();
			}
			else if(choice == 2)
			{
				deleteBoo();
			}
			else if(choice == 3)
			{
				changeBoo();
			}
			else if(choice == 4)
			{
				findBoo();
			}
			else if(choice == 5)
			{
				System.out.println("成功退出系統,歡迎再次光臨!");
				break;
			}
		}
		*/
	}
	void printMenu()
	{
		//打印菜單
		System.out.println("歡迎...");
		System.out.println("增加圖書...1");
		System.out.println("刪除圖書...2");
		System.out.println("修改圖書...3");
		System.out.println("查詢圖書...4");
		System.out.println("退出系統...5");	
	}
	
	void addBook()
	{
		System.out.println("當前共有:"+BookList.booklist.size()+"本書!");
		Scanner scan = new Scanner(System.in);
		System.out.println("請輸入圖書名:");
		String bookname = scan.next();
		System.out.println("請輸入作者:");
		String author = scan.next();
		System.out.println("請輸入單價:");
		float price = scan.nextFloat();
		Operator operator = new Operator();
		boolean isSuccess = operator.addBook(bookname, author, price);
		if(isSuccess)
		{
			System.out.println("增加成功!");
		}
		else
		{
			System.out.println("增加失敗!");
		}
		operator.printAllBook();
	}
	
	void deleteBoo()
	{
		Scanner scan = new Scanner(System.in);
		while(true)
		{
			System.out.println("請輸入按哪種方法刪除圖書:1、序號/2、書名/3、返回主菜單");
			int choose = scan.nextInt();
			if(choose == 1)
			{
				System.out.println("請輸入要刪除第幾本書:");
				int id = scan.nextInt();
				Operator operator = new Operator();
				id = operator.orderFind(id);
				//System.out.println(id);
				if(id > -1)
				{
					/*
					for(int i = id; i < count - 1 ; i++)
						booklist[i]=booklist[i+1];
					*/
					boolean isSuccess = operator.deleteBook(id);
					if(isSuccess)
						System.out.println("刪除成功!");
					else
						System.out.println("刪除失敗!");
					operator.printAllBook();
				}
				else
				{
					System.out.println("輸入錯誤!");
				}
			}
			else if(choose == 2)
			{
				System.out.println("請輸入您要刪除的書名:");
				String name = scan.next();
				Operator operator = new Operator();
				int id = operator.nameFind(name);
				if(id > -1)
				{
					/*
					for(int j = id; j<count-1; j++)
					{
						booklist[j]=booklist[j+1];
					}
					*/
					boolean isSuccess = operator.deleteBook(id);
					if(isSuccess)
						System.out.println("刪除成功!");
					else
						System.out.println("刪除失敗!");
					operator.printAllBook();
				}
				else
				{
						System.out.println("未查找到您想要的書名");
				}	
			}
			else if(choose == 3)
			{
				printMenu();
				break;
			}
			else
			{
				System.out.println("輸入非法!");
			}
		}
	}
	
	void changeBoo()
	{
		Scanner scan = new Scanner(System.in);
		while(true)
		{
			System.out.println("請輸入按哪種方法修改圖書:1、序號/2、書名/3、返回主菜單");
			int choose = scan.nextInt();
			if(choose == 1)
			{
				System.out.println("請輸入要修改第幾本書:");
				int number = scan.nextInt();
				Operator operator = new Operator();
				int id = operator.orderFind(number);
				if(id > -1)
				{
					Book book = (Book)BookList.booklist.get(id);
					//System.out.println("原書名爲:"+booklist[id].getBookname()+" 請輸入你要修改爲什麼書名:");
					System.out.println("原書名爲:"+book.getBookname()+" 請輸入你要修改爲什麼書名:");
					String str = scan.next();
					System.out.println("請輸入作者:");
					String author = scan.next();
					System.out.println("請輸入單價:");
					float price = scan.nextFloat();
					//booklist[id].setBook(str,author,price);
					boolean isSuccess = operator.changeBoo(id,str,author,price);
					if(isSuccess)
						System.out.println("修改成功!");
					else
						System.out.println("修改失敗!");
					operator.printAllBook();
				}
				else
				{
					System.out.println("輸入錯誤!");
				}
			}
			else if(choose == 2)
			{
				System.out.println("請輸入您要修改的書名:");
				String name = scan.next();
				Operator operator = new Operator();
				int id = operator.nameFind(name);
				if(id > -1)
				{
					Book book = (Book)BookList.booklist.get(id);
					//System.out.println("原書名爲:"+booklist[id].getBookname()+" 請輸入你要修改爲什麼書名:");
					System.out.println("原書名爲:"+book.getBookname()+" 請輸入你要修改爲什麼書名:");
					String str = scan.next();
					System.out.println("請輸入作者:");
					String author = scan.next();
					System.out.println("請輸入單價:");
					float price = scan.nextFloat();
					//booklist[id].setBook(str,author,price);
					boolean isSuccess = operator.changeBoo(id,str,author,price);
					if(isSuccess)
						System.out.println("修改成功!");
					else
						System.out.println("修改失敗!");
					operator.printAllBook();
				}
			}
			else if(choose == 3)
			{
				printMenu();
				break;
			}
			else
			{
				System.out.println("輸入非法!");
			}
		}
	}
	
	void findBoo()
	{
		Scanner scan = new Scanner(System.in);
		Operator operator = new Operator();
		while(true)
		{
			System.out.println("請輸入按哪種方法查找圖書:1、序號/2、書名/3、返回主菜單");
			int choose = scan.nextInt();
			if(choose == 1)
			{
				System.out.println("請輸入要查找第幾本書:");
				int number = scan.nextInt();
				int id = operator.orderFind(number);
				if(id > -1)
				{
					operator.findBoo(id);
				}
				else
				{
					System.out.println("輸入錯誤!");
				}
			}
			else if(choose == 2)
			{
				System.out.println("請輸入您要查找的書名:");
				String name = scan.next();
				int id = operator.nameFind(name);
				if(id > -1)
				{
					operator.findBoo(id);
				}
			}
			else if(choose == 3)
			{
				printMenu();
				break;
			}
			else
			{
				System.out.println("輸入非法!");
			}
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MainClass();
	}

}

好了!這樣就把以前的代碼改成MVC編程模式了,沒什麼基礎的人可能現在不知道這樣有什麼作用,等在接下來的文章裏,你便會發現它的神奇之處!

請期待下一篇:Java入門教程之圖書管理系統(由簡入繁)(五)

轉載請註明出處:http://blog.csdn.net/alextan_/article/details/65450781

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章