`
iamzhongyong
  • 浏览: 796492 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于模板方法模式(代码)

阅读更多

模板方法模式是一种比较简单的设计模式,这里写了一个例子出来。

1、基本的模板方法实现

2、模板方法中钩子方法的实现

3、模板方法中回调的处理(带有回调功能的模板方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package template;
 
public abstract class AbstractTepmplateMethod {
 
    //步骤1
    protected abstract void step1();
 
    //步骤2
    protected abstract void step2();
 
    //步骤3
    protected abstract void step3();
 
    //步骤4
    protected abstract void step4();
 
    /*
     * 模板方法,因为一般情况下不需要子类覆写,所以增加final变量
     * 模板方法屏蔽了一些固定步骤,这样的话子类不需要关注步骤的组合,仅仅实现具体的每一个步骤即可
     * 这个其实也是“好莱坞原则”的体现,子类可以不关心步骤的组合,仅仅调用即可
     */
    public final void run(){
        System.out.println("start...");
        step1();
        step2();
        hookMethod();
        step3();
        step4();
        System.out.println("end...");
    }
 
    /**
     * 钩子方法,父类提供了简单的实现,子类可以覆写
     */
    protected void hookMethod(){
        System.out.println("hook method");
    }
 
    /**
     * 模板方法,增加回调处理,spring中ORM层中很多都是callback的处理
     */
    public final void runCallback(TemplateClientCallback action){
        System.out.println("start...");
        step1();
        step2();
        hookMethod();
        step3();
        step4();
        System.out.println("end...");
        if(null != action){
            action.action();
        }
    }
 
}
/**
 * 增加回调的处理,模板方法支持回调处理
 */
abstract class TemplateClientCallback{
    //回调的逻辑处理方法
    public abstract void action();
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package template;
 
public class TemplateMethod extends AbstractTepmplateMethod {
 
    @Override
    protected void step1() {
        System.out.println("iamzhongyong 1");
    }
 
    @Override
    protected void step2() {
        System.out.println("iamzhongyong 2");
    }
 
    @Override
    protected void step3() {
        System.out.println("iamzhongyong 3");
    }
 
    @Override
    protected void step4() {
        System.out.println("iamzhongyong 4");
    }
 
 
    /**
     * 钩子方法,子类重新实现
     */
    @Override
    protected void hookMethod() {
        super.hookMethod();
        System.out.println("template method hook method...");
    }
 
    public static void main(String[] args) {
        TemplateMethod template = new TemplateMethod();
 
        //模板方法
        template.run();
 
        //带回调功能的模板方法
        template.runCallback(new TemplateClientCallback() {
            @Override
            public void action() {
                System.out.println("TemplateClientCallback...");
            }
        });
    }
}

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics