模板方法模式(Template Method) (一)

2014-11-24 09:56:20 · 作者: · 浏览: 0

@@@模式定义:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

@@@练习示例:
登录控制

@@@示例代码:
\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; 
    } 
} 

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; 
    } 
} 

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