用Lambdas重构策略设计模式

栏目: 后端 · 发布时间: 5年前

内容简介:策略模式是表示一系列算法的通用解决方案,并允许您在运行时选择它们。您可以将此模式应用于多种方案,例如使用不同的解析方式或格式化输入来验证具有  不同条件的输入。假设我们验证文本输入是否针对不同的标准进行了适当的格式化(例如,它只包含小写字母或数字)。首先定义一个接口来验证文本(表示为String):

策略模式是表示一系列算法的通用解决方案,并允许您在运行时选择它们。您可以将此模式应用于多种方案,例如使用不同的解析方式或格式化输入来验证具有  不同条件的输入。

策略设计模式:不使用Lambda表达式

假设我们验证文本输入是否针对不同的标准进行了适当的格式化(例如,它只包含小写字母或数字)。首先定义一个接口来验证文本(表示为String):

 <b>interface</b> ValidationStrategy {
        <b>public</b> <b>boolean</b> execute(String s);
    }

其次,让我们定义该接口的一个或多个实现:

pulic <b>class</b> IsAllLowerCase implements ValidationStrategy {
      <b>public</b> <b>boolean</b> execute(String s){
          <b>return</b> s.matches(<font>"[a-z]+"</font><font>);
      }
}
pulic <b>class</b> IsNumeric implements ValidationStrategy {
      <b>public</b> <b>boolean</b> execute(String s){
          <b>return</b> s.matches(</font><font>"\\d+"</font><font>);
      }
}
</font>

我们在程序中使用这些不同的验证策略。

 <b>public</b> <b>class</b> Validator{
        <b>private</b> <b>final</b> ValidationStrategy strategy;
        <b>public</b> Validator(ValidationStrategy v){
            <b>this</b>.strategy = v;
        }
        <b>public</b> <b>boolean</b> validate(String s){
            <b>return</b> strategy.execute(s); }
    }

让我们使用main方法测试这个Pattern。

<b>public</b> <b>static</b> <b>void</b> main(String[] args) {
        <font><i>// old school</i></font><font>
        Validator v1 = <b>new</b> Validator(<b>new</b> IsNumeric());
        System.out.println(v1.validate(</font><font>"aaaa"</font><font>));
        Validator v2 = <b>new</b> Validator(<b>new</b> IsAllLowerCase ());
        System.out.println(v2.validate(</font><font>"bbbb"</font><font>));

  }
</font>

请注意,为了应用lambda表达式, Strategy 接口应该是   Functional Interfaces

策略设计模式:使用Lambda表达式

到目前为止,我们应该认识到 ValidationStrategy 是一个函数 接口 (此外,它具有与Predicate <String>相同的函数描述符)。这意味着我们可以直接传递lambda表达式,而不是声明新类来实现不同的策略,这些表达式更简洁:

<font><i>// with lambdas</i></font><font>
 Validator v3 = <b>new</b> Validator((String s) -> s.matches(</font><font>"\\d+"</font><font>));
 System.out.println(v3.validate(</font><font>"aaaa"</font><font>));
 Validator v4 = <b>new</b> Validator((String s) -> s.matches(</font><font>"[a-z]+"</font><font>));
 System.out.println(v4.validate(</font><font>"bbbb"</font><font>));
</font>

如您所见,lambda表达式删除了策略 设计模式 固有的样板代码。如果你考虑一下,lambda表达式封装了一段代码(或策略),这就是创建策略设计模式的原因,所以 我建议你使用lambda表达式代替类似的问题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能家居:商业模式+案例分析+应用实战

智能家居:商业模式+案例分析+应用实战

陈国嘉 / 人民邮电出版社 / 2016-4 / 49.80元

作为万物互联的关键一环,智能家居的出现和普及已经势不可当,以移动互联网为核心的新技术正在重构智能家居。只有成为智能家居行业的先行者,才能抢占“风口”。 《智能家居:商业模式+案例分析+应用实战》紧扣“智能家居”,从3个方面进行专业、深层次的讲解。首要方面是基础篇,从智能家居的发展现状、产业链、商业分析、抢占入口等方面进行阐述,让读者对智能家居有个初步的认识;第二个方面是技术篇,从智能家居的控......一起来看看 《智能家居:商业模式+案例分析+应用实战》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具