java设计模式之模板方法模式


宋丹丹姐的一个小品,说把大象放入冰箱分为几步骤,三步、第一步:把冰箱门打开,第二步:把大象装进去,第三步:把冰箱门关上。就是这样的一个小品,可以说是其实简化的一个模板方法。把鸡蛋装进冰箱分为几步,同样也是这个道理。


模板方法模式概念:

把一些共同的行为抽象出来,作为父类公共使用,一些具体的步骤延迟到子类来执行。这样就可以不改变算法的基础架构,就可以重新定义算法的某些特定的步骤,达到特定的行为模式


网上很多例子都是拿喝茶,泡茶,喝咖啡,泡咖啡等来说事情,我也不会例外。喝茶和喝咖啡都是有共同的流程的,比如:烧水,把水倒入杯中,都是共同的方法,共同的行为。所以可以抽象出来,步骤都是一样的。其实就是泡茶和泡咖啡的行为不同,所以抽象出来,具体的子类去重新定义这些算法步骤来实现。

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
package com.design.test1;
 
/**
 * Created by sdc on 2017/8/1.
 */
public abstract class AbstractCookingAction {
 
    /**
     * 喝.......
     */
    public final void cooking() {
 
        //步骤1:煮水
        boilWater();
 
        //步骤2:倒水
        pourWater();
 
        //步骤3:如果没人加东西,则就是喝白开水了。
        if(ifOrNotAddBatching()) {
            addBatching();
        }
 
        //步骤4:
        make();
 
    }
 
    //制作饮料
    protected abstract  void make();
 
    //加入配料
    protected abstract void addBatching();
 
    //煮水
    private void boilWater() {
        System.out.print("把水煮开.......");
    }
 
    //把水倒入杯中
    private void pourWater() {
        System.out.print("把水倒入杯中.......");
    }
 
    /**
     * 是否加入配料,比如咖啡,奶茶,有人加柠檬等
     * @return
     */
    protected boolean ifOrNotAddBatching() {
        // 默认设置
        return true;
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.design.test1;
 
/**
 * Created by sdc on 2017/8/1.
 */
public class TeaCooking extends AbstractCookingAction {
 
 
    @Override
    protected void make() {
        System.out.print("制作茶.....");
    }
 
    @Override
    protected void addBatching() {
        System.out.print("加入配料");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.design.test1;
 
/**
 * Created by sdc on 2017/8/1.
 */
public class CoffeeCooking extends AbstractCookingAction {
 
 
    @Override
    protected void make() {
        System.out.print("制作咖啡.....");
    }
 
    @Override
    protected void addBatching() {
        System.out.print("加入糖");
    }
 
 
}


这就是简单的一个设计模式出来了,重在积累学习,有时间就要学点知识,看会,和自己实际写又是两把事情。


模板方法还有一些设计场景,自己根据业务场景,尽量重构出来,自己试试看看自己写过的代码是否可以这样抽取出来。


本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1952805


上一篇:通过Enable-PSRemoting 开启Powershell远程管理失败的解决方法


下一篇:如何利用CAD打造三维支架建模