Design Patterns

Scala patterns (#6) - Kestrel combinator

Kestrel combinator并不是一种传统的设计模式,这个叫法是在1985年出版的To Mock the Mockingbird这本书里提到的,可以参考Scala in action作者引用的资源地址详细了解这种模式,其中的例子使用的是Ruby语言。我理解这种模式的意义主要是产生副作用,即在不改变原有类或对象定义的情况下,使用一段附加函数体来达到产生副作用的目的。

Scala patterns (#5) - the Loan Pattern

按照Scala in action的说法,Scala中的借贷模式(Loan Pattern)相当于Java/C++中的模板方法(Template Method)模式。很遗憾,由于同样的原因,书中所附的引用链接已失效(囧),所以
只能从网上参考借贷模式的详解。我认为Knoldus的这篇博文理解借贷模式写得非常不错,把这种模式的适用场景写得很清楚:

Scala patterns (#4) - Strategy

策略模式是一种经典的设计模式,简而言之,就是做同一件事情,但在不同的场景中(或针对不同的对象)采用不同的算法。由于Scala简洁的语法和对高阶函数的支持,相比Java写出的代码会更加精简。

下面给出几个例子来感受一下Scala中策略模式的写法,首先是Scala in action书中的例子。

Scala patterns (#3) - Successor Value

其实这个设计模式也不是Scala语言特有的,只是因为在Scala in action(下文中提到的书都是指本书)中提到,因此做一个小结。在书的第五章Functional Programming中讨论函数式编程的时候,谈到了纯函数式编程、面向对象编程和非纯函数式编程的一些特点。Scala是一门杂糅的编程语言,它不是纯函数式语言,这样就涉及到一个问题:如何尽量多地使用它的函数式特性,同时避免或者减少对于对象状态的改变。作者在这时举了一个小例子,就是Successor Value模式(书中也叫Functional Object模式,但是没有查到相关资料)。

Scala Patterns(#2) - Lazy initialization

延迟初始化

延迟初始化是程序设计中减少开销、提高性能的一种做法,同时它也是创建型设计模式中的一种。在Effective Java里,Bloch是这么描述延迟初始化的,

Lazy initialization is the act of delaying the initialization of a field until its
value is needed. If the value is never needed, the field is never initialized.

Scala patterns (#1) - Option

自从1994年《设计模式:可复用面向对象软件的基础》问世以来,设计模式就备受关注,虽然业界褒贬不一,而且有人专门写了反模式来陈述其弊端,但大家对它的作用大部分还是认可的,尤其是在面向对象编程领域。但是,正如Brooks所说的“天下没有免费的银弹”,软件的本质问题是管理复杂度,所以能用设计模式解决问题,它必然也会带来衍生问题,工具都有利弊,如何更好地使用工具才是王道。为了减少对设计模式的滥用和简化设计(既然可复用,为什么不直接让语言天生支持呢?),多年以来,人们一直期望在语言层面增加对可复用编程模式(pattern/paradigm)的支持,而这些想法确实也逐渐被多种现代编程语言所采纳。

Talk about DI again

再谈依赖注入

理解了控制反转和依赖注入的基本概念之后,就可以了解一些实际的应用了。在《Java程序员修炼之道》第三章,作者深入剖析了依赖注入的技术背景和应用实例。

主要内容包括:

  1. 控制反转和依赖注入
  2. 掌握依赖注入技术为什么如此重要
  3. JSR-330如何统一了Java中的DI
  4. 常见的JSR-330的注解,如@Inject
  5. Guice 3简介,JSR-330的参考实现

IoC and DI intro

控制反转与依赖注入导读

早年参加工作的时候,大家普遍说,不一定要掌握那么多语言细节,也不一定要学那么多语言,需要的时候查查书、上上网就行了,重要的是“编程思想”。好高级啊!“编程思想”这个当年流行的词儿似乎代表着“高端大气上档次”,似乎意味着掌握编程思想的人都是码农界的高富帅。呃,编程思想,嘛玩意儿?难道就是一系列系统的想法精粹,就像《毛泽东思想》吗?好像不是。后来捧读了巨著《C++编程思想》和《Java编程思想》,也没窥透所谓的思想。后来才觉着,在编程界,英文里可能就不存在思想的准确对应词吧?Idea?Thought?Thinking?Ideology?都不像。

最近在看《Java程序员修炼之道》(我最近是迷上各种“道”了),其中提到了DIP,又激起我重新厘清编程思想的机会。现在想来,编程,或者说程序设计的思想,应该可以归在设计方法学之下,即有了某种方法,按照这种方法去思考问题、构建软件和设计程序,就是这种方法的思想,比如面向过程的设计思想,或面向对象的设计思想。现在,我们也可以说面向组件的设计思想,或者是面向云的设计思想,甚至是用户体验至上的设计思想。我们不自觉地从“编程”思想演进到“设计”思想了,思想总算正本清源,设计需要思想,而编程只是设计的结果。设计在哪儿?设计无处不在。软件设计从需求获取阶段就已经开始,直到程序员编写每一行代码都贯穿始终,只是体现在设计的不同层面而已。所以,程序员的80%的工作都是在设计(Think&Design),而只有20%的时间是在编程(Programming)。