[初级]设计模式--模板方法模式

/**
 * 模板方法模式
 * 
 * 实现算法时,整体过程很固定,只有部分易改变
 * 则可以将固定的部分提取到父类中实现,由子类实现易变的部分
 * 
 * 基本方法:
 * 	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("[我编不下去了....]");
	}
}

猜你喜欢

转载自duolaaqian.iteye.com/blog/2254773