/** * 模板方法模式 * * 实现算法时,整体过程很固定,只有部分易改变 * 则可以将固定的部分提取到父类中实现,由子类实现易变的部分 * * 基本方法: * 1、抽象方法:父类声明,由子类具体实现 * 2、具体方法:父类实现,子类可以根据情况进行覆盖或直接继承 * 3、钩子方法:子类重写的父类方法 * * 优点: * 1、简化了子类的代码,方便维护 * 2、如有特殊情况也可重写父类多个方法,具有一定扩展性 * * 场景: * JDBCTemplate、HibernateTemplate * Junit单元测试、servlet中doGet/doPost */ public class TemplateMethodDemo01 { public static void main(String[] args) { ATMTemplateMethod atm1 = new ATMTemplateMethod(){ @Override public void transact() { System.out.println("取钱"); } }; ATMTemplateMethod atm2 = new ATMTemplateMethod(){ @Override public void transact() { System.out.println("转账"); } }; ATMTemplateMethod atm3 = new ATMTemplateMethod(){ @Override public void transact() { System.out.println("查询余额"); } }; ATMTemplateMethod atm4 = new ATMTemplateMethod(){ @Override public void insertBankCard() {} @Override public void enterPassword() {} @Override public void transact() { System.out.println("无卡存款"); } @Override public void removeTheBankCard() {} }; System.out.println("[路人甲]:"); atm1.process(); System.out.println("[路人乙]:"); atm2.process(); System.out.println("[路人丙]:"); atm3.process(); System.out.println("[路人丁]:"); atm4.process(); } } /** * ATM机模板方法 */ abstract class ATMTemplateMethod{ public void insertBankCard(){ System.out.println("******插入银行卡******"); } public void enterPassword(){ System.out.println("******输 入 密 码******"); } public abstract void transact(); public void removeTheBankCard(){ System.out.println("******取出银行卡******"); } public final void process(){ this.insertBankCard(); this.enterPassword(); this.transact(); this.removeTheBankCard(); } }
/** * */ public class TemplateMethodDemo02 { public static void main(String[] args) { Life l = new Life(){ @Override protected boolean isStrive() { return false; } }; l.lifeTime(); } } abstract class Life{ private static Random r = new Random(); private final int wealth = r.nextInt(3); private int schoolLevel; private int achievement; private int work; public void lifeTime(){ goToSchool(); graduation(); work(); printInfo(); } private void goToSchool(){ switch(wealth){ case 2:{ schoolLevel = 2; break; } case 1:{ if(r.nextInt(100)<1){ schoolLevel = 2; }else{ schoolLevel = 1; } break; } default:{ if(r.nextInt(10)<1){ schoolLevel = 1; }else{ schoolLevel = 0; } break; } } } private void graduation(){ if(isStrive()&&r.nextInt(1000)<1){ achievement = (schoolLevel==2)?2:(schoolLevel+1); }else if(isStrive()){ achievement = schoolLevel; }else{ achievement = (schoolLevel==0)?0:(schoolLevel-1); } } protected boolean isStrive() { return false; } private void work(){ if(wealth==2){ work = 2; }else if(isStrive()&&achievement==1){ work = (r.nextInt(10000)<1)?2:1; }else{ work = 0; } } private void printInfo(){ String bron[] = {"出生在贫困家庭","出生在普通家庭","出生在富裕家庭"}; String school[] = {"在乡村学校上学","在普通学校上学","在重点学校上学"}; String source[] = {"辍学","普通成绩","优秀成绩"}; String work[] = {"农民工","普通职员","少东家"}; System.out.println(bron[wealth]); System.out.println(school[schoolLevel]); System.out.println(source[achievement]); System.out.println(work[this.work]); System.out.println("[我编不下去了....]"); } }