模板方法模式
前言
行为型设计模式 关注对象和行为的分离。
关于父类与子类 调用时候 具体调用的哪一个?
|--------|----|-------|------|
| 普通方法 | 调用 | 编译时决定 | 左边决定 |
| 抽象/虚方法 | 调用 | 运行时决定 | 右边决定 |
介绍
|--------|--------------------------------------------------------------------------|-------------------------------------------------------|
| 设计模式 | 定义 | 案例 |
| 模板方法模式 | 父类 定义了业务流程,其中一部分 延迟到子类自己去完成 (通过虚方法/抽象方法) 和框架搭建很像:定义流程,实现了通用部分,可变部分传下去给子类 | 不同年龄段的模特走秀 每个不同年龄段模特 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();
}
}
}