模板方法模式是java设计模式常见的模式之一。
《JAVA与模式》中写道:
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
下面是自己写的小demo,便于理解模板方法模式。
1.父类
package com.westward; public abstract class GoToCity { /** * 模板方法,必须定义为public final的。子类能够使用,但不能复写 * 子类都有相同的步骤,但是有些步骤有不同的实现。 * */ public final void go(){ closeDoor(); if (isLock()) { getLock(); } leaveHome(); onTheWay(); arrive(); } /** * 不同子类不同的行为,将行为延迟到子类实现 * */ protected abstract void arrive(); /** * 不同子类不同的行为,将行为延迟到子类实现 * */ protected abstract void onTheWay(); /** * 共有的行为,在基类实现,并对子类隐藏 * */ private void leaveHome() { System.out.println("离开家"); } /** * 共有的行为,在基类实现,并对子类隐藏 * */ private void closeDoor() { System.out.println("关闭家门"); } /** * 共有的行为,在基类实现,并对子类隐藏 * 有些子类执行,有些不执行。所以用到了钩子方法 * */ private void getLock(){ System.out.println("上锁"); } /** * 钩子方法,用来决定一些方法是否执行 * 子类可以复写此方法,来决定是否执行某方法 * */ protected boolean isLock(){ return true; } }
2 子类
package com.westward; public class GoToBeijing extends GoToCity { @Override protected void arrive() { System.out.println("到达目的地:北京"); } @Override protected void onTheWay() { System.out.println("坐火车"); } }
package com.westward; public class GoToShanghai extends GoToCity { @Override protected void arrive() { System.out.println("到达目的地:上海"); } @Override protected void onTheWay() { System.out.println("坐飞机"); } @Override protected boolean isLock() { return false; } }
测试类:我是采用的Junit4单元测试
package com.westward; import static org.junit.Assert.*; import org.junit.Test; public class TemplateMethodTest { @Test public void test() { GoToCity go1= new GoToBeijing(); GoToCity go2= new GoToShanghai(); go1.go(); System.out.println("\n"); go2.go(); } }
output:
关闭家门
上锁
离开家
坐火车
到达目的地:北京
关闭家门
离开家
坐飞机
到达目的地:上海
你的能量超乎你想象_________