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

2014-11-24 09:56:20 · 作者: · 浏览: 4
\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; 
    } 
} 

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

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

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) 里氏替换原则;