Operation Patterns中Template Method, State和Strategy的理解和分析

闲话不多说,先从Template Method开始。

对于Template Methods,官方(指GoF书中)的定义的是:"Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. "

简单用中文来说,就是将某个方法中的一些子操作(通过将子操作定义为虚函数的形式)保留,留待该方法所在类子类来实现。简单的示例图:

其中,PrimitiveOperation就是要留待子类实现的部分操作。这个设计模式看似没有很复杂的内容,但是有两点需要记住:

首先是如一本书中提到的"classes in a hierarchy share the outline of an algorithm in an abstract superclass",具体怎么应用要看理解,由于我的应用经验也不是很足,这里无法做出非常清晰的解释

还有一点是Template Method在 "to implenment similar algorithms in more than one method" 时也有很好的用法。这个用法的一个例子就是在与Factory Method结合的时候(这个应用有些类似基于Factory Method再应用一次多态,当然,这是笔者个人的理解)。具体可以去看《Design Pattern Java Workbook》,里面有不错的例子。

 

简单介绍完Template Method,接下来看一下State。如它的名字所说,这个模式与程序状态有关。GoF的定义为: "Allow an object to alter its behavior when its internal state changes. The object will appear to change its class".

在分析以前看一下图例:

我认为对State的理解有两个,一个是GoF提出State的时候的意思,即,使对象状态的改变可以动态改变其行为;还有一个是我们在实践中体会到的,即在某个对象状态变化十分复杂的时候,将其每个状态都封装成一个类,实现if-else的功能。

 

接下来是Strategy的一些理解。GoF的定义为: "Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.".  以笔者的观点看来,这个模式的主要作用是,对于程序提供的多个可能的策略,利用多态,这个模式可以动态的选择其中的某一策略。看一下图:

 

 

 图里面已经比较清楚,笔者将自己认为的几点说一下:

一是对于具体的策略(如ConcreteStrategyA),有时需要采用Singleton模式

二是在策略很多很复杂时,在具体的策略类(如ConcreteStrategyA)中,我们往往不直接将策略写在AlgorithmInterface里,而是应用Flyweitht模式,抽取某些可重用的部分。

 

以上是笔者对三个模式的一些理解,可以看到,三者的区别是明显的,但又不是完全不同(废话)。也许正确的使用全凭乎一个感觉,即经验。而通过对这三个模式的学习,笔者认为自己对多态有了更深入的理解,希望对看这片文章的人也有所帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值