没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
32页
在JAVA编程中,设计和架构原则是非常重要的,它们确保代码的可维护性、可扩展性、可重用性和可测试性。本文将探索如何使用 Lambda 表达式实现 SOLID 原则,该原则是开发良好面向对象程序的准则。使用 Lambda 表达式,还能改进一些现有的设计模式。另外,将会给出一些良好的设计原则和模式,在此基础之上,就能开发出可维护且十分可靠的程序。在本文中不光会用到 JDK 提供的崭新类库,而且会教大家如何在自己的领域和应用程序中使用 Lambda 表达式。
资源推荐
资源详情
资源评论
1
设计和架构的原则 |
JAVA编程中的设计和架构原则
本文将探索如何使用
Lambda
表达式实现
SOLID
原则,该原则是开发良
好面向对象程序的准则。使用
Lambda
表达式,还能改进一些现有的设
计模式
。另外,本文将会给出一些良好的设计原则和模式,在此基础之
上,就能开发出可维护且十分可靠的程序。我们不光会用到
JDK
提供的
崭新类库,而且会教大家如何在自己的领域和应用程序中使用
Lambda
表达式。
1
Lambda
表达式改变了设计模式
设计模式是人们熟悉的另一种设计思想,它是软件架构中解决通用问题
的模板。如果碰到一个问题,并且恰好熟悉一个与之适应的模式,就能
直接应用该模式来解决问题。从某种程度上来说,设计模式将解决特定
问题的最佳实践途径固定了下来。
当然,没有永远的最佳实践。以曾经风靡一时的单例模式为例,该模式
确保只产生一个对象实例。在过去十年中,人们批评它让程序变得更脆
弱,且难于测试。敏捷开发的流行, 让测试显得更加重要,单例模式的
这个问题把它变成了一个反模式:一种应该避免使用的模式。
本书的重点并不是讨论设计模式如何变得过时,相反,我们讨论的是如何
使用
Lambda
表
达式,让现有设计模式变得更好、更简单,或者在某
些情况下,有了不同的实现方式。Java 8
引入的新语言特性是所有这些
设计模式变化的推动因素。
1.1命令者模式
命令者是一个对象,它封装了调用另一个方法的所有细节,命令者模式
使用该对象,可以编写出根据运行期条件,顺序调用方法的一般化代码
。命令者模式中有四个类参与其中,
如图
1
所示。
2
设计和架构的原则 |
图 1:命令者模式
· 命令接收者
执行实际任务。
• 命令者
封装了所有调用命令执行者的信息。
• 发起者
控制一个或多个命令的顺序和执行。
• 客户端
创建具体的命令者实例。
看一个命令者模式的具体例子,看看如何使用
Lambda
表达式改进该
模式。假设有一个
GUI
Editor 组件,在上面可以执行 open、save 等一系
列操作,如例
1
所示。现在我们想
实现宏功能——也就是说,可以将一
系列操作录制下来,日后作为一个操作执行,这就是我们的命令接收者。
发起者
调用
命令者
创
建
实现
使用
客户端
调用
命令接收者
具体
命令者
例
1
文本编辑器可能具有的一般功能
3
设计和架构的原则 |
public interface
Editor
{
public void
save();
public void
open();
public void
close();
}
在该例子中,像 open、save 这样的操作称为命令,我们需要一个统一
的接口来概括这些不同的操作,我将这个接口叫作 Action,它代表了
一个操作。所有的命令都要实现该接口
(例
1-2
)。
public interface
Action {
public void
perform();
}
现在让每个操作都实现该接口,这些类要做的只是在 Action 接口中调用
Editor 类中的一
个方法。我将遵循恰当的命名规范,用类名代表操作
,比如save 方法对应 Save 类。例
3
和例
4
是定义好的命令对象。
public class
Save implements Action
{
private final
Editor editor;
public
Save(Editor editor) {
例
1-2
所有操作均实现 Action 接口
例
3
保存操作代理给 Editor 方法
4
设计和架构的原则 |
this.editor = editor;
}
@Override
public void
perform()
{
editor.save();
}
}
public class
Open
implements
Action {
private final
Editor editor;
public
Open(Editor editor) {
this
.editor = editor;
}
@Override
public void
perform()
{
editor.open();
}
}
现在可以实现 Macro 类了,该类 record 操作,然后一起运行。我们使
用 List 保存操作序
列,然后调用 forEach 方法按顺序执行每一个
Action,例
5
就是我们的命令发起者。
public class
Macro {
private final
List<Action> actions;
public
Macro() {
actions = new ArrayList<>();
}
public void
record(Action action)
{
actions.add(action);
}
public void
run() {
actions.forEach(Action::perform
);
}
}
在构建宏时,将每一个命令实例加入 Macro 对象的列表,然后运行宏,
例
8-4
打开文件操作代理给 Editor 方法
例
5
包含操作序列的宏,可按顺序执行操作
5
设计和架构的原则 |
就会按顺序执行每一条命令。我是个“懒惰的”程序员,喜欢将通用的工
作流定义成宏。我说“懒惰”了
吗?我的意思其实是提高工作效率。例
6
展示了如何在用户代码中使用 Macro 对象。
Macro macro =
new
Macro();
macro.record(
new
Open(editor));
macro.record(
new
Save(editor));
macro.record(
new
Close(editor));
macro.run();
Lambda
表达式能做点什么呢?事实上,所有的命令类,Save、Open 都
是
Lambda
表达式,
只是暂时藏在类的外壳下。它们是一些行为,我
们通过创建类将它们在对象之间传递。Lambda
表达式能让这个模式变
得非常简单,我们可以扔掉这些类。例
7
展示了去掉命令类,使用
Lambda
表达式后的程序。
例
7
使用
Lambda
表达式构建宏
Macro macro =
new
Macro();
macro.record(() -> editor.open());
macro.record(() -> editor.save());
macro.record(() ->
editor.close()); macro.run();
事实上 ,如果意识到这些
Lambda
表达式的作用只是调用了一个方法,
还能让问题变得更简单。我们可以使用方法引用将命令和宏对象关联起
来(如例
8
所示)。
例
8
使用方法引用构建宏
Macro macro =
new
Macro();
macro.record(editor::open)
;
macro.record(editor::save)
;
macro.record(editor::close
); macro.run();
命令者模式只是一个可怜的程序员使用
Lambda
表达式的起点。使用
例
6
使用命令者模式构建宏
剩余31页未读,继续阅读
资源评论
icysmile131
- 粉丝: 3659
- 资源: 156
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 使用ASP.NET Core和Entity Framework Core来构建一个基本的进销存系统.rar
- 深度学习经典数据集+FER2013面部表情识别+附带使用方法的python代码
- Python中,要实现连接多个相机并识别多个二维码.rar
- 使用FFT算法对一个信号进行分析.rar
- 171cms游戏应用下载系统源码.zip
- 基于jsp+servlet+mysql蛋糕甜品店购物网站源码+数据库(期末大作业).zip
- Java项目:在线蛋糕商城系统(java+jsp+mysql)源码+数据库+期末大作业.zip
- ZapyaClient10_7-1.apk
- 织梦cms站长导航网站源码.zip
- 基于SSM+MySQL的网络投票调查问卷系统源码+数据库(java期末大作业).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功