- 浏览: 39626 次
文章分类
最新评论
如何在使用Java 8 Lambda表达式的函数式编程方式时实现命令设计模式。命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化,并提供相应的操作。命令模式是一种通用编程方式,该方式基于运行时决策顺序来执行方法。模式的参与者如下:
命令 :声明用于执行操作的接口。
实体命令 :定义接收者对象和动作的绑定。
客户端 :创建实体命令实例并设置它的接收者。
调用者:控制命令来执行请求。
接收者 :实际完成工作。
这些参与者之间的关系描述如下:
让我们看一个命令模式的具体例子,了解它是如何转换成lambda表达式的。假定我们有一个文件系统工具,所有动作都依赖它,例如打开文件,向文件写入和关闭文件。这可以实现宏功能 ,即一系列的操作可以被记录下来,之后作为一个单独操作执行。下面是我们的接收者。
每个操作都是命令,例如openFile和writeFile。我们可以创建一个通用命令接口来适配这些不同的操作。让我们将接口命名为Action,因为在我们的情境下,它代表执行一个操作。所有命令对象都需要实现这个接口。
现在,让我们为每个操作实现Action接口。所有这些类需要做的就是调用FileReceiver的一个方法,并将这个调用封装到Action接口中。在封装操作后,使用适当的类命名规范来命名这些类。因此,openFile方法对象的类称为OpenFile。
现在,我们实现Macro类。每个宏包含一个动作序列,该序列可以依次执行动作,它将作为调用者。这个类可以记录动作,并一起运行。我们可以将动作序列存储在列表中,然后反复地获取每个动作来执行。
当填充宏对象时,我们可以添加每个命令的实例,这些实例也会被记录在宏对象里。现在简单的运行宏对象,每个命令将依次执行。我们的客户端代码如下。
如果你跟着我的思路读到这里,你会好奇lambda表达式如何适配这些的。实际上,所有命令类,例如OpenFile、WriteFile和CloseFile,其实只是lambda表达式想打破它们的封装。这些命令类只是在类之间传递。使用lambda表达式整个模式得到大大的简化,因为我们完全可以废除这些类。然我们看看宏类(客户端)使用lambda表达式代替命令类的效果。
如果能够意识到每个lambda表达式都在执行一个单独的方法调用,可以进一步改进。因此,可以直接使用方法引用。
命令模式易于扩展,新的动作方法可以被添加到接收者中来创建新的命令实现,这样不需要改变任何客户端代码。JDK中的Runnable接口(java.lang.Runnable)是命令模式常用的流行接口。这篇博客中,我试着阐述带Java 8 lambda表达式的命令模式。你可以看到使用lambda表达式,少了很多样板代码,从而让代码变得更整洁。
原文链接: javacodegeeks 翻译: ImportNew.com - liken
译文链接: http://www.importnew.com/16789.html
命令 :声明用于执行操作的接口。
实体命令 :定义接收者对象和动作的绑定。
客户端 :创建实体命令实例并设置它的接收者。
调用者:控制命令来执行请求。
接收者 :实际完成工作。
这些参与者之间的关系描述如下:
让我们看一个命令模式的具体例子,了解它是如何转换成lambda表达式的。假定我们有一个文件系统工具,所有动作都依赖它,例如打开文件,向文件写入和关闭文件。这可以实现宏功能 ,即一系列的操作可以被记录下来,之后作为一个单独操作执行。下面是我们的接收者。
public interface FileSystemReceiver { void openFile(); void writeFile(); void closeFile(); }
每个操作都是命令,例如openFile和writeFile。我们可以创建一个通用命令接口来适配这些不同的操作。让我们将接口命名为Action,因为在我们的情境下,它代表执行一个操作。所有命令对象都需要实现这个接口。
public interface Action { public void perform(); }
现在,让我们为每个操作实现Action接口。所有这些类需要做的就是调用FileReceiver的一个方法,并将这个调用封装到Action接口中。在封装操作后,使用适当的类命名规范来命名这些类。因此,openFile方法对象的类称为OpenFile。
public class OpenFile implements Action { private final FileReceiver fileReceiver; public OpenFile(FileReceiver fileReceiver) { this.fileReceiver = fileReceiver; } public void perform() { fileReceiver.openFile(); } }
现在,我们实现Macro类。每个宏包含一个动作序列,该序列可以依次执行动作,它将作为调用者。这个类可以记录动作,并一起运行。我们可以将动作序列存储在列表中,然后反复地获取每个动作来执行。
public class Macro { private final List actions; public Macro() { actions = new ArrayList<>(); } public void record(Action action) { actions.add(action); } public void run() { actions.forEach(Action::perform); } }
当填充宏对象时,我们可以添加每个命令的实例,这些实例也会被记录在宏对象里。现在简单的运行宏对象,每个命令将依次执行。我们的客户端代码如下。
Macro macro = new Macro(); macro.record(new OpenFile(fileReceiver)); macro.record(new WriteFile(fileReceiver)); macro.record(new CloseFile(fileReceiver)); macro.run();
如果你跟着我的思路读到这里,你会好奇lambda表达式如何适配这些的。实际上,所有命令类,例如OpenFile、WriteFile和CloseFile,其实只是lambda表达式想打破它们的封装。这些命令类只是在类之间传递。使用lambda表达式整个模式得到大大的简化,因为我们完全可以废除这些类。然我们看看宏类(客户端)使用lambda表达式代替命令类的效果。
Macro macro = new Macro(); macro.record(() -> fileReceiver.openFile()); macro.record(() -> fileReceiver.writeFile()); macro.record(() -> fileReceiver.closeFile()); macro.run();
如果能够意识到每个lambda表达式都在执行一个单独的方法调用,可以进一步改进。因此,可以直接使用方法引用。
Macro macro = new Macro(); macro.record(fileReceiver::openFile); macro.record(fileReceiver::writeFile); macro.record(fileReceiver::closeFile); macro.run();
命令模式易于扩展,新的动作方法可以被添加到接收者中来创建新的命令实现,这样不需要改变任何客户端代码。JDK中的Runnable接口(java.lang.Runnable)是命令模式常用的流行接口。这篇博客中,我试着阐述带Java 8 lambda表达式的命令模式。你可以看到使用lambda表达式,少了很多样板代码,从而让代码变得更整洁。
原文链接: javacodegeeks 翻译: ImportNew.com - liken
译文链接: http://www.importnew.com/16789.html
发表评论
-
JVM内存结构及分析
2017-07-16 19:38 565JVM内存模型 名称特征 ... -
JVM调优实例
2017-06-24 12:30 01.背景:由于最近上线新增业务模块,业务量要增加所以对上线服务 ... -
音视频编码转换-ffmpeg
2016-12-30 18:42 15801.前言 由于最近在做ios与android端需要做a ... -
git did not match any file(s) known to git
2016-04-23 23:49 31191.did not match any file(s) kno ... -
Static工具类线程安全问题
2016-01-08 11:39 23481.静态方法 无论是静态方法还是实例方法,在内存中都只 ... -
JavaThread-ThreadLocal笔记
2015-12-23 14:54 5331.ThreadLocal简介 早在JDK 1.2的版本中就提 ... -
JUC-CountDownLatch笔记
2015-12-23 10:53 5631.CountDownLatch简介 CountDownLat ... -
mysql 错误汇总
2015-08-12 16:49 4361.Mysql ERROR 1045 (28000): Acc ... -
Java注解
2015-08-07 11:25 01.@Retention(RetentionPolicy.RU ... -
Base64 编解码 工具类
2015-07-28 22:48 42871.工具类: import java.io.Uns ... -
HttpClient(发送字符串,multipart, 参数等)
2015-07-10 11:12 2084备注:httpclient4.5 发送MultiPart/Pa ... -
转载-搜索引擎实时秒级更新
2015-07-08 14:02 859搜索是很多用户在天 ... -
tomcat-定时任务
2015-03-30 15:27 6571.监听类 import java.util.Timer ... -
JVM-工作原理
2015-03-16 23:26 644一、 JVM的生命周期 1. J ... -
tomcat-启动时启动额外线程并控制线程状态
2015-02-04 18:22 675通过启动线程可以进行后台的操作 1.创建servlet ... -
Exception in thread "main" SoapFault - faultcode: 'soapenv:Server.userException'
2015-01-20 22:32 14281.抛出此类错误大部分都是服务端发布webservice调用出 ... -
Tomcat映射虚拟目录
2015-01-19 22:43 01.设置虚拟目录 <Host>标签</H ... -
android-运行java main方法
2014-12-30 16:10 7191.右键入口类(含有Main方法的)Run Configura ... -
Mybatis 常见错误汇总
2014-12-28 22:31 01.插入数据到数据库是异常 ### Cause: java.s ... -
jsoup
2014-12-17 00:25 01. package com.wuhao.itinfo ...
相关推荐
将策略模式进行能力话,可作为jar包引入既可以使用...运用lambda表达式+策略模式+注解等知识点,提供给大家学习,也可将其优化并用于平台建设。对应博客:https://blog.csdn.net/lightj1996/article/details/103656673
C++ 11引入了lambda表达式,这是一个强大的特性,极大地增强了C++的函数式编程能力。Lambda表达式允许在程序中直接定义匿名函数,并且可以直接在需要的地方使用,无需预先声明。这对于处理回调函数、简化算法实现...
标题中提到的"运用lambda表达式+策略模式实现平台扩展"是一个非常实用的技术组合,它能够帮助我们构建灵活且可扩展的系统。下面将详细阐述这两个核心概念及其在实际应用中的价值。 **策略模式**是设计模式的一种,...
观察者模式是设计模式之一,其中Lambda表达式也可以作为事件处理程序,实现对对象状态变化的监听和响应。 总的来说,Lambda表达式是C#中一种强大的工具,它简化了代码,提高了代码的可读性和可维护性。通过使用...
SqlLink的这种设计模式让开发者能够专注于业务逻辑,而不必过多关注SQL语句的编写,提高了开发效率。同时,由于使用了编译时的Lambda表达式,相比字符串拼接的方式,SqlLink能更好地防止SQL注入攻击。 在项目中的`...
以下是一个简单的例子,展示了如何使用C++11的函数委托和Lambda表达式实现观察者模式: ```cpp #include #include class Subject { public: using Observer = std::function()>; void attach(Observer obs) {...
通过Lambda表达式,可以在代码中实现类似策略模式的设计,使得程序结构更加灵活,易于维护和扩展。 **示例**: ```java interface Greeting { String greet(String name); } Greeting englishGreeting = name -> ...
环绕执行(Execute Around)模式是一种设计模式,用于在调用某个核心操作前后执行一些通用逻辑,比如日志记录、资源管理等。在传统的Java代码中,如描述中所示的日志记录,需要手动插入条件判断和日志调用,这会增加...
在Java编程中,工厂模式是一种常用的创建型设计模式,它提供了一种抽象的方式来创建对象,使得客户端无需知道具体的实现类,而是通过一个公共接口来获取对象。在Java 8中,引入了Lambda表达式,这使得工厂模式的实现...
命令模式是一种设计模式,它将“行为请求者”与“行为实现者”分离,使得系统具有更高的灵活性和可扩展性。在Java中,可以使用匿名内部类或Lambda表达式来实现命令模式。 使用匿名内部类实现命令模式时,需要定义一...
在线汽车站车票售卖系统是一个综合性的Web应用项目,它采用了EF框架(Entity Framework),T4模板,Lambda表达式,三层架构以及MVC(Model-View-Controller)设计模式。这个项目源码对于学习和实践软件开发,尤其是...
默认方法允许我们在不破坏向后兼容性的前提下向接口添加新功能。...同时,Lambda表达式让代码看起来更加简洁,而默认方法则为接口提供了扩展功能,两者结合为Java开发者提供了强大的工具来处理各种设计模式。
模板方法是一种设计模式,它在父类中定义了一个算法的骨架,而允许子类来填充具体的实现。在Java8中,Lambda表达式可以用于实现模板方法,特别是与函数式接口相结合时。函数式接口是指只有一个抽象方法的接口,这样...
总的来说,.Net 4.0中的Linq to SQL和Lambda表达式为我们提供了一种更高效、更简洁的数据库编程模式。它们降低了数据库操作的复杂度,提高了代码的可读性,使得开发者可以更专注于业务逻辑,而不是繁琐的数据库操作...
- **定义**:线程池是一种设计模式,用于管理一组可重用的线程,这些线程预先创建好并在需要时执行任务,从而避免了每次任务执行时都创建新线程的成本。 - **优点**: - 提高响应速度:线程可以复用,减少了创建和...
Lambda表达式允许你直接在表达式中定义函数对象,捕获当前作用域的变量,甚至可以进行显式或隐式的捕获模式。这种特性使得Lambda表达式成为编写回调函数、表达式求值和并发编程的理想工具。 随着C++14和C++17标准的...
结合“三层设计”,我们可以推测这个系统采用了常见的软件架构模式——业务逻辑层(BLL)、数据访问层(DAL)和表示层(UI),这种设计模式有助于代码的组织和模块化,提高代码的可维护性和复用性。 "MVC"代表Model...
Lambda表达式是函数式编程的基础,它可以被视为无名函数,通过它们,我们可以构建复杂的功能结构。 Haskell是一种纯函数式编程语言,其核心特性包括静态类型系统、惰性求值和类型类。在这个上下文中,设计模式如...
·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更丰富、更贴近实战: ·Java语言基础阶段:12720行代码,Java语言高级阶段:...