设计模式_模板方法模式

模板方法模式

前言

行为型设计模式 关注对象和行为的分离。

关于父类与子类 调用时候 具体调用的哪一个?

|--------|----|-------|------|
| 普通方法 | 调用 | 编译时决定 | 左边决定 |
| 抽象/虚方法 | 调用 | 运行时决定 | 右边决定 |

介绍

|--------|--------------------------------------------------------------------------|-------------------------------------------------------|
| 设计模式 | 定义 | 案例 |
| 模板方法模式 | 父类 定义了业务流程,其中一部分 延迟到子类自己去完成 (通过虚方法/抽象方法) 和框架搭建很像:定义流程,实现了通用部分,可变部分传下去给子类 | 不同年龄段的模特走秀 每个不同年龄段模特 show的内容不同 其中小朋友年龄段的模特 上台后有特殊pose |

|----------------------|-----------------------------------------------------------------------|----------------------------|
| 问题堆积在哪里 | 解决办法 | 解释 |
| show的内容不同 小朋友有特殊pose | 父类中 定义了通用的流程 抽象方法其中: show的部分(必须有 所以用抽象) 虚函方法其中: 特殊pose部分(可有可无 所以用虚方法) | 感觉:把类当做函数,其中虚方法/抽象方法 就是变量! |

类图

代码例子

BaseModel

cs 复制代码
using UnityEngine;

public abstract class BaseModel
{
    public void Show()
    {
        // 上台
        Up();
        // 摆pose : 虚方法 有默认的pose 也可以
        Pose();
        // 开始show : 抽象方法不同的模特有不同的show过程
        Begin();
        // 下台
        Down();
    }

    // 开始 show
    public abstract void Begin();

    // 摆 Pose
    public virtual void Pose()
    {
        Debug.Log("Pose1");
    }

    private void Up()
    {
        Debug.Log("上台");
    }

    private void Down()
    {
        Debug.Log("下台");
    }
}

KidModel

cs 复制代码
using UnityEngine;

public class KidModel : BaseModel
{
    public override void Begin()
    {
        Debug.Log("小朋友模特开始 show!");
    }

    // 小朋友自己设计一个pose
    public override void Pose()
    {
        Debug.Log("我是可爱的天使!");
    }
}

AdultModel

cs 复制代码
using UnityEngine;

public class AdultModel : BaseModel
{
    public override void Begin()
    {
        Debug.Log("成年模特开始 Show!");
    }
}

OldModel

cs 复制代码
using UnityEngine;

public class OldModel : BaseModel
{
    public override void Begin()
    {
        Debug.Log("大龄模特开始show!");
    }
}

使用

cs 复制代码
using UnityEngine;

public class Emcee : MonoBehaviour
{
    void Start()
    {
        Debug.Log("---------------------------成年模特");
        {
            BaseModel model = new AdultModel();
            model.Show();
        }

        Debug.Log("---------------------------小孩模特");
        {
            BaseModel model = new KidModel();
            model.Show();
        }

        Debug.Log("---------------------------老年模特");
        {
            BaseModel model = new OldModel();
            model.Show();
        }
    }

}

结果

相关推荐
ghost14310 小时前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新13 小时前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式
敲代码的 蜡笔小新1 天前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_555762901 天前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式
小Mie不吃饭1 天前
【23种设计模式】分类结构有哪些?
java·设计模式·设计规范
君鼎2 天前
C++设计模式——单例模式
c++·单例模式·设计模式
敲代码的 蜡笔小新2 天前
【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
unity·设计模式·c#·中介者模式
令狐前生2 天前
设计模式学习整理
学习·设计模式
敲代码的 蜡笔小新2 天前
【行为型之解释器模式】游戏开发实战——Unity动态公式解析与脚本系统的架构奥秘
unity·设计模式·游戏引擎·解释器模式
JANYI20182 天前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式