设计模式----策略模式(函数式编程实现)

策略模式

策略模式可以分为三个部分:

  1. 策略模式的算法接口
  2. 策略模式的实现类–具体的那种算法
  3. 调用者
    设计模式----策略模式(函数式编程实现)

普通方式实现策略模式:

算法接口:

package com.tangbaobao.java8.designer;

/**
 * @author tangxuejun
 * @version 2018/9/26 12:25 PM
 */
public interface ValidateStrategy {
    boolean execute(String s);
}

实现类:

实现类1:

package com.tangbaobao.java8.designer;

/**
 * @author tangxuejun
 * @version 2018/9/26 12:30 PM
 */
public class IsAllowLowerCase implements ValidateStrategy{
    @Override
    public boolean execute(String s) {
        return s.matches("[a-z]+");
    }
}

实现类2:

package com.tangbaobao.java8.designer;

/**
 * @author tangxuejun
 * @version 2018/9/26 12:32 PM
 */
public class IsNumeric implements ValidateStrategy {
    @Override
    public boolean execute(String s) {
        return s.matches("\\d+");
    }
}

对外接口:

package com.tangbaobao.java8.designer;


/**
 * @author tangxuejun
 * @version 2018/9/26 12:33 PM
 */
public class Validatator {
    private ValidateStrategy validateStrategy;
    //注入策略接口
    public Validatator(ValidateStrategy validateStrategy) {
        this.validateStrategy = validateStrategy;
    }

    /**
     * 调用接口
     *
     * @param s
     * @return
     */
    public boolean validate(String s) {
        return validateStrategy.execute(s);
    }
}

调用:

  @Test
    public void testNormalStrategy() {
        //判断是否是数字
        Validatator validatator = new Validatator(new IsNumeric());
        System.out.println(validatator.validate("79834"));

        //判断是否是小写字母
        Validatator validatator1 = new Validatator(new IsAllowLowerCase());
        System.out.println(validatator1.validate("kfdfj"));
    }

缺点:

在上述代码中,给Validator传递的算法实现类接口每次都是一个新的,当新增一个业务的时候都要去写一个算法接口的实现类,抽象看来,其实Validatator(new IsNumeric());只是传递的一种行为,告诉接口来校验是否是数字。

改进(新增一个校验是否是大写字母的算法)

可以用匿名内部类来实现,不用每次新增类:


        Validatator validatator2 = new Validatator(new ValidateStrategy() {
            @Override
            public boolean execute(String s) {
                return s.matches("[A-Z]+");
            }
        });
        System.out.println(validatator2.validate("HK"));

用java中提供的函数式编程来改进

 @Test
    public void testStrategy() {
        //校验是否是小写
        Validatator validatator = new Validatator(s -> s.matches("[a-z]+"));
        System.out.println(validatator.validate("dkfhd"));

        //校验是否是数字
        Validatator validatatorNum = new Validatator(s -> s.matches("\\d+"));
        System.out.println(validatatorNum.validate("4394"));

    }

将行为直接传递给接口