设计模式-模板方法模式学习小记

模板方法的基本实现:
1.思想
a)一份算法框架,大家共同遵守
b)算法框架中分离出变与不变的部分
c)将变化的算法,延迟实现(交由具体的子类实现)

2.基本实现

a)用一个抽象基类,一个public_final方法定义好算法框架

b)不变的部分,用private方法加以实现。(基本方法)

c)变化的部分,用protected_abstract加以定义(抽象方法)


例子:泡茶和泡咖啡,其步骤如下

冲泡饮品
咖啡
把水煮沸把水煮沸
用沸水浸泡茶叶用溺水冲泡咖啡
将饮品倒入杯中将饮品倒入杯中
加入柠檬片加入糖和牛奶

第一步和第三步是相同步骤,可以在抽象基类中实现,第二步和第四步交由实现这个基类的子类来实现(这两步要不要实现,可定义钩子函数来进行判断)

基类:

package com.test;

/**
 * Created by admin on 2018/1/11.
 * 抽象基类,为所有子类提供一个算法框架
 */
public abstract class RefreshBeverage {

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

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

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

    }

    /**
     * Hood,钩子函数,提供一个默认或空的实现
     * 询问用户是否加入调料
     * @return
     */
    protected boolean isCustomerWantsCondiments() {
        return true;
    }

    /**
     * 基本方法,将水煮沸
     */
    private void boilWater(){
        System.out.println("将水煮沸");
    }

    /**
     * 抽象的基本方法,泡制饮料
     */
    protected abstract void brew();

    /**
     * 基本方法,将饮料倒入杯中
     */
    private void pourInCup(){
        System.out.println("将饮料倒入杯中");
    }

    /**
     * 抽象基本方法,加入调味料
     */
    protected abstract void addCondiments();
}


茶类:

package com.test;

/**
 * Created by admin on 2018/1/11.
 */
public class Tea extends RefreshBeverage{
    @Override
    protected void brew() {
        System.out.println("用80度等的热水浸泡茶叶5分钟");
    }

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

咖啡类:

package com.test;

/**
 * Created by admin on 2018/1/11.
 */
public class Coffee extends RefreshBeverage {
    @Override
    protected void brew() {
        System.out.println("用沸水冲泡咖啡");
    }

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

    @Override
    /**
     * 子类选择覆盖的形式挂载钩子函数
     */
    protected boolean isCustomerWantsCondiments(){
        return false;
    }
}

测试类:

package com.test;

/**
 * Created by admin on 2018/1/11.
 */
public class Test {
    public static void  main(String[] args){
        System.out.println("制备咖啡。。。");
        RefreshBeverage b1=new Coffee();
        b1.prepareBeverageTemplage();
        System.out.println("咖啡好了。。。");

        System.out.println("****************************");
        System.out.println("制备茶。。。");
        RefreshBeverage b2=new Tea();
        b2.prepareBeverageTemplage();
        System.out.println("茶好了");
    }
}


执行结果:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值