テンプレート方法モード(Template Method)

4033 ワード

動作中のアルゴリズムの骨格を定義し、いくつかのステップをサブクラスに遅延させる.テンプレート方法は、サブクラスがアルゴリズムの構造を変えずに、アルゴリズムの特定のステップを再定義することができるようにする.@@練習例:  登録制御@@例コード:\src\pattern\Login Model.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\Login Template.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\Cient.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)リ氏置換原則;