打字猴:1.70047824e+09
1700478240 设计模式之禅 [:1700454072]
1700478241 设计模式之禅 32.2 策略模式VS状态模式
1700478242
1700478243 在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下,如图32-3所示。
1700478244
1700478245
1700478246
1700478247
1700478248 图32-3 策略模式(左)和状态模式(右)的通用类图
1700478249
1700478250 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式。但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的;而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的。这两种模式虽然都有变换的行为,但是两者的目标却是不同的。我们举例来说明两者的不同点。
1700478251
1700478252 人只要生下来就有工作可做,人在孩童时期的主要工作就是玩耍(学习只是在人类具有了精神意识行为后才产生的);成人时期的主要工作则是养活自己,然后为社会做贡献;老年时期的主要工作就是享受天伦之乐。按照策略模式来分析,这三种不同的工作方式就是三个不同的具体算法,随着时光的推移工作内容随之更替,这和对一堆数组的冒泡排序、快速排序、插入排序一样,都是一系列的算法;而按照状态模式进行设计,则认为人的状态(孩童、成人、老人)产生了不同的行为结果,这里的行为都相同,都是工作,但是它们的实现方式确实不同,也就是产生的结果不同,看起来就像是类改变了。
1700478253
1700478254 32.2.1 策略模式实现人生
1700478255
1700478256 下面按照策略模式进行设计,先来看类图,如图32-4所示。
1700478257
1700478258
1700478259
1700478260
1700478261 图32-4 策略模式实现人生的类图
1700478262
1700478263 这是非常典型的策略模式,没有太多的玄机,它定义了一个工作算法,然后有三个实现类:孩童工作、成年人工作和老年人工作。我们来看代码,首先看抽象工作算法,如代码清单32-19所示。
1700478264
1700478265 代码清单32-19 抽象工作算法
1700478266
1700478267 public abstract class WorkAlgorithm{
1700478268
1700478269 //每个年龄段都必须完成的工作
1700478270
1700478271 public abstract void work();
1700478272
1700478273 }
1700478274
1700478275 无论如何,每个算法都必须实现work方法,完成对工作内容的定义,三个具体的工作算法如代码清单32-20、32-21、32-22所示。
1700478276
1700478277 代码清单32-20 孩童工作
1700478278
1700478279 public class ChildWork extends WorkAlgorithm{
1700478280
1700478281 //小孩的工作
1700478282
1700478283 @Override
1700478284
1700478285 public void work(){
1700478286
1700478287 System.out.println(“儿童的工作是玩耍!”);
1700478288
1700478289 }
[ 上一页 ]  [ :1.70047824e+09 ]  [ 下一页 ]