Dynamics AX 中的模板方法模式

    在上图中(点击查看大图),BrushBase的GetColor 是一个虚函数,为了提高封装性,我们在此将其定义为受保护成员(Protected)。GetColor 函数的实现部分被摆放在了BrushBase 的子类中,而BrushBase本身却用到了这个虚函数。在模板方法模式中,将GetColor 方法的实现称为延迟实现(Late Implementation),而将调用该方法的方法(BrushBase.Paint)称为模板方法。

 

    Dynamics AX 中大量使用了模板方法模式,在开发的过程中,您会碰到很多并没有实现的函数(空函数),当遇到这种情况,您就需要考虑此处是否就是模板方法的一种应用;在调试的过程中,当您跟进(Step into)当前类的实例方法时,却进入到子类的同名方法中,这种情况正是模板方法的应用典范。举例来讲,AX 中的销售订单Posting 部分,SalesFormLetter 类就相当于上面所讲的BrushBase类,其中的updateNow就是一个有待延迟实现的虚函数;而SalesFormLetter_Confirm、SalesFormLetter_Invoice等都是SalesFormLetter的子类,相当于上面所讲的RedBrush、GreenBrush 等,它们都分别在自己内部实现了updateNow方法。SalesFormLetter.InsertJournal方法调用了updateNow,它就是一个模板方法。至此,您应该终于了解到虚函数的重要意义了,那就是延迟实现所带来的扩展性。

 

    设想上面的例子,假设我们在Invoke方法中使用工厂模式,修改BrushBase brush = new RedBrush()语句,让它能够根据配置信息来创建相应的实体对象(或者使用构造函数依赖注入模式),那么当我们需要增加一种颜色的画笔时,问题是否变得非常简单?只需要做两步:1、继承BrushBase来实现我们的画笔;2、修改配置信息。或许您在开发中早已用到了这种模式,只是您不知道它叫“模板方法模式”。 “在做软件设计的时候,每个人都想使用某种模式来提高软件的韧度,却不是每个人都知道,在他的设计中,已经采用了这种模式”,这是我常说的一句话。其实没关系,模式本身就是经验总结,如果您在开发过程中有过一些经验的积累,您完全可以总结出自己的设计模式。但是,没有实践经验就没法深刻理解这些知识,再去提模式这个概念就已经没有意义了。所以,不要刻意地去学习模式。

你可能感兴趣的:(dynamic)