设计模式-模板方法模式

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();
    }
}

 

写在最后:

 设计模式是一种经验总结、编程思想,拒绝代码的迷惑。

 一种设计模式的代码变体可以有很多,但万变不离其

posted @ 2018-09-09 12:08  嗜血蚂蚁  阅读(246)  评论(0编辑  收藏  举报