天天看点

设计模式(一)- 模板方法模式

模板方法模式

文章目录

      • 模板方法模式
        • 1.模板方法模式
          • 1.介绍
          • 2.应用实例:
        • 代码
          • 1.父类抽象模板,统一方法定为final
          • 2.子类去实现不同的方法
          • 3.其他子类实现不同的方法
          • 4.结果展示

1.模板方法模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

1.介绍

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

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

关键代码:在抽象类实现,其他步骤在子类实现。

2.应用实例:

在做饭的时候,流程大致一致,都要1,2,3,4步骤,但是不同的饭,做法又有差异,但是清洗、加水 这一步 都是一样的

1.选食材,不同的饭选食材不一样

2.清洗食材

3.蒸煮食材

4.盛出打包装盘 等差异。

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

代码

1.父类抽象模板,统一方法定为final
package com.jzj.design.demo.templateDesign;

/**
 * 做饭抽象类
 * 做饭流程
 * 1.选食材
 * 2.清洗食材
 * 3.放入锅中,蒸煮、大火、小火、多久时间
 * 4.盛出,打包
 */
public abstract class AbstractCookTemplate {

    /**
     * 定义做饭模板的主要流程
     */
    public final void cook() {

        /**
         * 1.选取食材
         */
        String material = selectMaterial();
        System.out.println("1.选取食材如下:" + material);

        /**
         * 2.抽象方法,清洗食材
         */
        System.out.println("2.开始清洗食材");
        washMaterial();



        /**
         * 3.抽象方法,蒸煮食材
         */
        System.out.println("3.开始蒸煮食材");
        cookMaterial();


        /**
         * 4.抽象方法,打包
         */
        System.out.println("4.打包装盘");
        pack();
    }


    /**
     * 1.抽象方法,选食材
     */
    public abstract String selectMaterial();


    /**
     * 2.抽象方法,清洗食材
     */
    void washMaterial() {
        //加入农夫山泉水
        System.out.println("往锅中加入农夫山泉水");
        System.out.println("流程统一的清洗");
    }

    ;

    /**
     * 3.抽象方法,蒸煮食材
     */
    abstract void cookMaterial();


    /**
     * 4.抽象方法,打包
     */
    abstract void pack();

}

           
2.子类去实现不同的方法

大米饭要放入食材大米、蒸煮30分钟、保温杯盛放,大米子类去实现 1,3,4步骤

package com.jzj.design.demo.templateDesign;

/**
 * 蒸米饭
 */
public class RiceCook extends AbstractCookTemplate {
    @Override
    public String selectMaterial() {
        return "东北大米";
    }

    @Override
    public void cookMaterial() {
        System.out.println("东北大米要小火 蒸30分钟,才能做出香喷喷的大米饭");
    }

    @Override
    public void pack() {
        System.out.println("大米饭要用保温杯装,防止凉了");
    }
}

           
3.其他子类实现不同的方法

八宝粥要用8中材料、然后要用高压锅蒸煮、还需要用密封罐子来盛放,防止撒漏

package com.jzj.design.demo.templateDesign;

/**
 * 做八宝粥
 */
public class CongeeCook extends AbstractCookTemplate {
    @Override
    public String selectMaterial() {
        return "红豆、绿豆、扁豆、花生、桂圆、红枣、大米、红米";
    }

    @Override
    public void cookMaterial() {
        System.out.println("八宝粥需要高压锅 蒸煮20分钟,然后再小火慢炖10分钟,才能软糯可口");
    }

    @Override
    public void pack() {
        System.out.println("八宝粥打包需要密封的管子,防止八宝粥撒漏");
    }
}

           
4.结果展示
package com.jzj.design.demo.templateDesign;

public class AbsTplMain {

    public static void main(String[] args) {

        CongeeCook congeeCook = new CongeeCook();
        congeeCook.cook();

        System.out.println("=======================");
        RiceCook riceCook = new RiceCook();
        riceCook.cook();

    }

}

           
设计模式(一)- 模板方法模式