Gof-模板方法模式

继续打卡设计模式

今天来聊一下的是模板方法模式

一、实际问题
来看一个实际问题
编写制作豆浆的程序,说明如下:

  1. 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎
  2. 通过添加不同的配料,可以制作出不同口味的豆浆
  3. 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的

也是很容易理解到。这个过程中,我们选取豆浆的流程的前面几步都是一样的。
大家这里回过头思考我们上一篇提到的享元模式。说需要给不同的客户定制一批网站,这里体现的不是说过程是一样。而是在对于这个结果而言涵盖的一部分内容是一样的。导致说我们可以基于一个共同的出发点来处理。这个模板方法模式虽说我们也可以按照选材之后的豆浆进行处理。但是由于添加配料这个动作相对于整个过程而言只有这一个步骤有些许的差异。体现出了在整体里面细微细节的差异。

模板方法模式学习起来非常简单。接下来我们就看一下如果使用模板方法模式来解决这个问题

二、使用模板方法模式来解决实际问题

首先解决这个问题的出发点我们需要有一个基类

/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/01/26
 */

public abstract class SoyaMilk {
    final void make(){
        select();
        //选择是否需要添加配料
        if(customerWantConditions()){
            addCondiments();
        }
        soak();
        beat();
    }

     boolean customerWantConditions() {
        return true;
    }

    //选材料
    void select() {
        System.out.println("第一步:选择好的新鲜黄豆  ");
    }

    //添加不同的配料, 抽象方法, 子类具体实现
    abstract void addCondiments();

    //浸泡
    void soak() {
        System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");
    }

    void beat() {
        System.out.println("第四步:黄豆和配料放到豆浆机去打碎  ");
    }

}

现在我们根据添加的配料不同就带来不同口味的豆浆

/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/01/26
 */
//不添加任何调料
public class PeanutSoyaMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的花生 ");
    }

    @Override
    boolean customerWantConditions() {
        return false;
    }
}
/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/01/26
 */

public class RedBeanSoyaMilk extends SoyaMilk{

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的红豆 ");
    }
}

以及不添加任何配料的豆浆

/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/01/26
 */

public class PureSoyaMilk extends SoyaMilk{
    @Override
    void addCondiments() {
    }

    @Override
    boolean customerWantConditions() {
        return false;
    }
}

最后写一个客户端来测试

/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/01/26
 */

public class Client {
    public static void main(String[] args) {

        System.out.println("----制作红豆豆浆----");
        SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
        redBeanSoyaMilk.make();

        System.out.println("----制作花生豆浆----");
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.make();

        System.out.println("----制作纯豆浆----");
        SoyaMilk pureSoyaMilk = new PureSoyaMilk();
        pureSoyaMilk.make();
    }
}

三、模板方法模式的总结

模板方法模式使用的最大特点就是。对一个整体模式来说。某个步骤的改变对于整体结果而言会有差别。但是这些步骤的大部分是一模一样的

  1. 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),指在一个抽象类公开定义了执行 它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  2. 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一 个算法的结构,就可以重定义该算法的某些特定步骤
  3. 这种类型的设计模式属于行为型模式。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值