zoukankan      html  css  js  c++  java
  • 模板方法(转)

    参考文章:

    设计模式学习笔记之九:模板方法模式

    https://www.cnblogs.com/fengshenjingjun/p/8067855.html

    https://yq.aliyun.com/articles/675872

    1.定义

    定一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    1.1 模板模式中有两个角色,抽象模板角色定义了一个或多个抽象操作以便让子类实现,定义并实现了一个模板方法,这个方法包含了一些不可改变的方法执行顺序。

    1.2 具体模板角色实现父类定义的一个或多个抽象方法,每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现。

    模板模式中,在抽象模板中定义了方法的执行顺序,而方法的实现可以选择让子类去定制化;另外,统一的不变的方法可以放在抽象模板类中,这样子类可以共用。

    1.3 模板模式中还经常会出现钩子方法,一般是由抽象类给出方法的空实现,然后子类进行覆写。这种空的钩子方法叫做“Do Nothing Hook”。

    钩子方法放到模板方法中,就可以实现生命周期中方法的自定义,例如beforeCreate、beforeUpdate、afterUpdate、afterCreated等。

    
    

    2.模板模式实例


    父类CaffeineBeverage:
    package com.xly.template;
    
    public abstract class CaffeineBeverage {
        //算法的框架:不期望子类改变算法的结构,声明为final
        public final void prepareRecipe() {
            //算法的具体步骤
            this.boilWater(); //烧水:不变
            this.brew();//冲泡:可变
            this.pourInCup();// 把饮料倒入杯子:不变
            if(this.hook()){
                this.addCondiments();// 加调料 :子类可控制
            }
        }
    
        protected  void boilWater() {
            System.out.println("烧水");
    
        }
    
        protected  void pourInCup() {
            System.out.println("把饮料倒入杯子");
    
        }
    
        protected boolean hook() {//使用钩子可让子类有自主权
            return true;
        }
    
        protected abstract void brew();
    
        protected abstract void addCondiments();
    }
    子类Coffee
    package com.xly.template;
    
    public class Coffee extends CaffeineBeverage {
        @Override
        protected  void brew() {
            System.out.println("用沸水冲泡咖啡粉");
        }
    
        @Override
        protected void addCondiments() {
            System.out.println("加糖和牛奶");
        }
    
        @Override
        protected boolean hook() {
           return false;
        }
    }

    子类Tea:

    package com.xly.template;
    
    public class Tea extends CaffeineBeverage {
        @Override
        protected void brew() {
            System.out.println("用沸水侵泡茶叶");
        }
    
        @Override
        protected void addCondiments() {
            System.out.println("加柠檬");
        }
    
        @Override
        protected boolean hook() {
            return false;
        }
    }

    测试类:TemplateMethodTest 

    public class TemplateMethodTest {
        public static void main(String[] args) {
            CaffeineBeverage caffeineBeverage = new Tea();
            caffeineBeverage.prepareRecipe();
            System.out.println("-------------------");
    
            caffeineBeverage = new Coffee();
            caffeineBeverage.prepareRecipe();
        }
    }

    3. 模板模式应用

    JDBC模板

    未完待续



  • 相关阅读:
    一个.java文件内只能写一个class吗
    Ubuntu下手动安装NextCloud
    基于 Ubuntu + nextCloud 搭建自己的私人网盘
    Ubuntu系统Apache 2部署SSL证书
    交叉验证与训练集、验证集、测试集
    [LeetCode] Restore IP Addresses
    [LeetCode] Decode Ways
    [LeetCode] Subsets II
    [LeetCode] Gray Code
    vector 的resize 和 reserve
  • 原文地址:https://www.cnblogs.com/xingxing0521/p/10449865.html
Copyright © 2011-2022 走看看