模板方法模式是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:

关闭家门
上锁
离开家
坐火车
到达目的地:北京


关闭家门
离开家
坐飞机
到达目的地:上海

posted on 2016-05-05 11:59  WesTward  阅读(357)  评论(0编辑  收藏  举报