`

Lambda表达式实现设计模式:命令模式

    博客分类:
  • java
 
阅读更多
如何在使用Java 8 Lambda表达式的函数式编程方式时实现命令设计模式。命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化,并提供相应的操作。命令模式是一种通用编程方式,该方式基于运行时决策顺序来执行方法。模式的参与者如下:

命令 :声明用于执行操作的接口。
实体命令 :定义接收者对象和动作的绑定。
客户端 :创建实体命令实例并设置它的接收者。
调用者:控制命令来执行请求。
接收者 :实际完成工作。
这些参与者之间的关系描述如下:



让我们看一个命令模式的具体例子,了解它是如何转换成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
分享到:
评论

相关推荐

    运用lambda表达式+策略模式实现平台业务扩展

    将策略模式进行能力话,可作为jar包引入既可以使用...运用lambda表达式+策略模式+注解等知识点,提供给大家学习,也可将其优化并用于平台建设。对应博客:https://blog.csdn.net/lightj1996/article/details/103656673

    C++ 11 lambda 表达式

    C++ 11引入了lambda表达式,这是一个强大的特性,极大地增强了C++的函数式编程能力。Lambda表达式允许在程序中直接定义匿名函数,并且可以直接在需要的地方使用,无需预先声明。这对于处理回调函数、简化算法实现...

    运用lambda表达式+策略模式实现平台扩展(Extension)

    标题中提到的"运用lambda表达式+策略模式实现平台扩展"是一个非常实用的技术组合,它能够帮助我们构建灵活且可扩展的系统。下面将详细阐述这两个核心概念及其在实际应用中的价值。 **策略模式**是设计模式的一种,...

    Lambda表达式 2008新特性

    观察者模式是设计模式之一,其中Lambda表达式也可以作为事件处理程序,实现对对象状态变化的监听和响应。 总的来说,Lambda表达式是C#中一种强大的工具,它简化了代码,提高了代码的可读性和可维护性。通过使用...

    基于Lambda表达式的SQL语句生成器SqlLink V0.1

    SqlLink的这种设计模式让开发者能够专注于业务逻辑,而不必过多关注SQL语句的编写,提高了开发效率。同时,由于使用了编译时的Lambda表达式,相比字符串拼接的方式,SqlLink能更好地防止SQL注入攻击。 在项目中的`...

    C++11 function 委托机制 观察者模式,适用于界面开发,lambda表达式

    以下是一个简单的例子,展示了如何使用C++11的函数委托和Lambda表达式实现观察者模式: ```cpp #include #include class Subject { public: using Observer = std::function()&gt;; void attach(Observer obs) {...

    Java:解锁Lambda表达式的魔法-从零开始的函数式编程之旅

    通过Lambda表达式,可以在代码中实现类似策略模式的设计,使得程序结构更加灵活,易于维护和扩展。 **示例**: ```java interface Greeting { String greet(String name); } Greeting englishGreeting = name -&gt; ...

    Java Lambda 环绕执行模式.pdf

    环绕执行(Execute Around)模式是一种设计模式,用于在调用某个核心操作前后执行一些通用逻辑,比如日志记录、资源管理等。在传统的Java代码中,如描述中所示的日志记录,需要手动插入条件判断和日志调用,这会增加...

    使用Java 8中的Lambda表达式实现工厂模式

    在Java编程中,工厂模式是一种常用的创建型设计模式,它提供了一种抽象的方式来创建对象,使得客户端无需知道具体的实现类,而是通过一个公共接口来获取对象。在Java 8中,引入了Lambda表达式,这使得工厂模式的实现...

    Java Lambda表达式入门示例

    命令模式是一种设计模式,它将“行为请求者”与“行为实现者”分离,使得系统具有更高的灵活性和可扩展性。在Java中,可以使用匿名内部类或Lambda表达式来实现命令模式。 使用匿名内部类实现命令模式时,需要定义一...

    毕业设计:在线汽车站车票售卖系统,EF框架+T4模板+Lambda表达式+三层设计+MVC.zip

    在线汽车站车票售卖系统是一个综合性的Web应用项目,它采用了EF框架(Entity Framework),T4模板,Lambda表达式,三层架构以及MVC(Model-View-Controller)设计模式。这个项目源码对于学习和实践软件开发,尤其是...

    Java 8中Lambda表达式默认方法的模板.docx

    默认方法允许我们在不破坏向后兼容性的前提下向接口添加新功能。...同时,Lambda表达式让代码看起来更加简洁,而默认方法则为接口提供了扩展功能,两者结合为Java开发者提供了强大的工具来处理各种设计模式。

    Java8 Lambda表达式模板方法实现解析

    模板方法是一种设计模式,它在父类中定义了一个算法的骨架,而允许子类来填充具体的实现。在Java8中,Lambda表达式可以用于实现模板方法,特别是与函数式接口相结合时。函数式接口是指只有一个抽象方法的接口,这样...

    .Net4.0 linq to sql 和lambda表达式的运用

    总的来说,.Net 4.0中的Linq to SQL和Lambda表达式为我们提供了一种更高效、更简洁的数据库编程模式。它们降低了数据库操作的复杂度,提高了代码的可读性,使得开发者可以更专注于业务逻辑,而不是繁琐的数据库操作...

    day07【线程池、Lambda表达式】(1).md

    - **定义**:线程池是一种设计模式,用于管理一组可重用的线程,这些线程预先创建好并在需要时执行任务,从而避免了每次任务执行时都创建新线程的成本。 - **优点**: - 提高响应速度:线程可以复用,减少了创建和...

    C++ Lambda Story

    Lambda表达式允许你直接在表达式中定义函数对象,捕获当前作用域的变量,甚至可以进行显式或隐式的捕获模式。这种特性使得Lambda表达式成为编写回调函数、表达式求值和并发编程的理想工具。 随着C++14和C++17标准的...

    毕业设计:公车派遣系统,EF框架+T4模板+Lambda表达式+三层设计+MVC.zip

    结合“三层设计”,我们可以推测这个系统采用了常见的软件架构模式——业务逻辑层(BLL)、数据访问层(DAL)和表示层(UI),这种设计模式有助于代码的组织和模块化,提高代码的可维护性和复用性。 "MVC"代表Model...

    LtuPatternFactory:最终的Lambda模式工厂:FP,Haskell,Typeclassopedia与软件设计模式

    Lambda表达式是函数式编程的基础,它可以被视为无名函数,通过它们,我们可以构建复杂的功能结构。 Haskell是一种纯函数式编程语言,其核心特性包括静态类型系统、惰性求值和类型类。在这个上下文中,设计模式如...

    尚硅谷-实验:Lambda表达式.pdf

    ·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更丰富、更贴近实战: ·Java语言基础阶段:12720行代码,Java语言高级阶段:...

Global site tag (gtag.js) - Google Analytics