【2019.7.1】
看一本关于设计模式的书,首先翻阅其模板方法模式。一方面,模板方法模式极为基础,也包含很多设计思考;另一方面,它反映作者对设计模式的理解程度,这一章写得不好,一定是水货师傅。
我们通过设计累积函数,引入策略模式的扩展、模板方法模式(5.10)。
-------------------------------------------
第4章 多重策略
4.1.3 模板方法模式(5.10)
例程4-2的抽象类Sum符合[GoF·5.10]关于模板方法模式的定义:
模板方法模式:定义一个算法的框架,将它的一些步骤延迟到子类中。模板方法模式使得子类可以在不改变一个算法的结构时重定义该算法的某些特定步骤。(Template Method Pattern: Define the skeleton of an algorithm inan operation, deferring some steps tosubclasses. Template Method lets subclasses redefine certain steps of an algorithmwithout changing the algorithm's structure.)
重构后的例程4-3的final类Accumulate,则提供了4参数的模板方法。严格地说,Accumulate有模板方法getSum(),使用了两次策略模式。但是,对于模板方法的一些步骤,是延迟到子类中、或者通过策略子类型提供、或者作为模板方法的参数,从设计角度看不需要太过区分。因此,
★模板方法模式:模板方法定义一个算法的框架,它的一些步骤可以延迟到子类中,也可以采用n次并行的策略模式。
或者说,采用传统的模板方法模式,两个(及以上的)方法实现放在一个类体中。当需要避免类型爆炸或实现方式过多时,采用n次并行的策略模式;如果模板方法中只有一个可变的部分,模板方法模式还原为策略模式。换言之,模板方法模式可以视为策略模式的简单推论:可变部分由一到多。【传统模板方法模式(5.10)、我的模板方法模式、策略模式】
1.可变步骤的设计
可变步骤通常有3中设计选择:
Ø 抽象方法
Ø 空方法
Ø 具体方法
上面介绍的item(int x),就是典型的设计选择——抽象方法。而对于next(int x),毕竟i++在循环计算中最为常见,如何设计INext呢?一种方式是INext仅仅提供一个具体的方法(default方法);同时,为了方便用户,还需要定义一个步进为1的对象用作getSum()的参数。但是,这种方案使得INext成为普通接口,需要其他实现时只能够采用匿名类而不能够使用简洁的lambda表达式。
public interface INext{
//double next(double x);
public static INext NEXT = new INext(){};
default double next(double x){
return x+1;
}
}
// TestSum文件中求从1到10的自然数的和
double r = Accumulate.getSum(1, 10, INext.NEXT, x->x);
pln("[1,10] 自然数的和=" + r);
该方案的替代,则INext不变,提供重载getSum(doublea, double b, IItem iItem)的3参数版本。
----------------------------------
模式引申 4.3 模板方法模式(5.10)
4.3.1 代码向上集中
4.3.2 空方法
4.3.2 累积函数
4.3.4 关于GoF的(5.10节)
内容待填
相关博客被重构-移动 到垃圾桶。
[垃圾桶]Java 模板方法模式 模板方法模式、与n次策略模式 关系问题.整合到3.3.3。模板方法模式的定义
[垃圾桶]3.3模板方法模式2 +回调
[垃圾桶]模板方法模式(5.10) 脑残例子,如何有效地控制和合理地使用实现继承。整合到3.3.1
相关博客值得参考,整合完成后,也会移动 到垃圾桶。
高阶函数之函数作为参数 在求和的基础上补充了SICP练习1.31和1.32的东西。
Java8:λ表达式作为实参 和上面的博客是相同的东西。一个用Java8,一个用Scheme。整合到3.3.2.
累积函数。累加计算的操作符,分别为+和*。Java中不能够直接将+和*作为函数的参数,需要用函数替换+和*,可以使用例程2-2中定义的DoubleOP。
public final double accumulate(double defaultValue,DoubleOP how_op,double a, double b, INext iNext, IItem iItem) {
double value = defaultValue;
for (; a <= b; a = iNext.next(a)) {
value = how_op.op(value, iItem.item(a));
}
return value;
}
写书和写博客是完全不同的。我写博客,想到什么写什么,该吐槽吐槽,兴致来了,管它逻辑不逻辑。
写书时,就需要将一系列的想法加以整合、逻辑上加以完善,各种可能需要考虑。
本文探讨模板方法模式与策略模式的关系,分析不同设计选择如抽象方法、空方法和具体方法等在模式中的应用,并通过实例说明如何在Java中实现这些模式。

575

被折叠的 条评论
为什么被折叠?



