模板方法模式
举例子:奥运会开模式模式,去医院看病,银行去办理业务,去餐厅吃饭,泡茶,考试等等,都遵循一定的算法步骤,只是在某些具体的实现上有一些差异,比如去银行办理业务要先领号排队,然后等待去柜台办理业务,每个人办理的业务不同,办理好了之后都会离开等等,又比如大家去体检等等。这样在多个不同实例对象实现上就会有大量的重复和一些不同的细节实现,因此根据面向对象的特性,可以将重复的代码写在父类中,并定义好算法的执行顺序,把个性化的步骤留到子类去实现。
基类:
package com.cal.design.template;/** *
Title: AbstractTea
*
Description: 抽象基类,模板
* @author andyc * @date 2018年5月29日 */public abstract class AbstractGame {// 钩子方法protected boolean isEnjoy() {;return false;}/** *
Title: templateMethod
*
Description: 模板方法-玩游戏的步骤
*/public void templateMethod() {beforePlay();play();afterPlay();if (isEnjoy()) {enjoy();}}/** *
Title: beforePlay
*
Description: 玩之前
*/private void beforePlay() {System.out.println("在游戏玩之前我们都要做游戏规则的讲解和热身!");}/** *
Title: play
*
Description: 具体怎么玩每个游戏不一样
*/public abstract void play();/** *
Title: afterPlay
*
Description: 玩之后
*/private void afterPlay() {System.out.println("在游戏结束之后领导都要总结和颁奖!");}private void enjoy() {System.out.println("因为游戏好玩,所以很爽,大家很难忘!!!");}}
两个实现子类:
package com.cal.design.template;
public class Basketball extends AbstractGame {
@Override
public void play() {
System.out.println("这个是篮球的玩法,全场5 VS 5");
}
}
package com.cal.design.template;
public class Football extends AbstractGame {
@Override
public void play() {
System.out.println("这是足球的玩法,全场11 VS 11");
}
@Override
protected boolean isEnjoy() {
return true;
}
}
客户端测试类:
package com.cal.design.template;/** *
Title: ClientTest
*
Description: 客户端测试
* @author andyc * @date 2018年5月29日 */public class ClientTest {public static void main(String[] args) {AbstractGame game1 = new Basketball();game1.templateMethod();System.out.println("----------------");AbstractGame game2 = new Football();game2.templateMethod();}}
验证结果: