Java-回调
2016-01-08 10:18
477 查看
-- from 读书笔记《研磨设计模式》模板模式
例子1:在模板方法中应用
/**
* 登陆模板
*/
public class LoginTemplate {
/**
* 登陆判断
*
* @param model
* 封装登陆数据的model对象
* @return true表示登陆成功,false表示失败
*/
public boolean login(LoginModel model, LoginCallback callback) {
LoginModel loginModel = callback.findLoginUser(model.getLoginId());
if (loginModel != null) {
String encryptPwd = callback.encryptPwd(model.getPwd(), this);
model.setPwd(encryptPwd);
return callback.match(model, loginModel, this);
}
return false;
}
/**
* 密码加密
*
* @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;
}
}
模板中需要具体实现的地方使用了callback
/**
* 登陆控制的模板方法中需要的回调接口,把所有需要的接口方法都定义出来
*
*/
public interface LoginCallback {
/**
* 根据登陆编号查询存储的用户数据
* @param loginId 登陆编号
* @return 存储中的登陆数据
*/
public LoginModel findLoginUser(String loginId);
/**
* 密码加密
* @param pwd 明文密码
* @return 加密后的密码串
*/
public String encryptPwd(String pwd, LoginTemplate loginTemplate);
/**
* 判断用户填写登陆数据与数据存储是否相符
* @param lm 登陆数据
* @param dblm 存储数据
* @param loginTemplate 通过模板对象调用默认实现
* @return true表示一致,false表示不相符
*/
public boolean match(LoginModel lm, LoginModel dblm, LoginTemplate loginTemplate);
}
回调中可以通过接口实现自己的逻辑方法,也可以通过传递的loginTemplate参数回调其默认实现
//回调
LoginTemplate lt = new LoginTemplate();
boolean flag = lt.login(lm, new LoginCallback() {
@Override
public boolean match(LoginModel lm, LoginModel dblm,
LoginTemplate loginTemplate) {
return loginTemplate.match(lm, dblm);//转调模板实现
}
@Override
public LoginModel findLoginUser(String loginId) {
LoginModel lm = new LoginModel();
lm.setLoginId(loginId);
lm.setPwd("ppwwdd");
return lm;
}
@Override
public String encryptPwd(String pwd, LoginTemplate loginTemplate) {
return loginTemplate.encryptPwd(pwd);//转调模板实现
}
});
这个实现采用匿名类实现callBack接口
假设loginTemplate为A,loginCallBack为B,则整个过程可描述为A的a方法调用B的b方法,B的b方法又去调用A的a1方法完成实现,包含了回调的调用。
例子1:在模板方法中应用
/**
* 登陆模板
*/
public class LoginTemplate {
/**
* 登陆判断
*
* @param model
* 封装登陆数据的model对象
* @return true表示登陆成功,false表示失败
*/
public boolean login(LoginModel model, LoginCallback callback) {
LoginModel loginModel = callback.findLoginUser(model.getLoginId());
if (loginModel != null) {
String encryptPwd = callback.encryptPwd(model.getPwd(), this);
model.setPwd(encryptPwd);
return callback.match(model, loginModel, this);
}
return false;
}
/**
* 密码加密
*
* @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;
}
}
模板中需要具体实现的地方使用了callback
/**
* 登陆控制的模板方法中需要的回调接口,把所有需要的接口方法都定义出来
*
*/
public interface LoginCallback {
/**
* 根据登陆编号查询存储的用户数据
* @param loginId 登陆编号
* @return 存储中的登陆数据
*/
public LoginModel findLoginUser(String loginId);
/**
* 密码加密
* @param pwd 明文密码
* @return 加密后的密码串
*/
public String encryptPwd(String pwd, LoginTemplate loginTemplate);
/**
* 判断用户填写登陆数据与数据存储是否相符
* @param lm 登陆数据
* @param dblm 存储数据
* @param loginTemplate 通过模板对象调用默认实现
* @return true表示一致,false表示不相符
*/
public boolean match(LoginModel lm, LoginModel dblm, LoginTemplate loginTemplate);
}
回调中可以通过接口实现自己的逻辑方法,也可以通过传递的loginTemplate参数回调其默认实现
//回调
LoginTemplate lt = new LoginTemplate();
boolean flag = lt.login(lm, new LoginCallback() {
@Override
public boolean match(LoginModel lm, LoginModel dblm,
LoginTemplate loginTemplate) {
return loginTemplate.match(lm, dblm);//转调模板实现
}
@Override
public LoginModel findLoginUser(String loginId) {
LoginModel lm = new LoginModel();
lm.setLoginId(loginId);
lm.setPwd("ppwwdd");
return lm;
}
@Override
public String encryptPwd(String pwd, LoginTemplate loginTemplate) {
return loginTemplate.encryptPwd(pwd);//转调模板实现
}
});
这个实现采用匿名类实现callBack接口
假设loginTemplate为A,loginCallBack为B,则整个过程可描述为A的a方法调用B的b方法,B的b方法又去调用A的a1方法完成实现,包含了回调的调用。
相关文章推荐
- Lua中让回调函数支持回调对象方法的解决方法
- 我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
- 谈谈JavaScript自定义回调函数
- jquery load事件(callback/data)使用方法及注意事项
- C语言模块回调Lua函数的两种方法
- C++基础入门教程(九):函数指针之回调
- C#的回调机制浅析
- PHP callback函数使用方法和注意事项
- Node.js 异步编程之 Callback介绍(一)
- 浅析PHP中call user func()函数及如何使用call user func调用自定义函数
- Asp.net回调技术Callback学习笔记
- javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
- 深入浅析NodeJs并发异步的回调处理
- 理解javascript中的回调函数(callback)
- JavaScript中使用Callback控制流程介绍
- JavaScript控制图片加载完成后调用回调函数的方法
- 说明Java的传递与回调机制的代码示例分享
- Python通过正则表达式选取callback的方法
- python通过定义一个类实例作为ftp回调方法
- node异步和同步