12.行为型-模板方法模式

1.基本介绍
a.模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),z 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
b.简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
c.这种类型的设计模式属于行为型模式。

场景: 制作不同配料的豆浆

package com.zjc.designmode.template;


/**
* @author : zoujc
* @date : 2020/11/11
* @description : 模板方法模式的抽象类
*/
public abstract class SoYaMilk {


    //定义模板方法,可以做成final,不让子类覆盖
    final void make(){
        select();
        if(customerWantCondiments()) {
            addCondiments();
        }
        soak();
        beat();
    }


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


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


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


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


    //钩子方法,决定是否需要添加配料
    boolean customerWantCondiments() {
        return true;
    }


}
package com.zjc.designmode.template;


/**
* @author : zoujc
* @date : 2020/11/11
* @description : 红豆配料
*/
public class RedBeanSoYaMilk extends SoYaMilk {
    @Override
    void addCondiments() {
        System.out.println("加入红豆");
    }
}
package com.zjc.designmode.template;


/**
* @author : zoujc
* @date : 2020/11/11
* @description : 花生配料
*/
public class PeanutSoYaMilk extends SoYaMilk {
    @Override
    void addCondiments() {
        System.out.println("加入小花生");
    }
}
package com.zjc.designmode.template;


/**
* @author : zoujc
* @date : 2020/11/11
* @description : 制作纯豆浆,什么都不加
*/
public class PureSoYaMilk extends SoYaMilk {
    @Override
    void addCondiments() {


    }


    @Override
    boolean customerWantCondiments() {
        return false;
    }
}
package com.zjc.designmode.template;


/**
* @author : zoujc
* @date : 2020/11/11
* @description :
*/
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();
    }
}

钩子方法:
在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。

2.Spring IOC 容器初始化时运用到的模板方法模式

3.模板方法模式注意事项
a.基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
b.实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
c.既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
d.该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
e.一般模板方法都加上 final 关键字, 防止子类重写模板方法.
f.模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值