模板方法模式

导读:本篇文章讲解 模板方法模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一. 定义

         模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

二. 模式起源

三. 原则

3.1 好莱坞原则

        别调用我们,我们会调用你。

四. UML图

         模板方法模式

五. 代码

5.1 饮料类(模板方法类)

package model.method;

/**
 * 饮料类
 */
public abstract class Drinking {

    /**
     * 步骤1:烧水
     */
    public void boilWater() {
        System.out.println("the water has been boiled...");
    }

    /**
     * 步骤2:浸泡 (茶叶或咖啡豆) 具体由子类实现
     */
    public abstract void brew();

    /**
     * 步骤3:将饮料倒入杯子
     */
    public void pourInCup() {
        System.out.println("the drink has been into the cup...");
    }

    /**
     * 步骤4:添加佐料  具体由子类实现
     */
    public abstract void addCondiments();

    /**
     * 是否需要佐料
     * 模板方法模式的钩子, 可以用来判断是否需要执行某个步骤
     *
     * @return
     */
    public boolean needCondiments() {
        return true;
    }

    /**
     * 模板方法  定义了方法的执行步骤
     * 为了防止子类进行修改,设置为final
     */
    public final void prepare() {

        boilWater();
        brew();
        pourInCup();

        // 钩子方法needCondiments()的使用 子类可以通过覆盖此方法来判断是否要执行addCondiments()方法
        if (needCondiments()) {
            addCondiments();
        }
    }

}

5.2 茶类

package model.method;

/**
 * 茶
 */
public class Tea extends Drinking {

    @Override
    public void brew() {
        System.out.println("brewing the tea...");
    }

    @Override
    public void addCondiments() {
        System.out.println("adding lemon...");
    }
}

5.3 咖啡类

package model.method;

/**
 * 咖啡类
 */
public class Coffee extends Drinking {

    @Override
    public void brew() {
        System.out.println("brewing the coffee...");
    }

    @Override
    public void addCondiments() {
        System.out.println("adding milk...");
    }

    @Override
    public boolean needCondiments() {
        // 钩子方法: 内部可以做处理,来判断是否需要执行步骤
        return false;
    }
}

5.4 测试

package model.method;

/**
 * 测试类
 */
public class Main {

    public static void main(String[] args) {

        System.out.println("使用旧方法泡茶...");
        Tea oldTea = new Tea();
        oldTea.boilWater();
        oldTea.brew();
        oldTea.pourInCup();
        oldTea.addCondiments();

        System.out.println("使用旧方法泡咖啡...");
        Coffee oldCoffee = new Coffee();
        oldCoffee.boilWater();
        oldCoffee.brew();
        oldCoffee.pourInCup();
        oldCoffee.addCondiments();

        System.out.println("使用模板方法:泡茶...");
        Tea tea = new Tea();
        tea.prepare();

        System.out.println("使用模板方法:泡咖啡...");
        Coffee coffee = new Coffee();
        coffee.prepare();
    }

}

5.5 结果

使用旧方法泡茶...
the water has been boiled...
brewing the tea...
the drink has been into the cup...
adding lemon...
使用旧方法泡咖啡...
the water has been boiled...
brewing the coffee...
the drink has been into the cup...
adding milk...
使用模板方法:泡茶...
the water has been boiled...
brewing the tea...
the drink has been into the cup...
adding lemon...
使用模板方法:泡咖啡...
the water has been boiled...
brewing the coffee...
the drink has been into the cup...

六. 感悟

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17804.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!