zoukankan      html  css  js  c++  java
  • 基于 普通及Lambda方式实现策略模式

    什么是策略模式

    策略模式代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案。比如如何使用不同的条件(比如苹果的重量,或者颜色 )来筛选库存中的苹果。你可以将这一模式应用到更广泛的领域 ,比如使用不同的标准
    来验证输入的有效性,使用不同的方式来分析或者格式化输入。

    策略 式包含三部分内容

    • 一个代表某个算法的接口(它是策略 式的接口)。
    • 一个或多个该接口的具体实现,它们代表了算法的多种实现(比如,实体类Concrete- StrategyA或者ConcreteStrategyB)。
    • 一个或多个使用策略对象的客户。

    如下图所示:

    我们假设你希望验证输入的内容是否根据标准进行了恰当的格式化(比如只包含小写字 或

    数字)。你可以从定义一个验证文本(以String的形式表示)的接口入手:

    /**
     * @desctiption:
     * @author: yinghuaYang
     * @date: 2019/1/8
     */
    
    public interface ValidationStrategy {
        boolean execute(String s);
    }
    

    其次,你定义了该接口的一个或多个具体实现:

    实现1:IsAllLowerCase

    /**
     * @desctiption:
     * @author: yinghuaYang
     * @date: 2019/1/8
     */
    
    public class IsAllLowerCase implements ValidationStrategy {
        @Override
        public boolean execute(String s) {
            return s.matches("[a-z]+");
        }
    }
    

    实现2:IsNumeric

    **
     * @desctiption:
     * @author: yinghuaYang
     * @date: 2019/1/8
     */
    
    public class IsNumeric implements ValidationStrategy {
    
        @Override
        public boolean execute(String s) {
            return s.matches("\d+");
        }
    }
    

    之后,你就可以在你的程序中使用这些略有差异的验证策略了:

    /**
     * @desctiption:
     * @author: yinghuaYang
     * @date: 2019/1/8
     */
    
    public class Validator {
        private final ValidationStrategy strategy;
    
        public Validator(ValidationStrategy v) {
            this.strategy = v;
        }
    
        public boolean validate(String s) {
            return strategy.execute(s);
        }
    
        public static void main(String[] args) {
            Validator numericValidator = new Validator(new IsNumeric());
            boolean b1 = numericValidator.validate("aaaa");
            System.out.println("b1: " + b1); // 返回false
    
            Validator lowerCaseValidator = new Validator(new IsAllLowerCase());
            boolean b2 = lowerCaseValidator.validate("bbbb");
            System.out.println("b2: " + b2); // 返回true
    }
    
    

    使用Lambda表达式

    到现在为止,你应该已经意识到ValidationStrategy是一个函数接口了( 此之外,它 还与Predicate具有同样的函数描述)。这意味着我们不需要声明新的类来实现不同的策略,通过直接传递Lambda表达式就能达到同样的目的,并且还更简洁 :

    基于java8 lambda方式改造如下:

    package java8.java8example.dir策略模式;
    
    /**
     * @desctiption:
     * @author: yinghuaYang
     * @date: 2019/1/8
     */
    
    
    public class Validator {
    
        private final ValidationStrategy strategy;
    
        public Validator(ValidationStrategy v) {
            this.strategy = v;
        }
    
        public boolean validate(String s) {
            return strategy.execute(s);
        }
    
        public static void main(String[] args) {
            // 使用lambda表达式改造后如下
            Validator numericValidator2 = new Validator((String s) -> s.matches("\d+"));
            boolean b11 = numericValidator2.validate("aaaa");
            System.out.println("b11: "+ b11); // 返回false
    
            ///Validator lowerCaseValidator2 = new Validator((String s) -> s.matches("[a-z]+"));
            /// 直接省略String也可以
            Validator lowerCaseValidator2 = new Validator((s) -> s.matches("[a-z]+"));
            boolean b22 = lowerCaseValidator2.validate("bbbb");
            System.out.println("b22: " + b22); // 返回true
    
        }
    }
    

    正如你看到的,Lambda表达式避免了采用策略设计模式时僵化的模板代码。如果你仔细分析一下个中缘由,可能会发现,Lambda表达式实际已经对部分代码(或策略)进行了封装,而这就是创建策略设计模式的初衷。

    因此,强烈建议对类似的问题,应该尽量使用Lambda表达式来解决。

    我的新博客连接: https://www.itaofly.com

  • 相关阅读:
    httpwebrequest详解【转】
    javascript中event.keycode大全
    public void Delete<T>(List<T> EntityList) where T : class, new() 这是什么意思
    Vue(基础五)_vue中用ref和给dom添加事件的特殊情况
    Vue(基础四)_总结五种父子组件之间的通信方式
    Vue(基础三)_监听器与计算属性
    vue(基础二)_组件,过滤器,具名插槽
    vue(基础一)_基本指令的使用
    JS(基础)_总结获取页面中元素和节点的方式
    node.js(node.js+mongoose小案例)_实现简单的注册登录退出
  • 原文地址:https://www.cnblogs.com/yangyinghua/p/10240364.html
Copyright © 2011-2022 走看看