模板方法模式
1.定义
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
2.示例代码
用来实现普通登陆和工作人员登陆的示例代码
/*封装进行登陆控制所需要的数据*/ 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; } } /*定义公共登陆控制算法骨架*/ public abstract class LoginTemplate{ //判断是否登陆 public final boolean login(LoginModel lm){ //1.根据人员编号获取相应的数据 LoginModel dbLm = this.findLoginUser(lm.getLoginId()); if(dbLm != null){ //2.对密码进行加密算法 String encryptPwd = this.encryptPwd(lm.getPwd); //3.把加密后的密码设置回到登陆模型中 lm.setPwd(encryptPwd); //4.判断是否匹配 return this.match(lm,dbLm); } } //根据登陆编号获取相应信息 public abstract LoginModel findLoginUser(String loginId); //对密码加密 public String encryptPwd(String pwd){ return pwd; } //判断是否能匹配 public boolean match(LoginModel lm,LoginModel dbLm){ if(lm.getLoginId().equals(dbLm.getLoginId()) && lm.getPwd().equals(dbLm.getPwd)){ return true; } return false; } }
/*实现普通用户的登陆*/ public class NormalLogin extends LoginTemplate{ public LoginModel findLoginUser(String loginId){ LoginModel lm = new LoginModel(); lm.setLoginId(loginId); lm.setPwd("normalpwd"); } } /*实现工作人员的登陆,密码需要加密验证*/ public class WorkerLogin extends LoginTemplate{ public LoginModel findLoginUser(String loginId){ LoginModel lm = new LoginModel(); lm.setLoginId(loginId); lm.setPwd("workerpwd"); } //覆盖父类的密码加密方法,提供真正的实现 public String encryptPwd(){ System.out.println("使用MD5进行密码加密"); return pwd; } }
/*客户端登陆*/ public class Client{ public static void main(String args[]){ LoginModel lm = new LoginModel(); lm.setLoginId("admin"); lm.setPwd("workerpwd"); //准备用来判断的对象 LoginTemplate lt = new WorkerLogin(); LoginTemplate lt2 = new NormalLogin(); //进行登陆测试 boolean flag = lt.login(lm); System.out.println("可以登陆工作平台:" + flag); boolean flag2 = lt2.login(lm); System.out.println("可以普通人员登陆:" + flag2); } }
3.实际应用
模板方法模式的功能在于固定算法骨架,而让具体算法可以扩展。模板可以采用抽象类也可以采用接口,通常既要约束子类的行为,又要为子类提供公共的功能的时候使用抽象类作为模板。
模板方法模式的本质:固定算法骨架