Week3 总结 + 作业
总结
本周主题是设计模式。在Java的世界里,提到模式有两大经典,一个是GoF经典设计模式中提出的3类23种模式,另一个是Flower的企业应用模式。课程中,老师主要是用一个Hive项目和JUnit为示例,重点讲解策略模式,模板模式,并穿插Adapter,Decrator等常见模式。
模式分类
模式是对特定问题的已验证的可复用解决方案。模式的目的都是为了构造高内聚低耦合的软件。一个模式复用次数越多,越有价值,在正确场景下使用,也越安全可靠。
构建模式
早年间一个常见面试题“Java中说出几种除了使用new关键字以外的对象创建方法”就是考察此类模式。当然,还有一种方法就是反序列化,这个是在单例模式里的一个考点,如何防范反序列化攻击。言归正传,简单工厂和工厂方法是最常见的构建模式,此外,还有Builder模式用来构造复杂对象和实现DSL。
结构模式
结构模式是用来处理类之间的依赖关系的模式。在类关系的结构上实现OCP等原则。典型的模式有课程中的Composite模式等。
行为模式
行为模式是从类的行为方面来做隔离,以便达到高内聚低耦合的目的。比如Adapter就是典型的行为模式,其目的是转换使用者期望的接口和实际服务提供者的接口,这样使用者只是依赖于Adapter,而可以有多种服务提供者,即便它们没有统一的接口,但是只要能提供所期望的行为就可以为使用者提供服务,而使用者只是依赖Adapter提供的统一接口。
重构与模式
课程中提到重构Hive中接入PSQL的解析器的实列。我理解原来的POC采用的是经典的编译器构造方法,用递归下降构造的非左递归文法编译器。类似龙书的实现,在递归下降的过程中同时实现了编译模式,以至于违反了SRP,进而违反OCP。老师展示了重构的技巧,就是分离了parsing和traverse两个阶段,将其改造为现代编译器的结构,即词法分析,语法分析,语义分析,转换既中间代码生成,优化,目标代码生成。因该项目的特殊性,其实只需要AST转换即可。重构过程主要是在语法分析得到AST后,在traverse的过程中通过visitor+decrator模式来实现上下文无关文法的编译模式。Antlr则提供另一种实现。在traverse的过程中产生event,于是通过template+observe模式实现语义分析处理。
至于JUnit,可以参考其作者Kent Beck的文章学习模式的应用,http://junit.sourceforge.net/doc/cookstour/cookstour.htm。
作业
手写线程安全懒加载单例模式
很久没写Java代码了,所以来个有逼格的实现。当然,Java5以后更完美的方式是用enum来实现单例,可以做到懒加载,线程安全,防序列化攻击的优点。这里主要是体现线程安全的处理。Java5以后volatile关键字保证了可见性,使得double checking不会因指令重排而失效,于是Java5之前的错误实现,加上volatile修饰符后,就变得正确了。
组合模式实现
多么亲切的示例啊,让我回想起写Delphi VCL和Java Swing的日子。
版权声明: 本文为 InfoQ 作者【林毋梦】的原创文章。
原文链接:【http://xie.infoq.cn/article/43be52188b751eaf473c67cdf】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论