模板方法模式(Template Method)

2018-08-15  本文已影响0人  luoqiang108

1.介绍

1.1定义

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

1.2 主要作用

在不改变模板结构的前提下在子类中重新定义模板中的内容。

模板方法模式是基于”继承“的。

1.3 解决的问题

2. 模式原理

2.1 UML类图 & 组成讲解

模板方法模式UML.png

2.2 实例讲解

接下来我用一个实例来对模板方法模式进行更深一步的介绍。

a. 实例概况

b. 使用步骤

步骤1:创建抽象模板结构(AbstractClass):炒菜的步骤

public abstract class AbstractClass {
    //模板方法,用来控制炒菜的流程 (炒菜的流程是一样的-复用)
    //申明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序
    final void cookProcess(){
        //第一步:倒油
        this.pourOil();
        //第二步:热油
        this.HeatOil();
        //第三步:倒蔬菜
        this.pourVegetable();
        //第四步:倒调味料
        this.pourSauce();
        //第五步:翻炒
        this.fry();
    }

    //定义结构里哪些方法是所有过程都是一样的可复用的,哪些是需要子类进行实现的
    //第一步:倒油是一样的,所以直接实现
    void pourOil(){
        System.out.println("倒油");
    }
    //第二步:热油是一样的,所以直接实现
    void  HeatOil(){
        System.out.println("热油");
    }
    //第三步:倒蔬菜是不一样的(一个下包菜,一个是下菜心)
    //所以声明为抽象方法,具体由子类实现
    abstract void  pourVegetable();
    //第四步:倒调味料是不一样的(一个下辣椒,一个是下蒜蓉)
    //所以声明为抽象方法,具体由子类实现
    abstract void  pourSauce();
    //第五步:翻炒是一样的,所以直接实现
    void fry(){
        System.out.println("炒啊炒啊炒到熟啊");
        System.out.println("---------------------------------");
    };
}

步骤2:创建具体模板(ConcreteClass),手撕包菜(ConcreteClass_BaoCai)的具体步骤

//炒手撕包菜的类
public class ConcreteClass_BaoCai extends AbstractClass {
    @Override
    void pourVegetable() {
        System.out.println("下锅的蔬菜是包菜");
    }
    @Override
    void pourSauce() {
        System.out.println("下锅的酱料是辣椒");
    }
}

步骤3:创建具体模板(ConcreteClass),蒜蓉炒菜心(ConcreteClass_CaiXin)的具体步骤

//炒蒜蓉菜心的类
public class ConcreteClass_CaiXin extends AbstractClass {
    @Override
    void pourVegetable() {
        System.out.println("下锅的蔬菜是菜心");
    }
    @Override
    void pourSauce() {
        System.out.println("下锅的酱料是蒜蓉");
    }
}

步骤4:客户端调用-炒菜了

public class TemplateMethod {
    public static void main(String[] args){
        //炒 - 手撕包菜
        ConcreteClass_BaoCai BaoCai = new ConcreteClass_BaoCai();
        BaoCai.cookProcess();

        //炒 - 蒜蓉菜心
        ConcreteClass_CaiXin CaiXin = new ConcreteClass_CaiXin();
        CaiXin.cookProcess();
    }
}

输出结果

倒油
热油
下锅的蔬菜是包菜
下锅的酱料是辣椒
炒啊炒啊炒到熟啊
---------------------------------
倒油
热油
下锅的蔬菜是菜心
下锅的酱料是蒜蓉
炒啊炒啊炒到熟啊
---------------------------------

3. 优缺点

3.1 优点

3.2 缺点

引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了实现的复杂度。

4. 应用场景

5.感谢

模板方法模式(Template Method) - 最易懂的设计模式解析
Java设计模式之模板方法模式(Template Method)

上一篇下一篇

猜你喜欢

热点阅读