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

在父类中定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

和享元模式有点类似。我们来看一个PPT模板的例子:

package com.zndroid.dm.TemplateModel;

import java.awt.Color;

/**
 * Created by luzhenyu on 2017/9/12.
 */

/**创建抽象的模板,并定义整体架构逻辑*/
public abstract class PPTTemplate {
    protected Color color = Color.white;//默认背景色,子类也可以复写其中的方法覆盖该默认背景色

    public final void buildPPT() {//整体骨架最好不要不允许子类处理(看具体情况)

        System.out.println("PPTTemplate build PPT start...");

        buildBackground();
        System.out.println("PPTTemplate build PPT background is " + color.toString());
        buildHead();
        System.out.println("PPTTemplate build PPT start build head");
        buildTitle();
        System.out.println("PPTTemplate build PPT start build title");
        buildContext();
        System.out.println("PPTTemplate build PPT start build context");
        buildFoot();
        System.out.println("PPTTemplate build PPT start build foot");
    }

    public abstract void buildHead();
    public abstract void buildTitle();
    public abstract void buildContext();
    public abstract void buildFoot();
    public void buildBackground() {
        System.out.println("PPTTemplate build default background");
    }
}
子类具体实现:

package com.zndroid.dm.TemplateModel;

/**
 * Created by luzhenyu on 2017/9/12.
 */

public class PPT1 extends PPTTemplate {
    @Override
    public void buildHead() {
        System.out.println("PPT1 build head");
    }

    @Override
    public void buildTitle() {
        System.out.println("PPT1 build title");
    }

    @Override
    public void buildContext() {
        System.out.println("PPT1 build context");
    }

    @Override
    public void buildFoot() {
        System.out.println("PPT1 build foot");
    }
}
package com.zndroid.dm.TemplateModel;

import java.awt.Color;

/**
 * Created by luzhenyu on 2017/9/12.
 */

public class PPT2 extends PPTTemplate {
    @Override
    public void buildHead() {
        System.out.println("PPT2 build head");
    }

    @Override
    public void buildTitle() {
        System.out.println("PPT2 build title");
    }

    @Override
    public void buildContext() {
        System.out.println("PPT2 build context");
    }

    @Override
    public void buildFoot() {
        System.out.println("PPT2 build foot");
    }

    @Override
    public void buildBackground() {
        System.out.println("PPT2 build background");
        color = Color.red;
    }
}
下面是使用:

/**
         * 模板方法模式
         * 在父类中定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
         *
         * 实例:Java中的类加载器ClassLoader
         * 优点:
         *  1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
         * 缺点:
         * 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
         * 使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑使用模板方法。(PPT的模板知道吧,用户只需要往里面填写内容就行了)
         * 注意事项:对于模板方法模式,父类提供的构建步骤和顺序或者算法骨架,通常是不希望甚至是不允许子类去覆盖的,为防止恶意操作,一般模板方法都加上 final 关键词。
         * */
        PPT1 ppt1 = new PPT1();
        ppt1.buildPPT();//具体的框架由抽象的父类实现整体逻辑

        PPT2 ppt2 = new PPT2();
        ppt2.buildPPT();
        log("----------------我是分割线-----------------");



【欢迎上码】

【微信公众号搜索 h2o2s2】


猜你喜欢

转载自blog.csdn.net/luzhenyuxfcy/article/details/77945969