Java语言编程学习之Lambda表达式设计和架构的原则[图]:
你们都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各类各样。可是大多数的Java代码都不是由开发JDK的程序猿写的,而是像咱们这样的普通程序猿。
不少人都会碰到过这样的状况:你实现了一个新功能或修复了一个缺陷,而且对本身的修改很满意。但其余人看了你的代码后——也许发生在代码审查环节,彻底不买帐!对于什么是好代码,什么是坏代码,存在分歧很正常!
设计模式的改变
设计模式是人们熟悉的另外一种设计思想,它是软件架构中解决通用问题的模板。若是碰到一个问题,而且刚好熟悉一个与之适应的模式,就能直接应用该模式来解决问题。从某种程度上来讲,设计模式将解决特定问题的最佳实践途径固定了下来。
固然的了,没有永远的最佳实践。以曾经风靡一时的单例模式为例,该模式确保只产生一个对象实例。在过去十年中,人们批评它让从新变得更脆弱,且难于测试。敏捷开发的流行,让测试显得更加剧要,单例模式的这个问题把它变成了一个反模式:一种应该避免使用的模式。
因此咱们应该知道的是,正确的使用Lambda表达式,让现有的设计模式变得更好、更简单,或者在某些状况下,有了不一样的实现方式。
常见的一些设计模式:
命令者模式:
命令者是一个对象,它封装了调用另外一个方法的全部细节,命令者模式使用该对象,能够编写出根据运行期条件,顺序调用方法的通常化代码。命令者模式中有四个类参与其中,如图:
2.策略模式:
策略模式能在运行时改变软件的算法行为。如何实现策略模式根据你的状况而定,但其主要思想是定义一个通用的问题,可是不一样的算法来实现,而后将这些算法都封装在一个统一接口的背后。
文件压缩就是一个很好的例子:
3.观察者模式:
观察者模式是另外一种可被Lambda表达式简化和改进的行为模式。在观察者模式中,被观察者持有一个观察者列表。当被观察者的状态发生改变,会通知观察者。观察者模式被大量应用于基于MVC的GUI工具中,以此让模型状态发生变化时,自动刷新视图模块,达到两者之间的解耦。
4.模板方法模式:html
开发软件时一个常见的状况是有一个通用的方法,只是步骤上略有不一样,咱们但愿不一样的实现可以遵照通用模式,保证他们使用了同一个算法,也是为了让代码更加易读。窗边的小豆豆(http://www.simayi.net/dushubiji/6111.html)读书笔记摘抄好词好句及感悟赏析,一旦你从总体上理解了算法,就能更容易理解其各类表现。
模板方法模式是为这些状况而设计的:总体算法的设计是一个抽象类,它有一系列抽象方法,表明算法中可被定制的步骤,同时这个类中包含了一些通用代码。算法的每个变种由具体的类实现,它们重写了抽象方法,提供了相应的实现。
使用Java编写DSL
领域专用语言(DSL)是针对软件系统中某特定部分的编程语言。他们一般比较小巧,表达能力也不如Java这样能应对大多数编程任务的通用语言强。DSL高度专用:不求画面俱到,但求有所专长。
Java BDD框架:下面的例子描述了一个Stack的某些行为。
(左右滑动能够查看)
public class StackSpec{{
describe("a stack", it -> {
it.should("be empty when created",expect -> {
expect.that(new Stack()).isEmpty();
});
it.should("push new elementsonto the top of the stack", expect -> {
Stack<Integer> stack = new Stack<>();
stack.push(1);
expect.that(stack.get(0)).isEqualTo(1);
});
it.should("pop the last element pushed onto the stack", expect -> {
Stack<Integer> stack = new Stack<>();
stack.push(2);
stack.push(1);
expect.that(stack.pop()).isEqualTo(2);
});
});
}):
首先咱们使用动词 describe 为套件起头,而后定义一个名字代表这是描述什么东西的行为,这里咱们使用了 "a stack"。
每一条规则读起来尽量接近英语中的句子。它们均以 it.should 开头,其中 it 指正在描述的对象。而后用一句简单的英语描述行为,最后使用 expect.that作前缀,描述期待的行为。
检查规则时,会从命令行获得一个简单的报告,代表是否有规则失败。你会发现 pop 操做指望的返回值是 2,而不是 1,所以“pop the last element pushed onto the stack” 这条规则就失败了:
a stack
should pop the last element pushed onto the stack[expected: but was: ]
should be empty when created
should push new element onto the top of the stack
好了,咱们本期就到这里了!再见!算法