美文网首页
模板方法模式

模板方法模式

作者: 世间哪有坦途 | 来源:发表于2022-05-23 10:18 被阅读0次

一、模板方法的定义

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

二、模板方法的实现

image.png

比如银行办理业务的流程:不管客户要办理什么业务,都要经过取号这一步,取完号之后开始办理各种各样的业务,业务办理完毕之后,一般工作人员都会邀请客户进行评价。我们可以把这个过程抽象为三步:

  1. 取号 不管办理什么业务取号的步骤是一样的
  2. 办理业务 办理业务这一块应该是有不同的实现方法的
  3. 评价 不管办理什么业务评价这一步也是一定会邀请的(具体客户做不做看客户心情喽)

如果对应代码,取号和评价基本可以抽象到父类中,作为公共方法,办理业务这一块则各个子类都有各自的实现,再极端点,评价这一步也可以由父类代码有默认实现,如果各个子类有不同的意见可以重写方法覆盖父类实现。

父类方法:

/**
 * 模板方法设计模式的抽象类
 * @author hollis
 */
public abstract class AbstractBusinessHandeler {
    /**
     * 模板方法
     */
    public final void execute(){
        getRowNumber();
        handle();
        judge();
    }
    /**
     * 取号
     * @return
     */
    private void getRowNumber(){
        System.out.println("rowNumber-00" + RandomUtils.nextInt());
    }
    /**
     * 办理业务
     */
    public abstract void handle(); //抽象的办理业务方法,由子类实现
    /**
     * 评价
     */
    public void judge(){
        System.out.println("give a praised");
    }
}

业务的总执行流程在父类中的execute()方法中定义好了,取号和评价的方法已经在父类实现了,而且评价的方法时共有的意味着子类可以进行自己的实现,不同的业务类型的子类最大的不同就是handle()方法的各自实现不同。

子类代码:

public class SaveMoneyHandler extends AbstractBusinessHandeler {
    @Override
    public void handle() {
        System.out.println("save 1000");
    }
    public static void main(String []args){
        SaveMoneyHandler saveMoneyHandler = new SaveMoneyHandler();
        saveMoneyHandler.execute();
    }
}

在main方法中,子类调用的实际是父类的execute()方法,所以取号和评价也是执行的父类方法,只有handle()方法是调用子类自己的方法。这是运用到了Java继承的原理来实现的

三、总结

1.模板方法模式是一种类的行为型模式,在它的结构图中只有类之间的继承关系,没有对象关联关系。
2.模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。
3.在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式。
4.钩子是一种方法,它在抽象类中不做事,或者是默认的事情,子类可以选择覆盖它
5.为了防止子类改变模板方法中的算法骨架,一般将模板方法声明为final
6.策略模式和模板方法都是用于封装算法,前者是利用组合和委托模型,而后者则是继承

相关文章

网友评论

      本文标题:模板方法模式

      本文链接:https://www.haomeiwen.com/subject/csdkprtx.html