JAVA机试题图书管理系统----三层架构模式

通过Java程序实现图书管理系统。
一、功能如下:使用一维数组
1、实现新增图书功能
2、实现查询图书功能
3、删除图书功能
二、具体实现:
图书类包括:图书名称,价格,借出状态(int类型0表示己借出1表示未借出),借出日期。
4个数组;
管理类包括以下方法:
Initial() 初始化图书信息方法
showMenu() 主菜单方法
add() 新增图书方法
search() 查询图书方法
delete() 删除图书方法
returnMain() 输入0返回主菜单
三、新增功能如图
在这里插入图片描述
四、查询图书功能如图
在这里插入图片描述
五、删除图书功能如图
在这里插入图片描述
注意:删除图书名称没有找到或己借出给出相应的错误提示

三层架构模式:
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了 “高内聚低耦合” 的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
表现层(JSP):
表现层也称为界面层,位于最外层(最上层),离用户最近。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。
业务层(逻辑层、service层):
业务层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层。例如Martin Fowler在《Patterns of Enterprise Application Architecture》一书中,将整个架构分为三个主要的层:表示层、领域层和数据源层。作为领域驱动设计的先驱Eric Evans,对业务逻辑层作了更细致地划分,细分为应用层与领域层,通过分层进一步将领域逻辑与领域逻辑的解决方案分离。   业务层在体系架构中的位置很关键,它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。由于层是一种弱耦合结构,层与层之间的依赖是向下的,底层对于上层而言是“无知”的,改变上层的设计对于其调用的底层而言没有任何影响。如果在分层设计时,遵循了面向接口设计的思想,那么这种向下的依赖也应该是一种弱依赖关系。因而在不改变接口定义的前提下,理想的分层式架构,应该是一个支持可抽取、可替换的“抽屉”式架构。正因为如此,业务层的设计对于一个支持可扩展的架构尤为关键,因为它扮演了两个不同的角色。对于数据访问层而言,它是调用者;对于表示层而言,它却是被调用者。依赖与被依赖的关系都纠结在业务层上,如何实现依赖关系的解耦,则是除了实现业务逻辑之外留给设计师的任务。
持久层(DAO):
持久层,有时候也称为是数据访问层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。采用DAO模式,建立实体类和数据库表映射(ORM映射)。简单的说法就是实现对数据表的select、insert、update以及delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。

图书管理系统三层架构如图所示
图书实体类

package com.icss.javaSE10.entity;

import java.util.Date;

/**

  • 图书实体类
  • @author apple

*/
public class Book {

private int id;// 图书编号
private String name;// 图书名称
private double price;// 图书价格
private int state;// 借出状态(int类型0表示已借出1表示未借出)
private Date borrowdate;// 借出日期

public Book() {
	super();
}

public Book(String name, double price, int state, Date borrowdate) {
	super();
	this.name = name;
	this.price = price;
	this.state = state;
	this.borrowdate = borrowdate;
}

public Book(int id, String name, double price, int state, Date borrowdate) {
	super();
	this.id = id;
	this.name = name;
	this.price = price;
	this.state = state;
	this.borrowdate = borrowdate;
}

public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

@Override
public String toString() {
	return "Book [id=" + id + ", name=" + name + ", price=" + price + ", state=" + state + ", borrowdate="
			+ borrowdate + "]";
}

public double getPrice() {
	return price;
}

public void setPrice(double price) {
	this.price = price;
}

public int getState() {
	return state;
}

public void setState(int state) {
	this.state = state;
}

public Date getBorrowdate() {
	return borrowdate;
}

public void setBorrowdate(Date borrowdate) {
	this.borrowdate = borrowdate;
}

}



初始化图书数据

package com.icss.javaSE10.dao;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import com.icss.javaSE10.entity.Book;

public class BookInit {

private static List<Book> bookList;

/**
 * 初始化图书数据
 */
public static List<Book> getBookList() {
	bookList = new ArrayList<Book>();
	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
	bookList.add(new Book(1, "java SE", 44.5, 1, null));
	bookList.add(new Book(2, "最美的时光", 68.8, 1, null));
	bookList.add(new Book(3, "离歌", 345.7, 1, null));
	try {
		bookList.add(new Book(4, "Spring", 68.5, 0, df.parse("2016-02-30")));
	} catch (ParseException e) {
		e.printStackTrace();
	}

	return bookList;
}

}



图书数据层接口-增删改查
package com.icss.javaSE10.dao;

import java.util.List;

import com.icss.javaSE10.entity.Book;

/**

  • 图书数据层接口-增删改查
  • @author apple

*/
public interface BookDao {

public int addBook(Book book)throws Exception;//增加图书

public List<Book> findAllBooks()throws Exception;//查询所有图书

public int deleteBook(String name)throws Exception;//删除图书

public Book findById(int id)throws Exception;//查询图书详情

}



package com.icss.javaSE10.dao.Impl;

import java.util.List;

import com.icss.javaSE10.dao.BookDao;
import com.icss.javaSE10.dao.BookInit;
import com.icss.javaSE10.entity.Book;

public class BookDaoImpl implements BookDao{

private List<Book> bookList = BookInit.getBookList();

/**
 * 添加图书
 */

@Override
public int addBook(Book book)throws Exception {
	int row = 0;
	book.setId(bookList.size()+1);
	boolean flag = bookList.add(book);
	if(flag) {
		row = 1;
	}
	return row;
}

/**
 * 查询所有图书
 */
@Override
public List<Book> findAllBooks() throws Exception {
	return bookList;
}

/**
 * 删除图书
 */
@Override
public int deleteBook(String name) throws Exception {
	int row = 0;
	for(int i=0;i<bookList.size();i++) {
		Book book = bookList.get(i);
		if(book.getName().equals(name)) {//注意equals与==的区别
			if(book.getState()==0) {
				row=2;//已借出
				break;
			}
			bookList.remove(book);
			row = 1;//可以删除
			break;
		}
	}
	return row;
}

/**
 * 查看图书详情
 */
@Override
public Book findById(int id) throws Exception {
	Book book = null;
	for(int i=0;i<bookList.size();i++) {
		Book book1 = bookList.get(i);
		if(book1.getId() == id) {
			book = book1;
			break;
		}
	}
	return book;
}

}



图书业务处理层接口
package com.icss.javaSE10.service;

import java.util.List;

import com.icss.javaSE10.entity.Book;

/**

  • 图书业务处理层接口
  • @author apple

*/
public interface BookService {

public int addBook(Book book)throws Exception;//添加图书

public List<Book> findAllBooks()throws Exception;//查看图书

public int deleteBook(String name)throws Exception;//删除图书

public Book findByBook(int id)throws Exception;//查询图书详情

}



package com.icss.javaSE10.service.Impl;

import java.util.List;

import com.icss.javaSE10.dao.BookDao;
import com.icss.javaSE10.dao.Impl.BookDaoImpl;
import com.icss.javaSE10.entity.Book;
import com.icss.javaSE10.service.BookService;

public class BookServiceImpl implements BookService {

private BookDao bookDao = new BookDaoImpl();

/**
 * 添加图书
 */
@Override
public int addBook(Book book) throws Exception {
	return bookDao.addBook(book);
}

@Override
public List<Book> findAllBooks() throws Exception {
	return bookDao.findAllBooks();
}

@Override
public int deleteBook(String name) throws Exception {
	return bookDao.deleteBook(name);
}

@Override
public Book findByBook(int id) throws Exception {
	return bookDao.findById(id);
}

}



package com.icss.javaSE10.ui;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

import com.icss.javaSE10.entity.Book;
import com.icss.javaSE10.service.BookService;
import com.icss.javaSE10.service.Impl.BookServiceImpl;

public class Test {

Scanner scanner = new Scanner(System.in);

public int showMenu() {
	System.out.println("欢迎使用图书管理系统");
	System.out.println("-----------------------------------------------------------");
	System.out.println("1.新增图书");
	System.out.println("2.查看所有图书");
	System.out.println("3.删除图书");
	System.out.println("4.查看图书详情");
	System.out.println("5.退出");
	System.out.println("-------------------------------------------------------------");
	System.out.println("请选择");
	return scanner.nextInt();
}

public static void main(String[] args) {

	Scanner scanner = new Scanner(System.in);
	Test test = new Test();
	BookService bookService = new BookServiceImpl();
	int num = 0;
	while (true && num == 0) {
		int menuNum = test.showMenu();
		if (menuNum == 1) {
			// 新增
			System.out.println("请输入图书名称:");
			String bookName = scanner.next();
			System.out.println("请输入图书价格:");
			double bookPrice = scanner.nextDouble();
			Book book = new Book(bookName, bookPrice, 1, new Date());
			int row = 0;
			try {
				row = bookService.addBook(book);
			} catch (Exception e) {
				System.out.println("添加图书出现异常");
				e.printStackTrace();
			}
			if (row > 0) {
				System.out.println("《" + bookName + "》添加成功!!!");
			}
		} else if (menuNum == 2) {
			// 查看所有图书
			List<Book> bookList = null;
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
			try {
				bookList = bookService.findAllBooks();
			} catch (Exception e) {
				System.out.println("查询图书出现异常");
				e.printStackTrace();
			}
			if (bookList != null && bookList.size() > 0) {
				System.out.println("序号\t状态\t名称\t价格\t借出日期");
				int number = 1;
				for (Book book : bookList) {
					String state = book.getState() == 1 ? "未借出" : "已借出";
					String date = book.getBorrowdate() == null ? "未借出" : df.format(book.getBorrowdate());
					System.out.println(
							number++ + "\t" + state + "\t" + book.getName() + "\t" + book.getPrice() + "\t" + date);

				}
			}
		} else if (menuNum == 3) {

			// 删除图书
			System.out.println("请输入要删除的图书名称:");
			String bookName = scanner.next();
			int row = 0;
			try {
				row = bookService.deleteBook(bookName);
			} catch (Exception e) {
				System.out.println("删除图书异常");
				e.printStackTrace();
			}
			if (row == 0) {
				System.out.println("未找到图书");
			}
			if (row == 1) {
				System.out.println("图书编号为《" + bookName + "》的图书删除成功");
			}
			if (row == 2) {
				System.out.println("该图书已借出");
			}
		} else if (menuNum == 4) {
			// 查看图书详情
			System.out.println("请输入要查询的图书编号:");
			int bookNo = scanner.nextInt();
			Book book = null;
			try {
				book = bookService.findByBook(bookNo);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (book != null) {
				DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
				System.out.println("序号\t状态\t名称\t价格\t借出日期");
				String state = book.getState() == 1 ? "未借出" : "已借出";
				String date = book.getBorrowdate() == null ? "未借出" : df.format(book.getBorrowdate());
				System.out.println(
						book.getId() + "\t" + state + "\t" + book.getName() + "\t" + book.getPrice() + "\t" + date);
			}
		} else {
			System.out.println("谢谢您的使用");
			break;
		}
		System.out.print("输入0返回上一级:");
		num = scanner.nextInt();
	} // 循环结束

}

}

三层开发模式的优缺点
优点:
1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、结构更加的明确
 
7、在后期维护的时候,极大地降低了维护成本和维护时间
缺点:
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值