设计模式 - Template模式

1 问题

在面向对象系统的分析与设计过程中经常会遇到这样一种情况:
对于某一个业务逻辑 (算法实现)在不同的对象中有不同的细节实现,
但是逻辑(算法)的框架(或通用的应用 算法)是相同的。
Template 提供了这种情况的一个实现框架。
Template 模式是采用继承的方式实现这一点:
将逻辑(算法)框架放在抽象基类中,并 定义好细节的接口,子类中实现细节。
【注释 1】 【注释1:Strategy模式解决的是和Template模式类似的问题,
但是Strategy模式是将逻辑 (算法)封装到一个类中,并采取组合(委托)的方式解决这个问题。

2 代码

using UnityEngine;
using System.Collections;

namespace Template{

    public abstract class AbstractClass{
        public virtual void TemplateMethod(){
            this.PrimitiveOperation1();
            this.PrimitiveOperation2();
        }

        protected abstract void PrimitiveOperation1();
        protected abstract void PrimitiveOperation2();
    }

    public class ConcreteClass1 : AbstractClass{
        protected override void PrimitiveOperation1(){
            Debug.Log("ConcreteClass1...PrimitiveOperat ion1");
        }
        protected override void PrimitiveOperation2(){
            Debug.Log("ConcreteClass1...PrimitiveOperat ion2");
        }
    }

    public class ConcreteClass2 : AbstractClass{
        protected override void PrimitiveOperation1(){
            Debug.Log("ConcreteClass2...PrimitiveOperat ion1");
        }
        protected override void PrimitiveOperation2(){
            Debug.Log("ConcreteClass2...PrimitiveOperat ion2");
        }
    }

    public class TemplateDemo : MonoBehaviour {

        //模板模式
        void Start(){
            AbstractClass p1 = new ConcreteClass1();
            AbstractClass p2 = new ConcreteClass2();

            p1.TemplateMethod();
            p2.TemplateMethod();
        }
    }

}

3 总结
这里写图片描述
Template 模式是很简单模式,但是也应用很广的模式。如上面的分析和实现中阐明的
Template 是采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中, 第 79 页共 171 页 k_eckel
设计模式精解-GoF 23 种设计模式解析附 C++实现源码 http://www.mscenter.edu.cn/blog/k_eckel
并将不同的算法细节放到子类中实现。
Template 模式获得一种反向控制结构效果,这也是面向对象系统的分析和设计中一个原
则 DIP(依赖倒置:Dependency Inversion Principles)。其含义就是父类调用子类的操作(高 层模块调用低层模块的操作),低层模块实现高层模块声明的接口。这样控制权在父类(高 层模块),低层模块反而要依赖高层模块。
继承的强制性约束关系也让 Template 模式有不足的地方,我们可以看到对于 ConcreteClass 类中的实现的原语方法 Primitive1(),是不能被别的类复用。假设我们要创建 一个 AbstractClass 的变体 AnotherAbstractClass,并且两者只是通用算法不一样,其原语操 作想复用 AbstractClass 的子类的实现。但是这是不可能实现的,因为 ConcreteClass 继承自 AbstractClass,也就继承了 AbstractClass 的通用算法,AnotherAbstractClass 是复用不了 ConcreteClass 的实现,因为后者不是继承自前者。
Template 模式暴露的问题也正是继承所固有的问题,Strategy 模式则通过组合(委托) 来达到和 Template 模式类似的效果,其代价就是空间和时间上的代价,关于 Strategy 模式的 详细讨论请参考 Strategy 模式解析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值