设计模式-模板方法模式

Posted shixiemayi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-模板方法模式相关的知识,希望对你有一定的参考价值。

1、模板方法模式

  定义一个操作中的算法的框架,而将一些步骤延迟到子类中。

  常见的生活中模板举例:银行规定了办理业务的模板/步骤,1)进门取号;2)填写单据;3)等待叫号;4)窗口办理。第二步由具体的客户填写不同的单子,第四步银行业务员根据不同单子,做不同的业务操作

2、模板方法模式的实现要素
  定义一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法交由子类实现剩余逻辑,用钩子方法给你子类更大的灵活性,最后将方法汇总构成一个不可变的模板方法。模板方法模式适用于算法或操作遵循相似的逻辑的场景

3、模板方法模式的应用--制作饮料

定义抽象基类:由算法框架、基本方法、抽象方法、钩子函数组成

package com.cn.shejimoshi.mobanfangfamoshi;

/**
 * 抽象基类,为所有子类提供一个算法框架
 *
 */
public abstract class RefreshBeverage {

    /**
     * 制备饮料的模板方法
     * 封装了所有子类共同遵循的算法框架
     */
    public final void prepareBeverageTemplate(){

        //步骤1 将水煮沸
        boilWater();
        //步骤2 泡制饮料
        brew();
        //步骤3 将饮料倒入杯中
        pourIncup();

        if (isCustomerWantCondiments()){
            //步骤4 加入调味料
            addCondiments();
        }
    }

    /**
     * 钩子函数,提供一个默认或空的实现
     * 具体的子类可以自行决定是否挂钩(此处特定场景表示钩子函数的返回的true或false)以及如何挂钩(钩子函数的实现逻辑)
     * 询问用户是否加入调料
     * @return
     */
    protected boolean isCustomerWantCondiments() {
        return true;//默认加入调味料
    }

    /**
     * 基本方法(私有,算法框架中不会变化的步骤)--将水煮沸
     */
    private void boilWater() {
        System.out.println("将水煮沸");
    }

    protected abstract void brew();
    /**
     * 基本方法(私有,算法框架中不会变化的步骤)--将饮料倒入杯中
     */
    private void pourIncup(){
        System.out.println("将饮料倒入杯中");
    }

    protected abstract void addCondiments();
}

实现类1-Coffee

package com.cn.shejimoshi.mobanfangfamoshi;

/**
 * 具体子类,提供了咖啡制作的具体实现
 */
public class Coffee extends RefreshBeverage {

    @Override
    protected void brew() {
        System.out.println("用沸水冲泡咖啡");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入糖和牛奶");
    }
}

实现类2-Tea

package com.cn.shejimoshi.mobanfangfamoshi;

public class Tea extends RefreshBeverage {
    @Override
    protected void brew() {
        System.out.println("用80度的热水浸泡茶叶5分钟");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入柠檬");
    }

    @Override
    protected boolean isCustomerWantCondiments() {
        return false;//不加调料
    }
}

测试方法

package com.cn.shejimoshi.mobanfangfamoshi;

import org.junit.Test;

public class RefreshBeverageTest {

    @Test
    public void coffeeTest(){
        RefreshBeverage refreshBeverage=new Coffee();
        refreshBeverage.prepareBeverageTemplate();
    }

    @Test
    public void teaTest(){
        RefreshBeverage refreshBeverage=new Tea();
        refreshBeverage.prepareBeverageTemplate();
    }
}

 


以上是关于设计模式-模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之模板方法模式代码示例

设计模式---- 模板方法模式

行为型设计模式之模板方法模式

Spring针对事务处理提供哪两种事务编程模式。

设计模式之模板方法模式(Template Method)详解及代码示例

设计模式之模板方法模式实战解析