游戏中的设计模式六(模板模式)
来源:互联网 发布:手机编程序软件 编辑:程序博客网 时间:2024/03/29 15:45
博客地址:blog.liujunliang.com.cn
写在前面
游戏中的各个武器一套攻击动作有固定的步骤,但是每个步骤根据武器对象的不同,而细节的实现不同
此时使用模板方法定义一个操作中的方式/算法的骨架,意思就是说在父类里定义一个完成该事情的总步骤
每个步骤的具体实现,由子类完成实现,不同子类的实现方式/算法不尽相同
模板方法定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法结构即可重定义该算法的某些特定步骤
案例结构图
武器倚天剑和屠龙刀都继承自IWeapon,其中PlaySkillEffect和PlayStartSound方法是模板方法
子类在这两个方法中一些实现方式不一样,它们各自的特定步骤放在子类中具体实现
代码实现
创建抽象类(模板)
using UnityEngine;using System.Collections;public abstract class IWeapon { public void Attack() { PlaySkillEffect(); PlayStartSound(); PlayEndSound(); } public abstract void PlaySkillEffect(); public abstract void PlayStartSound(); public void PlayEndSound() { Debug.Log("攻击敌人音效"); }}
创建扩展模板的实体类
屠龙刀
using UnityEngine;using System.Collections;public class TLDWeapon : IWeapon { public override void PlaySkillEffect() { Debug.Log("播放技能特效"); } public override void PlayStartSound() { Debug.Log("播放屠龙刀开始音效"); }}
倚天剑
using UnityEngine;using System.Collections;public class YTJWeapon : IWeapon{ public override void PlaySkillEffect() { Debug.Log("播放倚天剑技能特效"); } public override void PlayStartSound() { Debug.Log("播放倚天剑开始音效"); }}
测试
using UnityEngine;using System.Collections;public class Main : MonoBehaviour { private void Start() { IWeapon weapon = new YTJWeapon(); weapon.Attack(); weapon = new TLDWeapon(); weapon.Attack(); }}
验证输出
模式优点
1、具体的细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构
2、代码的复用的基本技术
3、存在一种反向的控制结构,通过一个父类调用子类的操作,通过子类对父类进行扩展新的行为,符合“开闭原则”
模式缺点
每个不同的对象实现都需要定义一个子类,将导致类的个数庞大
博客地址:blog.liujunliang.com.cn
阅读全文
0 0
- 游戏中的设计模式六(模板模式)
- 设计模式在游戏中的应用--原型模式(六)
- 设计模式在游戏中的应用--模板方法(七)
- PHP设计模式系列(六):模板方法模式
- 设计模式之六模板方法模式
- 设计模式(六)
- 《Spring中的模板设计模式》
- (六)模板方法模式
- 设计模式在游戏中的应用--策略模式(二)
- 设计模式在游戏中的应用--装饰模式(三)
- 设计模式在游戏中的应用--代理模式(四)
- 游戏中的设计模式(1)--观察者模式
- 设计模式在游戏中的应用--外观模式(八)
- 设计模式在游戏中的应用--观察者模式(十)
- 游戏中的设计模式二(外观模式)
- 游戏中的设计模式三(中介者模式)
- 游戏中的设计模式四(桥接模式)
- 游戏中的设计模式五(策略模式)
- 2017年9月13号-第一次注册博客
- Andoird 图片加载框架区别
- linux中的rootfs/initrd/ramfs/initramfs
- javascript中的垃圾收集及内存泄漏
- MySQL排序原理与案例分析
- 游戏中的设计模式六(模板模式)
- Uncaught SyntaxError: Unexpected end of input
- CSS3:如何保持浮层水平垂直居中
- 为什么 Android 要采用 Binder 作为 IPC 机制?
- Eclipse 编辑器中显示当前文件的路径(面包屑栏)
- Swift3.0 URLSession学习笔记
- Different Ways to Add Parentheses问题及解法
- poj3522最小生成树
- 设计模式大全(java,android)