模板方法模式

模板方法模式的定义

模板方法模式(Template Method Pattern) 实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。

模板方法模式 非常简单,其实就是类的继承机制,但它却是一个应用非常广泛的模式。

模板方法模式本质:抽象封装流程,具体进行实现

模板模式的结构

在这里插入图片描述

AbstractClass:实现一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。AbstractClass其实就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法。它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

ConcreteClasses:实现PrimitiveOperation以完成算法与特定子类相关的步骤。ConcreteClass实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

还有一个钩子方法,相当于传入boolean类型的判断,来决定哪些步骤不执行。

举例

cook方法就是流程,这个是固定的,但是wash、pourOil、fry都是需要子类自己实现的。

class Client {
    public static void main(String[] args) {
        System.out.println("准备炒豆芽");
        CookVegetable cookVegetable = new CookBeanSprout();
        cookVegetable.cook();

        System.out.println();
        System.out.println("准备炒茄子");
        cookVegetable = new CookEggplant();
        cookVegetable.cook();
    }

    // 抽象模板类:定义炒菜流程
    static abstract class CookVegetable {
        protected void wash() {
            System.out.println("洗菜");
        }

        protected void pourOil() {
            System.out.println("热油下锅");
        }

        protected void fry() {
            System.out.println("下菜翻炒");
        }

        // 具体调料由菜决定
        protected abstract void pourSauce();

        // 具体炒菜流程
        public final void cook() {
            this.wash();
            this.pourOil();
            this.fry();
            this.pourSauce();
            System.out.println("起锅吃菜");
        }
    }

    // 豆芽
    static class CookBeanSprout extends CookVegetable {

        @Override
        protected void pourOil() {
            System.out.println("热锅少油");
        }

        @Override
        protected void fry() {
            System.out.println("快速翻炒");
        }

        @Override
        protected void pourSauce() {
            System.out.println("加盐和少量生抽");
        }
    }

    // 茄子
    static class CookEggplant extends CookVegetable {

        @Override
        protected void wash() {
            System.out.println("去除头尾,然后用水洗下");
        }

        @Override
        protected void pourOil() {
            System.out.println("热锅多油");
        }

        @Override
        protected void pourSauce() {
            System.out.println("加盐和鸡精");
        }
    }
}

链接:https://www.jianshu.com/p/82abdbabe2a5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值