模板方法模式(Template Method)
@@@模式定义:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
@@@练习示例:
登录控制
@@@示例代码:
\src\pattern\LoginModel.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package pattern; /**
* 封装进行登录控制所需要的数据
*/
public class LoginModel {
/**
* 登录人员的编号,通用的,可能是用户编号,也可能是工作人员编号
*/
private String loginId; /**
* 登录的密码
*/
private String pwd; public String getLoginId() {
return loginId;
} public void setLoginId(String loginId) {
this.loginId = loginId;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
}
}
\src\pattern\LoginTemplate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package pattern; /**
* 登录控制的模板
*/
public abstract class LoginTemplate {
/**
* 判断登录数据是否正确,也就是是否能登录成功
* @param lm 封装登录数据的Model
* @return true表示登录成功,false表示登录失败
*/
public final boolean login(LoginModel lm) {
// 1:根据登录人员的编号去获取相应的数据
LoginModel dbLm = this.findLoginUser(lm.getLoginId());
if (dbLm != null) {
// 2:对密码进行加密
String encryptPwd = this.encryptPwd(lm.getPwd());
// 把加密后的密码设置回到登录数据模型中
lm.setPwd(encryptPwd);
// 3:判断是否匹配
return this.match(lm, dbLm);
} return false;
} /**
* 根据登录编号来查找和获取存储中相应的数据
* @param loginId 登录编号
* @return 登录编号在存储中相对应的数据
*/
public abstract LoginModel findLoginUser(String loginId); /**
* 对密码数据进行加密
* @param pwd 密码数据
* @return 加密后的密码数据
*/
public String encryptPwd(String pwd) {
return pwd;
} /**
* 判断用户填写的登录数据和存储中对应的数据是否匹配得上
* @param lm 用户填写的登录数据
* @param dbLm 在存储中对应的数据
* @return true表示匹配成功,false表示匹配失败
*/
public boolean match(LoginModel lm, LoginModel dbLm) {
if (lm.getLoginId().equals(dbLm.getLoginId())
&& lm.getPwd().equals(dbLm.getPwd())) {
return true;
} return false;
}
}
\src\pattern\NormalLogin.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package pattern; /**
* 普通用户登录控制的逻辑处理
*/
public class NormalLogin extends LoginTemplate {
@Override
public LoginModel findLoginUser(String loginId) {
// 这里省略具体的处理,仅做示意,返回一个有默认数据的对象
LoginModel lm = new LoginModel();
lm.setLoginId(loginId);
lm.setPwd("userPwd");
return lm;
}
}
\src\pattern\WorkerLogin.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package pattern; /**
* 工作人员登录控制的逻辑处理
*/
public class WorkerLogin extends LoginTemplate {
@Override
public LoginModel findLoginUser(String loginId) {
// 这里省略具体的处理,仅做示意,返回一个有默认数据的对象
LoginModel lm = new LoginModel();
lm.setLoginId(loginId);
lm.setPwd("workerPwd");
return lm;
} @Override
public String encryptPwd(String pwd) {
// 覆盖父类的方法,提供真正的加密实现
// 这里对密码进行加密,比如使用MD5、3DES等,省略了
System.out.println("使用MD5进行密码加密");
return pwd;
}
}
\src\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package user; import pattern.LoginModel;
import pattern.LoginTemplate;
import pattern.NormalLogin;
import pattern.WorkerLogin; public class Client {
public static void main(String[] args) {
// 准备登录人的信息
LoginModel lm = new LoginModel();
lm.setLoginId("admin");
lm.setPwd("workerPwd"); // 准备用来进行判断的对象
LoginTemplate lt1 = new WorkerLogin();
LoginTemplate lt2 = new NormalLogin(); // 进行登录测试
boolean flag1 = lt1.login(lm);
System.out.println("可以登录工作平台=" + flag1); boolean flag2 = lt2.login(lm);
System.out.println("可以进行普通人员登录=" + flag2);
}
}
@@@模式的实现:
1) 一般实现成抽象类(“既要约束子类的行为, 又要为子类提供公共功能”);
2) 理论依据是“后期绑定”技术(new谁就调用谁的方法);
3) 可以使用继承方式还可以使用回调方式
@@@模式的优点:
1) 实现代码复用;
@@@模式的缺点:
1) 算法骨架不容易升级;
@@@模式的本质:
固定算法骨架。
@@@模式体现的设计原则:
1) 开闭原则;
2) 里氏替换原则;
模板方法模式(Template Method)的更多相关文章
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释
模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...
- 模板方法模式-Template Method(Java实现)
模板方法模式-Template Method 在模板模式中, 处理的流程被定义在父类中, 而具体的处理则交给了子类. 类关系图很简单: Template接口 这里定义了子类需要实现的方法(before ...
- 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释
模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...
- 设计模式 - 模板方法模式(template method pattern) 具体解释
模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...
- 二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
- 模板方法模式(Template Method Pattern)——复杂流程步骤的设计
模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
随机推荐
- jQuery遍历Table tr td td中包含标签
function shengchen() { var arrTR = $("#tbModule").children(); var Context=""; $( ...
- C++虚函数表原理
C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指 向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技 ...
- Python 实例: 备份文件
都说生命苦短,我用python, 所以这两天我也开始学python了. 昨天搞了下语法,今天搞出来个实例,备份文件.尽管编码相当烂,但是测试了一下,还真能用. 它读取一个任务文件, 根据指定的任务参数 ...
- Spring学习笔记(二)Spring基础AOP、IOC
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
- MySQL数据库备份和还原
备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 备份MySQL数据库 ...
- 树莓派I2C连接18B20
按图连接设备 载入模块 sudo modprobe w1-gpio sudo modprobe w1-therm cd /sys/bus/w1/devices/ 显示结果 ls pi@raspberr ...
- mysql repair data 语句
1. 这条语句主要是用来修复一个表中的数据 , 在另一个统计表中没有统计时,进行修改统计表的操作 update expert_count ec inner join ( select sum(e.EF ...
- nyoj 203 三国志(最短路加01背包)
三国志 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...
- [iOS基础控件 - 6.9] 聊天界面Demo
A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话 ...
- 集合引入(ArrayList、LinkedList)
1.引入 代替数组固定大小操作不变 2.ArrayList 常用的操作(add,remove) 3.LinkedList 能实现一些特殊的操作(pop)