博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式应用之Observer模式(1)
阅读量:2498 次
发布时间:2019-05-11

本文共 3039 字,大约阅读时间需要 10 分钟。

关于observer模式的细节可以参考讲述设计模式的书籍。其类图如下所示:

Author:husthxd

From:

Msn:

本例主要讲述如何在项目中应用observer模式以满足客户的需求,客户需求如下:

1. 审核小组成员签名是在专门的机器上,所有成员每人一台机器坐在一起讨论,讨论完一起签名确认。
2. 定义会议室中某几台机器为审核小组讨论所要使用的机器,其中一台定义为主控机,有且只有一台。
3. 在会议室专门的机器上登录了的用户均为在此期间的审核小组成员
4. 未被主控机器访问的项目不视为进入审核小组审核状态,已被主控机访问审核页面的项目视为进入审核状态,并记录当前在特定机器上登陆的用户为该项目的审核小组成员。
5. 若中途有用户在特定的机器上登陆进入,则该用户也成为当时进入审核小组讨论状态但未审结的项目所对应的审核小组中的一员。
6. 若中途有用户退出系统,如存在已进入小组讨论状态但该用户未签名的项目,则在该用户退出前提示该用户有尚未签名的条目,但可不签名。该成员离开后,将不属于当时已进入小组讨论状态项目的审核小组成员,不需要该用户签名确认。

从需求我们可以看出,审核小组是一个虚拟的概念,审核小组成员是随着用户登陆和退出系统动态变化的,因而我们可以应用第二种方式的observer模式监听用户的登陆和退出从而触发相应的事件。

ActionListener作为用户登陆和退出的监听接口,代码如下:
package test.pattern;

/**

* Description : 监听器
* Author : husthxd
* 来自
* Date: 2005-6-3
* Time: 12:08:22
* Version 1.0
*/
public interface ActionListener {
//登陆
public void login(User user) throws CustomException;

//退出

public void logout(User user) throws CustomException;
}
ActionListener的实现类DefaultLogonListener,用户在登陆和退出的时候在相应的表中记录:
package test.pattern;

import org.apache.log4j.Logger;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Map;

/**

* Description :
* Author : husthxd
* 来自
* Date: 2005-6-3
* Time: 12:18:53
* Version 1.0
*/
public class DefaultLogonListener implements ActionListener {
static Logger logger = Logger.getLogger(DefaultLogonListener.class);
public DefaultLogonListener() {
}
//登陆
public void login(User user) throws CustomException {
Connection conn = null;
try {
//数据库连接
conn = ConnMgr.getConnection();
conn.setAutoCommit(false);
//sql语句
StringBuffer sqlstmt = new StringBuffer();
//判断用户是否已经在表中
//构造sql语句
sqlstmt.append("select count(*) v_count from LOGIN_USER where USERID =");
sqlstmt.append(user.getUserId());
logger.debug("sql语句:" + sqlstmt);
//取得结果
Map map = BusinessLogicQueryHelper.factory().getRecord(conn, sqlstmt.toString());
int iCount = Integer.parseInt(map.get("v_count").toString());
if (iCount > 0) {
return;
}
//执行sql语句
sqlstmt.append("insert into LOGIN_USER values (?,?)");
PreparedStatement stmt = conn.prepareStatement(sqlstmt.toString());
//设置参数
stmt.setInt(1, user.getUserId());
stmt.setString(2, user.getUserName());
//执行
stmt.execute();
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception e2) {
}
throw new CustomException("出错!" + e);
} finally {
ConnMgr.closeConnection(conn);
}
}

//退出

public void logout(User user) throws CustomException {
Connection conn = null;
try {
//数据库连接
conn = ConnMgr.getConnection();
conn.setAutoCommit(false);
StringBuffer sqlstmt = new StringBuffer();
//执行sql语句
sqlstmt.append("DELETE FROM LOGIN_USER WHERE USERID = ? ");
logger.debug("sql语句:" + sqlstmt);
PreparedStatement stmt = conn.prepareStatement(sqlstmt.toString());
stmt.setInt(1, user.getUserId());
//执行
stmt.execute();
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception e2) {
}
throw new CustomException("出错!" + e);
} finally {
ConnMgr.closeConnection(conn);
}
}
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21823/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6906/viewspace-21823/

你可能感兴趣的文章
python之偏函数
查看>>
vnpy学习_06回测结果可视化改进
查看>>
读书笔记_量化交易如何建立自己的算法交易01
查看>>
设计模式03_工厂
查看>>
设计模式04_抽象工厂
查看>>
设计模式05_单例
查看>>
设计模式06_原型
查看>>
设计模式07_建造者
查看>>
设计模式08_适配器
查看>>
设计模式09_代理模式
查看>>
设计模式10_桥接
查看>>
设计模式11_装饰器
查看>>
设计模式12_外观模式
查看>>
设计模式13_享元模式
查看>>
设计模式14_组合结构
查看>>
设计模式15_模板
查看>>
海龟交易法则01_玩风险的交易者
查看>>
CTA策略02_boll
查看>>
vnpy通过jqdatasdk初始化实时数据及历史数据下载
查看>>
设计模式19_状态
查看>>