行为型模式-模板方法

suaxi
2022-09-16 / 0 评论 / 44 阅读 / 正在检测是否收录...

行为型模式

用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,涉及算法和对象间职责的分配

分为:模板方法、策略模式、命令模式、责任链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式;其中模板方法、解释器模式属于类行为模式,其他属于对象行为模式

模板方法

(1)概述

定义一个操作中的算法骨架,并将其中的一些步骤延迟到子类中执行,使得子类可以在不改变主干步骤的情况下重定义该算法的某些特定步骤

(2)结构
  • 抽象类:负责给出一个算法的轮廓和骨架,由一个模板方法和若干个基本方法构成

    • 模板方法:定义算法的骨架,按指定的顺序调用其包含的基本方法
    • 基本方法:实现算法的各个步骤(模板方法的组成部分)

      • 抽象方法:由抽象类声明,由其具体子类实现
      • 具体方法:由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承
      • 钩子方法:在抽象类中已实现,包括用于判断的逻辑方法和需要子类重写的空方法两个部分
  • 具体子类:实现抽象类中定义的抽象方法和钩子方法

钩子方法一般是用于做判断的逻辑方法,类名为 isXXX,返回值类型为 boolean

(3)案例

以炒菜为例

1.模板方法(炒菜案例).png

抽象类

public abstract class AbstractClass {

    /**
     * 模板方法
     */
    public final void cookProcess() {
        pourOil();
        heatOil();
        pourVegetable();
        pourSauce();
        fry();
    }

    public void pourOil() {
        System.out.println("倒油");
    }

    public void heatOil() {
        System.out.println("热油");
    }

    /**
     * 倒蔬菜
     */
    public abstract void pourVegetable();

    /**
     * 放调料
     */
    public abstract void pourSauce();

    public void fry() {
        System.out.println("准备完毕,开始炒菜");
    }
}

具体类

public class ConcreteClass_BaoCai extends AbstractClass {

    @Override
    public void pourVegetable() {
        System.out.println("放入包菜");
    }

    @Override
    public void pourSauce() {
        System.out.println("放入辣椒");
    }
}

public class ConcreteClass_CaiXin extends AbstractClass {

    @Override
    public void pourVegetable() {
        System.out.println("放入菜心");
    }

    @Override
    public void pourSauce() {
        System.out.println("放入蒜瓣");
    }
}

Client

public class Client {
    public static void main(String[] args) {
        //炒包菜
        ConcreteClass_BaoCai baoCai = new ConcreteClass_BaoCai();
        baoCai.cookProcess();
    }
}
(4)优缺点
  • 代码复用,相同的代码可以放到抽象父类中,不同的代码放在对应的子类中
  • 实现了反向控制,通过父类调用其子类的操作,并通过子类的不同实现扩展不同的行为,复合开闭原则
  • 对每个不同的实现都需要定义一个子类,导致类的个数及系统设计难度的增加
  • 反向控制降低了代码的易读性
(5)使用场景
  • 算法的整体步骤固定,但其中的个别部分易变时,使用模板方法可将易变的部分抽象出来,由其子类实现
  • 需要通过子类决定父类中的某个步骤是否执行,实现子类对父类的反向控制
0

评论 (0)

取消