- 浏览: 791550 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty源码学习-FileRegion -
飞天奔月:
写得有趣 ^_^
那一年你定义了一个接口 -
GoldRoger:
第二个方法很好
java-判断一个自然数是否是某个数的平方。当然不能使用开方运算 -
bylijinnan:
<script>alert("close ...
自己动手实现Java Validation -
paul920531:
39行有个bug:"int j=new Random ...
java-蓄水池抽样-要求从N个元素中随机的抽取k个元素,其中N无法确定
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * 模板方法模式: * 采用继承的方式(Template类是一个抽象类)实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节 * 与工厂方法模式非常相似。只不过模板方法模式关注算法,而工厂方法关注对象的创建(factoryMethod()里面是返回一个产品对象) * 与策略模式相比,策略模式的策略是平行、平等的,而且一个策略是一个完整的算法,相互之间可切换; * 但模板方法模式的算法框架是固定的,只是算法的部分细节不同 * * 以下代码考虑这样一个需求: * 验证用户登录,分为普通用户和特殊用户,特殊用户的密码是加密的 */ //============1.================= //如果需要更多验证(例如页面上的验证码),简单起见,可分别extends LoginModel和LoginTemplate class LoginModel { private String userID; private String password; public String getUserID() { return userID; } public void setUserID(String userID) { this.userID = userID; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } abstract class LoginTemplate { public abstract LoginModel findLoginModel(String userID); //普通用户登陆(子类)时,密码不加密,直接返回密码就OK。特殊用户则覆盖此方法加密密码 public String encryptPassword(String password) { return password; } public final boolean loginVerify(LoginModel lm) { boolean pass = false; LoginModel dblm = this.findLoginModel(lm.getUserID()); if (dblm != null) { String pwd = encryptPassword(lm.getPassword()); lm.setPassword(pwd); pass = this.match(lm, dblm); } return pass; } public boolean match(LoginModel lm, LoginModel dblm) { return lm.getUserID().equals(dblm.getUserID()) && lm.getPassword().equals(dblm.getPassword()); //...可有更多验证 } } class NormalLoginTemplate extends LoginTemplate { public LoginModel findLoginModel(String userID) { //模拟从数据库取数据 LoginModel dblm = new LoginModel(); dblm.setUserID(userID); dblm.setPassword("passwordInDB"); return dblm; } //encryptPassword方法就不需要重写 } class SpecialLoginTemplate extends LoginTemplate { public LoginModel findLoginModel(String userID) { //模拟从数据库取数据 LoginModel dblm = new LoginModel(); dblm.setUserID(userID); dblm.setPassword("passwordInDB"); return dblm; } //重写方法。密码加密。match()方法是比较加密后的密码是否一致 public String encryptPassword(String pwd) { System.out.println("encrypting password..."); return pwd; //实际应用中返回加密后的密码。这里简单地返回原密码 } } //============2.================= /* * 用接口回调的方法来实现 * * 这下面代码看着有些别扭:LoginCallBack里面转调Template的方法,但Template里面又转调LoginCallBack的方法 * 但正是这样,通过LoginCallBack的不同实现,达到了模板模式“子类实现细节”的目的 */ interface LoginCallBack { LoginModel findLoginModel(String userID); //注意传递了一个LoginTemplate2 String encryptPassword(String pwd, LoginTemplate2 template); boolean match(LoginModel lm, LoginModel lmdb, LoginTemplate2 template); } class LoginTemplate2 { //传入一个LoginCallBack,实际调用时以内部类的形式实现接口里的方法 public final boolean verifyLogin(LoginModel lm, LoginCallBack callback) { LoginModel lmdb = callback.findLoginModel(lm.getUserID()); String password = callback.encryptPassword(lm.getPassword(), this); lmdb.setPassword(password); return callback.match(lm, lmdb, this); } public boolean match(LoginModel lm, LoginModel dblm) { return lm.getUserID().equals(dblm.getUserID()) && lm.getPassword().equals(dblm.getPassword()); } //可根据实际情况看是否要重写 public String encryptPassword(String pwd) { return pwd; } } //客户端。测试 public class TemplateMethodPattern { public static void main(String[] args) { //测试情况1 //制造测试数据-一般用户登录 LoginModel userA = new LoginModel(); userA.setUserID("user"); userA.setPassword("passwordInDB"); LoginTemplate template = new NormalLoginTemplate(); boolean pass = template.loginVerify(userA); System.out.println(userA.getUserID() + " login success?" + pass); //制造测试数据-特殊用户登录 LoginModel userB = new LoginModel(); userB.setUserID("admin"); userB.setPassword("passwordInDB"); LoginTemplate sTemplate = new SpecialLoginTemplate(); pass = sTemplate.loginVerify(userB); System.out.println(userB.getUserID() + " login success?" + pass); //测试情况2-接口回调实现 LoginTemplate2 template2 = new LoginTemplate2(); boolean pass2 = template2.verifyLogin(userA, new LoginCallBack(){ public String encryptPassword(String pwd, LoginTemplate2 template) { return template.encryptPassword(pwd); //自己不需要实现,转调template里面的默认实现 } public LoginModel findLoginModel(String userID) { //从数据库取LoginModel,简单示意一下 LoginModel userAA =new LoginModel(); userAA.setUserID(userID); userAA.setPassword("passwordInDB"); return userAA; } public boolean match(LoginModel lm, LoginModel lmdb, LoginTemplate2 template) { return template.match(lm, lmdb); } }); System.out.println(userA.getUserID() + " login success?" + pass2); pass2 = template2.verifyLogin(userB, new LoginCallBack(){ //特殊用户登陆,重写加密密码 public String encryptPassword(String pwd, LoginTemplate2 template) { System.out.println("encrypting password..."); String encryptedPwd = pwd; //模拟加密 return encryptedPwd; } public LoginModel findLoginModel(String userID) { //从数据库取LoginModel,简单示意一下 LoginModel userBB =new LoginModel(); userBB.setUserID(userID); userBB.setPassword("passwordInDB"); return userBB; } public boolean match(LoginModel lm, LoginModel lmdb, LoginTemplate2 template) { return template.match(lm, lmdb); } }); System.out.println(userB.getUserID() + " login success?" + pass); //书上认为Collections.sort是模板模式的一种实现,我觉得这一点不好理解 //stackoverflow上有帖子认为:All non-abstract methods of java.util.AbstractList是模板模式 List<LoginModel> list = new ArrayList<LoginModel>(); list.add(userA); list.add(userB); Collections.sort(list, new Comparator<LoginModel>(){ public int compare(LoginModel arg0, LoginModel arg1) { return 0; } }); } } /* 很早就知道jdbc用到template模式了,但之前还不是很清楚 其实就是把公用的操作(获取数据库连接,执行sql语句,为sql语句参数赋值等等)写到抽象的Template去, 具体的sql以及sql的参数由子类覆写提供 书上的例子有点复杂,我参照网上写了一个简单的示意: 这个JDBCTemplate只实现查找功能,其他操作略去(增、删、改、数据库连接的释放等) */ abstract class DaoTemplate { /** * 根据条件查询(如果指定条件) * @param sql * @param args 条件参数 * @return */ public Object findObject(String sql, Object[] args){ Object obj = null; Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //简单模拟获取Connection操作,更多情况下是写一个JdbcUtil conn = DriverManager.getConnection("url", "user", "pwd"); ps = conn.prepareStatement(sql); //设置查询参数(条件) for (int i = 0, size = args.length; i < size; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); if (rs.next()) { obj = rowMapper(rs); //对结果集进行处理,返回实际的业务对象 } } catch (SQLException e) { e.printStackTrace(); } return obj; } abstract protected Object rowMapper(ResultSet rs); } class LoginModelDaoImpl extends DaoTemplate { public LoginModel findLoginModel(String userID) throws SQLException { String sql = "select userid,password from loginmodel where userid=?"; Object[] args = new String[]{userID}; LoginModel lm =(LoginModel) super.findObject(sql, args); return lm; } @Override protected Object rowMapper(ResultSet rs){ LoginModel lm = new LoginModel(); try { lm.setUserID(rs.getString("userid")); lm.setPassword(rs.getString("password")); } catch (SQLException e) { e.printStackTrace(); } return lm; } }
发表评论
-
J2EE设计模式-Intercepting Filter
2013-11-27 16:56 1558Intercepting Filter类似于职责链模式 有两种 ... -
《重构,改善现有代码的设计》第八章 Duplicate Observed Data
2012-12-04 20:34 1555import java.awt.Color; impor ... -
读《研磨设计模式》-代码笔记-状态模式-State
2012-10-07 16:56 1438声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-访问者模式-Visitor
2012-10-06 23:43 1107声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-命令模式-Command
2012-10-06 23:40 1252声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-适配器模式-Adapter
2012-09-26 00:23 1435声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-外观模式-Facade
2012-09-25 23:46 1072声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-解释器模式-Interpret
2012-09-23 23:55 1252声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-备忘录模式-Memento
2012-09-23 00:05 1773声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-享元模式-Flyweight
2012-09-21 21:01 1240声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-抽象工厂模式-Abstract Factory
2012-09-21 20:59 1008声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-职责链模式-Chain Of Responsibility
2012-09-15 17:57 1668声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-装饰模式-Decorator
2012-09-15 17:56 1208声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-桥接模式
2012-09-12 18:27 1409声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-策略模式-Strategy
2012-09-12 18:24 1124声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-工厂方法模式
2012-08-24 16:57 1189声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-简单工厂模式
2012-08-24 16:56 1133声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-组合模式
2012-08-23 18:13 922声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
式工工工工
2012-08-23 00:09 0package pattern; //=========== ... -
读《研磨设计模式》-代码笔记-原型模式
2012-08-21 19:34 1129声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ...
相关推荐
设计模式Golang实现《研磨设计模式》读书笔记Go语言设计模式Go语言设计模式的实例代码创建模式工厂简单模式(Simple Factory)工厂方法模式(工厂方法)抽象工厂模式(Abstract Factory)创建者模式(Builder)原型...
《研磨设计模式》是由陈臣和王斌合著,由清华大学出版社出版的一本深入探讨设计模式的专业书籍。设计模式是软件工程中的一个重要概念,它代表了在特定上下文中解决问题的常见方法,经过时间和实践的验证,具有很高的...
下面将详细讨论在标题"设计模式Golang实现-《研磨设计模式》读书笔记"中所涵盖的创建型模式、结构型模式和行为型模式。 1. 创建型模式: - 单例模式:确保一个类只有一个实例,并提供一个全局访问点。在Go中,...
在IT行业中,设计模式是软件开发中的重要概念,它们代表了在特定情境下解决常见问题的最佳...通过阅读《研磨设计模式》及配套心得,开发者可以深化对这些经典模式的理解,进而在实际编程中灵活运用,提高软件设计能力。
8. **研磨设计模式-127页 文字版**:这可能是对设计模式的简化解读,适用于初学者快速掌握设计模式的概念和应用。 9. **C语言深度解剖(第1版--网络版)**:此书可能深入剖析了C语言的细节,包括编译过程、内存管理、...