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

  行为型模式又可以分成以下四类:第一类:通过父类与子类的关系进行实现。第二类:两个类之间。第三类:类的状态。第四类:通过中间类

  模板方法模式属于第一类,父类与子类的关系

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

  模板类中可包含要实现的模板方法,还可以包含基本方法,基本方法分三类

  (1) 抽象方法:一个抽象方法由抽象类声明、由其具体子类实现。在C#语言里一个抽象方法以abstract关键字标识。

(2) 具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。

(3) 钩子方法:一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用virtual关键字将其定义为虚函数),并以该空实现作为方法的默认实现,当然钩子方法也可以提供一个非空的默认实现。在模板方法模式中,钩子方法有两类:第一类钩子方法可以与一些具体步骤“挂钩”,以实现在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回类型通常是bool类型的,这类方法名一般为IsXXX(),用于对某个条件进行判断,如果条件满足则执行某一步骤,否则将不执行;还有一类钩子方法就是实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法,与抽象方法相比,这类钩子方法的好处在于子类如果没有覆盖父类中定义的钩子方法,编译可以正常通过,但是如果没有覆盖父类中声明的抽象方法,编译将报错。

  下面再来看运算的例子

    package behavior.pattern.extend.templatemethod;

public abstract class AbstractCalculator {
    /* main method */
    public final void mainCaculate(String exp)
    {
        int result = calculate(exp);
        if(isPrint())
            print(exp, result);
        other(result);
    }

    /* control method */
    protected boolean isPrint()
    {
        return true;
    }

    /* abstract steps */
    protected abstract int calculate(String exp);
    protected abstract void print(String exp, int result);
    protected abstract void other(int result);

    /* assistant method */
    public int[] split(String exp,String opt){
        String array[] = exp.split(opt);
        int arrayInt[] = new int[2];
        arrayInt[0] = Integer.parseInt(array[0]);
        arrayInt[1] = Integer.parseInt(array[1]);
        return arrayInt;
    }
}
package behavior.pattern.extend.templatemethod;

public class Minus extends AbstractCalculator {

    private boolean isPrint;

    public Minus(boolean isPrint) {
        this.isPrint = isPrint;
    }

    @Override
    public int calculate(String exp) {
        int[] split = split(exp, "-");
        return split[0] - split[1];
    }

    @Override
    protected void print(String exp, int result) {
        System.out.println("the minus result: " + exp + " = " + result);
    }

    @Override
    protected boolean isPrint() {
        return isPrint;
    }

    @Override
    protected void other(int result) {
        System.out.println("other...");
    }
}
package behavior.pattern.extend.templatemethod;

public class Plus extends AbstractCalculator {

    private boolean isPrint;
    @Override
    public int calculate(String exp) {
        int[] split = split(exp, "+");
        return split[0] - split[1];
    }

    @Override
    protected void print(String exp, int result) {
        System.out.println("the plus result: " + exp + " = " + result);
    }

    @Override
    protected boolean isPrint() {
        return isPrint;
    }

    @Override
    protected void other(int result) {
        System.out.println("other...");
    }
}
package behavior.pattern.extend.templatemethod;

public class Multiply extends AbstractCalculator {

    private boolean isPrint;

    public Multiply(boolean isPrint) {
        this.isPrint = isPrint;
    }

    @Override
    public int calculate(String exp) {
        int[] split = split(exp, "*");
        return split[0] - split[1];
    }

    @Override
    protected void print(String exp, int result) {
        System.out.println("the multiply result: " + exp + " = " + result);
    }

    @Override
    protected boolean isPrint() {
        return isPrint;
    }

    @Override
    protected void other(int result) {
        System.out.println("other...");
    }
}

  测试代码

package behavior.pattern.extend.templatemethod;

public class Client {
    public static void main(String[] args) {
        AbstractCalculator minus = new Minus(true);
        minus.mainCaculate("43536363-1155145");
    }
}

  运行结果

原文地址:https://www.cnblogs.com/liunianfeiyu/p/10122134.html

时间: 2024-11-10 16:11:27

行为型模式-模板方法模式的相关文章

第24章 行为型模式—模板方法模式

1. 模板方法模式(Template Method Pattern)的定义 (1)定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. (2)模板方法模式的结构和说明 ①AbstractClass:抽象类.用于定义算法骨架和抽象的原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤.在这个类里面,还可以提供算法中通用的实现.此外,该类还实现了一个模板方法,它定义了算法的骨架.该模板方法不仅调用原语操作,

设计模式(行为型)之模板方法模式(Template Method Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之命令模式(Command Pattern)>http://blog.csdn.net/yanbober/article/details/45500113 概述 模板方法模式是一种基于继承的代码复用,它是一种类行为型模式:是结构最简单的行为型设计模式,在其结构

&quot;围观&quot;设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern)

模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤.----WIKIPEDIA 个人理解 模板方法模式相对而言比较简单,一般的都是由抽象类定义好模板方法,然后,子类通过继承并实现其父类中定义好的模板中需要执行的具体的方法,调用子类对象的模板方法时,会执行该类中的具体实现的方法.这个模式我个人的感觉有点像是面向过程的操作,执行完一道工序,接着下一道工序. 案例解析 模板方法相对来说比较简单,这里只列举一个例子供大

18 行为型模式-----模板方法模式

模式动机(Template Method Pattern):所谓模板,就是具有通用性的一个框架,在不同的具体环境下可以匹配不同的行为.在程序设计中,代码的复用一直是人们追求的目标,更好地利用已有的设计,不仅可以极大地提高开发效率,而且也能保证软件本身的鲁棒性. 一种代码复用的基本原则就是继承机制,但是我们也知道,普通的继承可能会造成派生类比较臃肿,具有“强制性”实现的特性,特别是基类为抽象接口时更是如此.如何让基类承担更多的一般性职责,这就是模板方法模式所解决的问题了. 在模板方法中,将算法的框

24 种设计模式之 外观模式+模板方法模式

面向 对象的设计,外观模式和模板方法模式类似,都是封装 ,某个程序 需要很多类,而且很多地方要用. 便创建一个新的类,把拥有所有类的实例,从而使 代码简洁: 这个模式呢,有个最大的特点将细粒度的对象包装成粗粒度的对象,应用程序通过 访问这个外观对象,来完成细粒度对象的调用,外观模式一般是分布式应用和系统架构中的应用服务层的设计中常用的方式,并且一般结合外观模式+DTO 来完成服务层的设计,提供分布式应用服务的高效服务,外观模式我们可以这样理解,我们通过外观的包装,使应用程序只能看到外观对象,而不

Java设计模式之模板方法模式或者说模板设计模式(属于行为型)

抽象类,不变的代码写了,要变化的部分留给子类去实现: package 行为型_模板方法模式; //模板设计模式的意思是把不变定位部分写出来,变化的部分留给子类去实现 public abstract class GetTime { public long getTime() throws Exception{ long start = System.currentTimeMillis();//开始时间 /* //for循环 for(int i=0;i<10000;i++){ System.out.

设计模式-行为型模式-策略模式

策略模式 在实际工作中我用到了策略模式,但为什么要有环境角色呢? 这里我贴上英文对含义的介绍, The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 然后看看这种设计模式的组成, 一般的,策略模式

模板方法模式----你该找对象了(二)

上一篇小编叙述 模仿方法模式 模板方法模式----你该找对象了(一) 目录 1.概述 2.结构与分析 3.拓展 4.模式总结 3.拓展 钩子方法给子类留了"后门"可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制.(体现灵活性)        上篇博客续集,情侣之间约约会,看看电影,喝喝咖啡,调情调情还是不错的.说到喝咖啡,这不来到星巴克咖啡店 ,我们要了一杯咖啡,当漂亮的服务员问你:"先生,您是否要加调料?"你是呆呆地站在那--还

设计模式(行为型)之状态模式(State Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之模板方法模式(Template Method Pattern)>http://blog.csdn.net/yanbober/article/details/45501715 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中