学习笔记【23种设计模式-第十三节:Template Method Pattern模板方法模式】

Template Method Pattern模板方法模式

简述:

  • 模板方法模式,又叫模板模式,在一个抽象类公开定义了执行他的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  • 简单说,模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定的步骤。
  • 属于行为型模式。

角色

  • AbstractClass抽象类,类中实现了模板方法,定义了算法的股价,具体子类需要去实现,其他抽象方法operation2、3、4。
  • ConcreteClass实现了抽象方法operation2、3、4,已完成算法中特点子类的步骤。

例子:

有一个抽象类SoyaMilk,有make,select,add,soak,beat方法,其中add是抽象方法,因为不同的豆浆配料不同;make是final修饰的,因为不想被子类覆盖。有RedBeanSoyaMilk与PennutSoyaMilk继承SoyaMilk。

SoyaMilk类:

public abstract class SoyaMilk {
    //模板方法可以写成final,不让子类进行覆盖。
    final void make(){
        select();
        addCondiments();
        soak();
        beat();
    }
    void select(){
        System.out.println("第一步,选择新鲜的黄豆!");

    }

    abstract void addCondiments();

    void soak(){
        System.out.println("第三步,黄豆和配料开始侵泡!");
    }

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

RedBeanSoyaMilk类:

public class RedBeanSoyaMilk extends SoyaMilk{
    @Override
    void addCondiments() {
        System.out.println("第二步,加入上好的红豆。");
    }
}

PeanutSoyaMilk类:

public class PeanutSoyaMilk extends SoyaMilk{
    @Override
    void addCondiments() {
        System.out.println("第二步,加入上好的花生!");
    }
}

Client主方法:

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

结果
在这里插入图片描述

模板方法模式的钩子方法

  • 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
  • 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造。

如再加一个纯豆浆,不加任何配料。
SoyaMilk改:

public abstract class SoyaMilk {
    //模板方法可以写成final,不让子类进行覆盖。
    final void make(){
        select();
        if (customerWantCondiments()) addCondiments();
        soak();
        beat();
    }
    void select(){
        System.out.println("第一步,选择新鲜的黄豆!");

    }

    abstract void addCondiments();

    void soak(){
        System.out.println("第三步,黄豆和配料开始侵泡!");
    }

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

    //钩子方法
    boolean customerWantCondiments(){
        return true;
    }
}

PureSoyaMilk:

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

    @Override
    boolean customerWantCondiments() {
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值