設計模式----策略模式(函數語言程式設計實現)
阿新 • • 發佈:2018-12-12
策略模式
策略模式可以分為三個部分:
- 策略模式的演算法介面
- 策略模式的實現類–具體的那種演算法
- 呼叫者
普通方式實現策略模式:
演算法介面:
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"));
}
將行為直接傳遞給介面