用设计模式设计一个简易系统

仓库管理系统

1 系统功能要求:
1.1 注册功能
在这里插入图片描述
该系统提供注册功能,用户必须先通过注册账号来实现登录。
1.2 登录功能
在这里插入图片描述
用户通过输入账号密码实现登录功能,进而对仓库管理系统进行操作和管理。
1.3 货物入库
在这里插入图片描述
填写新货物的基本信息,实现对新货物的入库功能。
1.4 货物出库
在这里插入图片描述
选择要出库的货物,实现对货物的出库功能以及可删除货物的基本信息。
1.5 货物查询
在这里插入图片描述
通过输入货物编号/货物名称/货架号,实现对特定货物基本信息的查询。
1.6 用户管理
在这里插入图片描述
可修改此账号的基本信息,修改后可撤销以及可删除本账号的基本信息,实现对用户信息的管理功能。

2 系统详细设计
2.1 单例模式
功能说明:注册界面使用了单例模式,点击注册按钮时,无论如何,都只能打开一个注册界面。如果不使用单例模式对注册窗口对象进行唯一化,则将弹出多个窗口且这些窗口显示的内容完全一致,浪费内存资源。
源代码:Register.java:

public class Register extends JFrame {

	private static Register register = null;

	public static Register getInstance() {
		  if (register == null)
		  	register = new Register();
		  return register;
	}

	private Register() {
...
}
}

UML类图:
在这里插入图片描述
2.2 观察者模式
功能说明:登录界面用到了观察者模式,通过自定义一个登录控件,该登录控件充当观察目标,而包含该登录控件的界面是观察者。如果登录控件对象的相关事件被用户激活,则会调用界面对象中的事件处理方法来进行处理。同一个登录控件可以运用于多个不同的项目,就像按钮控件、文本框控件一样,使用该控件的开发人员只需要在界面代码中创建一个登录控件对象,并将当前界面对象注册为观察者,同时实现事件监听接口中的事件处理方法即可,重用性和扩展性非常好。
源代码:具体目标类LoginBean(登录控件类):

public class LoginBean extends JPanel implements ActionListener {

...

	LoginEventListener lel;
	LoginEvent le;

	public LoginBean() {
		...
	}

	public void addLoginEventListener(LoginEventListener lel) {

		this.lel = lel;
	}

	private void fireLoginEvent(Object object, String userName, String password) {

		le = new LoginEvent(btnLogin, userName, password);
		lel.validateLogin(le);
	}

	public void actionPerformed(ActionEvent event) {

		if (btnLogin == event.getSource()) {
			String userName = this.txtUserName.getText();
			String password = this.txtPassword.getText();

			fireLoginEvent(btnLogin, userName, password);
		}
		if (btnRegister == event.getSource()) {
			Register register = Register.getInstance();
			register.setVisible(true);
		}
	}
}

具体观察者类Login(登录界面类):

public class Login extends JFrame implements LoginEventListener {

	...

	public Login() {
		...

		lb = new LoginBean();
		lb.addLoginEventListener(this);

		...
	}

	public void validateLogin(LoginEvent event) {

		String userName = event.getUserName();
		String password = event.getPassword();

		DataOperation dataOperarion = new CipherAdapter();
		password = dataOperarion.doEncrypt(password);

		user = Dao.login(userName, password);
		if (user.getUserName().equals(userName)
				&& !user.getUserName().equals("")) {
			dispose();
			Stock stock = Stock.getInstance();
			stock.setVisible(true);
		} else {
			JOptionPane.showMessageDialog(null, "用户名或密码错误,请重新输入!");
		}
	}

	public static UserInfo getUser() {
		return user;
	}

	public static void main(String[] args) {
		new Login().setVisible(true);
	}
}

UML类图:
在这里插入图片描述
2.3 适配器模式
功能说明:账号密码用到了适配器模式,将密码加密后再存储在数据库中。此将目标类和加密适配器类进行解耦,增加了类的透明性和复用性,同时系统的灵活性和扩展性都非常好,更换加密适配器或增加新的加密适配器都非常方便,符合“开闭原则”。
源代码:目标抽象类DataOperation(数据操作类):

public abstract class DataOperation {

	private String password;

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPassword() {
		return this.password;
	}

	public abstract String doEncrypt(String ps);
}

适配者类Caesar(数据加密类):

public final class Caesar {

	public String doEncrypt(String ps) {
		String es = "";
		for (int i = 0; i < ps.length(); i++) {
		  ...
		}
		return es;
	}

}

适配器类CipherAdapter(加密适配器类):

public class CipherAdapter extends DataOperation {

	private Caesar cipher;

	public CipherAdapter() {
		cipher = new Caesar();
	}

	public String doEncrypt(String ps) {
		return cipher.doEncrypt(ps);
	}
}

UML类图:
在这里插入图片描述
2.4 外观模式
功能说明:在JDBC数据库操作中用到了外观模式。在进行数据库操作的时候,首先需要创建连接Connection对象,然后通过Connection对象创建语句Statement对象或其子类的对象,如果是数据查询语句,通过Statement对象可以获取结果集ResultSet对象。在大部分数据操作代码中都多次定义了这三个对象,本人在此部分使用外观模式简化了JDBC操作代码。
源代码:Dao.java:

public class Dao {

	...
	private static Connection conn = null;
	private static Statement statement = null;

	public Dao() {
		try {
			if (conn == null) {
				Class.forName(driver).newInstance();
				conn = DriverManager.getConnection(jdbcUrl, user, password);
				statement = conn.createStatement(
						ResultSet.TYPE_SCROLL_SENSITIVE,
						ResultSet.CONCUR_UPDATABLE);
			} else
				return;
		} catch (Exception ee) {
			ee.printStackTrace();
		}
	}

	public static ResultSet executeQuery(String sql) {
		try {
			if (conn == null)
				new Dao();
			return statement.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

	public static int executeUpdate(String sql) {
		try {
			if (conn == null)
				new Dao();
			return statement.executeUpdate(sql);
		} catch (SQLException e) {
			e.printStackTrace();
			return -1;
		}
	}

	public static void close() {
		try {
			statement.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			conn = null;
		}
	}
...
}

UML类图:
在这里插入图片描述
2.5 备忘录模式
功能说明:用户信息管理模块用到了备忘录模式,在用户信息管理模块中,用户可以修改自己的各项信息,在进行了错误操作之后,用户可以进行撤销,恢复到之前的状态,使得系统更加的人性化。
源代码:原发器UserInfo(用户信息类):

public class UserInfo {

	...

	public Memento saveMemento() {
		return new Memento(userName, password, tel, idCard, addr);
	}

	public void restoreMemento(Memento memento) {
		this.userName = memento.getUserName();
		this.password = memento.getPassword();
		this.tel = memento.getTel();
		this.idCard = memento.getIdCard();
		this.addr = memento.getAddr();
	}

}

备忘录Memento:

class Memento {

	...

	public Memento(String userName, String password, String tel, String idCard,
			String addr) {
		this.userName = userName;
		this.password = password;
		this.tel = tel;
		this.idCard = idCard;
		this.addr = addr;
	}

	...

}

负责人Caretaker:

public class Caretaker {

	private Memento memento;

	public Memento getMemento() {
		return memento;
	}

	public void setMemento(Memento memento) {
		this.memento = memento;
	}

}

UML类图:
在这里插入图片描述
3 总结
通过对各个模块的调试,基本都实现了该系统的功能。

  • 34
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 94
    评论
MVC模式是一种经典的设计模式,它将系统分为三个部分:模型(Model)、视图(View)和控制器(Controller),以实现系统的解耦和可维护性。 在简易点餐系统中,我们可以将模型定义为数据模型,视图定义为界面,控制器定义为业务逻辑。 1. 数据模型(Model) 数据模型包含系统中的所有数据,例如菜单,订单,用户等。它负责管理数据的存储、读取和更新。可以使用关系型数据库或非关系型数据库来实现数据模型。 2. 界面(View) 界面是系统的用户界面,它负责展示数据和接收用户的操作。在简易点餐系统中,可以设计一个简单的界面,包含菜单列表、购物车和结算功能。 3. 业务逻辑(Controller) 业务逻辑是系统的核心,它负责处理用户的操作,包括浏览菜单、添加菜品到购物车、修改购物车中的菜品、下单等。在简易点餐系统中,可以设计一个控制器来处理这些操作,并将结果返回给界面。 下面是一个简单的实现: 模型(Model): ``` class MenuItem: def __init__(self, name, price): self.name = name self.price = price class OrderItem: def __init__(self, menu_item, quantity): self.menu_item = menu_item self.quantity = quantity class Order: def __init__(self): self.items = [] def add_item(self, menu_item, quantity): self.items.append(OrderItem(menu_item, quantity)) def remove_item(self, index): del self.items[index] def total_price(self): return sum(item.menu_item.price * item.quantity for item in self.items) ``` 界面(View): ``` class MenuView: def __init__(self, menu_items): self.menu_items = menu_items def display_menu(self): for i, item in enumerate(self.menu_items): print(f"{i + 1}. {item.name}: ${item.price}") class OrderView: def __init__(self, order): self.order = order def display_order(self): for i, item in enumerate(self.order.items): print(f"{i + 1}. {item.menu_item.name} x {item.quantity}: ${item.menu_item.price * item.quantity}") print(f"Total: ${self.order.total_price()}") class CheckoutView: def __init__(self, order): self.order = order def display_checkout(self): print("Thank you for your order!") print("Your order:") OrderView(self.order).display_order() ``` 控制器(Controller): ``` class MenuController: def __init__(self, menu_items): self.menu_items = menu_items self.view = MenuView(menu_items) def display_menu(self): self.view.display_menu() class OrderController: def __init__(self, order): self.order = order self.view = OrderView(order) def add_item(self, menu_item, quantity): self.order.add_item(menu_item, quantity) self.view.display_order() def remove_item(self, index): self.order.remove_item(index) self.view.display_order() class CheckoutController: def __init__(self, order): self.order = order self.view = CheckoutView(order) def checkout(self): self.view.display_checkout() ``` 使用示例: ``` if __name__ == "__main__": # 初始化菜单 menu_items = [MenuItem("Hamburger", 5), MenuItem("Fries", 2), MenuItem("Soda", 1)] # 初始化订单 order = Order() # 显示菜单 menu_controller = MenuController(menu_items) menu_controller.display_menu() # 添加菜品到购物车 order_controller = OrderController(order) order_controller.add_item(menu_items[0], 2) order_controller.add_item(menu_items[1], 1) order_controller.add_item(menu_items[2], 3) # 修改购物车中的菜品 order_controller.remove_item(0) # 结算订单 checkout_controller = CheckoutController(order) checkout_controller.checkout() ``` 这就是一个简单的基于MVC设计模式的点餐系统实现。它将系统的不同部分分离开来,使得系统更易于维护和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 94
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值