模板方法模式-

一.模板方法模式:

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
在一个方法中定义一个算法的骨架(算法框架),而将一些步骤延迟到子类中。模板方法使得子类可以在不改变一个算法的结构的情况下,即可重新定义该算法中的某些步骤

二.场景:

在这里插入图片描述

三.模式结构:
1.抽象模板:是一个抽象类,它包含了一个算法骨架称为模板方法;该算法中每一步骤可以由抽象方(原语操作)与非抽象方法实现。抽象方法由其子类具体模板完成;

模板方法是一个具体方法,它给出了一个顶层逻辑框架,而逻辑的组成步骤在抽象类中可以是具体方法,也可以是抽象方法。由于模板方法是具体方法,因此模板方法模式中的抽象层只能是抽象类,而不是接口。

基本方法是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。
(1) 抽象方法:一个抽象方法由抽象类声明、由其具体子类实现。
(2) 具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
(3) Hook方法:一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。Hook方法可以提供一个非空的默认实现。

2.具体模板:它是抽象模板的子类,实现模板中的原语操作
四.类图:

在这里插入图片描述

五.代码示例:

1.抽象模板类(AbstractTemplate):

/**   
 * @ClassName:  CaffeineBeverageWithHook   
 * @Description:抽象模板类 
 * @author: lsh
 * @date:   2019年6月5日    
 */
public abstract class CaffeineBeverageWithHook {
    
    /*
     * 模板方法
     */
    public final void preparerecipe() {
        boilWater();
        brew();
        PourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }
    
    public abstract void brew();
    public abstract void addCondiments();
    
    void boilWater() {
        System.out.println("Boiling water");
    }
    void PourInCup() {
        System.out.println("Pouint into cup");
    }
    
    /*
    钩子是一种被声明在抽象类或具体类中的具体方法,但只有空的或默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定要不要覆盖Hook方法。
    */
    public boolean customerWantsCondiments() {
        return true;
    }

}

2.具体模板类(ConcreteTemplate1):

/**
 * @ClassName: Coffee
 * @Description:具体模板类
 * @author: lsh
 * @date: 2019年6月5日
 */
public class Tea extends CaffeineBeverageWithHook {

    public void brew() {
        System.out.println("add Tea");
    }

    public void addCondiments() {
        System.out.println("Adding lemon");
    }
    
    // 重写父类中的HOOK方法
    public boolean customerWantsCondiments() {
        String answer = getUserInput();
        if (answer.toLowerCase().startsWith("y")) {
            return true;
        } else {
            return false;
        }
    }

    private String getUserInput() {
        String answer = null;
        System.out.println("Would you like lemon (y/n)");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        try {
            answer = in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (answer == null) {
            return "no";
        }
        return answer;
    }

3.测试:

public class TestApp {
    public static void main(String[] args) {
        
        CaffeineBeverageWithHook c = new Tea();
        c.preparerecipe();
    }
}

4.结果:
在这里插入图片描述

六.总结:

1.模板方法定义了算法的步骤(框架),把这些步骤的实现延迟到子类中去实施
2.模板方法模式为我们提供一种代码复用的重要技巧
3.模板方法的抽象类可以定义具体方法、抽象方法和Hook
Hook是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值