设计模式----策略模式(函数式编程实现)
策略模式
策略模式可以分为三个部分:
- 策略模式的算法接口
- 策略模式的实现类–具体的那种算法
- 调用者
普通方式实现策略模式:
算法接口:
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"));
}
将行为直接传递给接口