您的位置:首页 > 其它

设计模式学习笔记十三:模板方法模式

2015-07-27 09:01 856 查看

设计模式学习笔记十三:模板方法模式

介绍

模板方法(TEMPLATE METHOD)模式,属于类行为型模式,

意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TEMPLATE METHOD使得子类

可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(本段摘自《GoF设计模式》 5.10)。

模板方法有几个要素:

算法骨架:模板执行方法,防止子类更改流程,定义为不可override,即final;

抽象方法:在子类实现的方法;

钩子方法:在模板类中提供默认方法,子类不是必须要实现;

适用场景

算法骨架稳定,部分细节需要自定义。

UML结构图:



场景模拟

侍寝:帝时弄骰而定亦或钦点,内侍背佳丽入房,事毕,问留否。留则罢,不留则去龙元。

代码实现:

1.模板类

/**
* 模板类
*/
public abstract class AbstractSleeping {
final void execute() {
String concubine = choiceConcubine();
getConcubine(concubine);
try {
doSleep();
} catch (InterruptedException e) {
System.out.println("帝偶感风寒……");
}
if (wantChildernHook()) {
doWant();
}
}

protected void doWant() {
System.out.println("帝曰: 留");
}

protected boolean wantChildernHook() {
return true;
}

protected void doSleep() throws InterruptedException {
// 内涵
Thread.sleep(10L);
System.out.println("事毕……");
}

protected void getConcubine(String concubine) {
System.out.println("内侍背妃子" + concubine + "入房……");
}

/**
* 选妃子
* @return
*/
protected abstract String choiceConcubine();
}


2.模板实现类

/**
* 翻牌选妃
*/
public class RandomSleeping extends AbstractSleeping {
/**
* 翻牌选妃子
* @return
*/
@Override
protected String choiceConcubine() {
String[] concubines = new String[] {"娴·乌拉那拉宜修", "沈眉庄", "安陵容", "富察贵人", "方淳意", "余莺儿", "瓜尔佳文鸯", "滟·叶澜依"};
return concubines[new Random().nextInt(concubines.length)];
}

/**
* 帝心难测
* @return
*/
protected boolean wantChildernHook() {
return new Random().nextBoolean();
}
}

/**
* 万千宠爱于一身
*/
public class SpecialSleeping extends  AbstractSleeping {
/**
* 选妃子
*
* @return
*/
@Override
protected String choiceConcubine() {
return "甄嬛";
}
}


3.Run

public class Run {
public static void main(String[] args) {
new RandomSleeping().execute();
System.out.println();
new SpecialSleeping().execute();
}
}


输出

内侍背妃子滟·叶澜依入房……
事毕……
帝曰: 留

内侍背妃子甄嬛入房……
事毕……
帝曰: 留


策略模式与模板方法模式的区别

策略模式的算法是可以动态指定的,模板方法模式的算法是在模板类完成的,只是其中的变化方法由子类去生成。

策略模式是对象行为型模式,模板方法模式是类行为型模式。

策略模式是接口实现,即组合。模板方式模式是继承实现。OO原则:多用组合,少用继承。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: