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