99-设计模式
1. 工厂模式 + 策略模式
/**
* 1.表示大小写字母,数字,特殊字符,2.字母,数字,特殊字符,3.字母,数字,4.字母,特殊字符,5.数字,特殊字符
*/
public static void main(String[] args) {
new AuthKeyCheckFactory().checkInput("Ooxx1$", 1, false);
}
1. 策略模式
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
1. 策略接口
public interface AuthKeyStrategy {
/**
* checkAuthKey
*
* @param key key
* @param num num
* @return boolean
*/
Boolean checkAuthKey(String key, int num);
}
2. 策略接口实现类
public class CheckDigitLetterSpecial implements AuthKeyStrategy {
/**
* 数字、字母、特殊字符(自定义)
*
* @param key key
* @param num num
* @return boolean
*/
@Override
public Boolean checkAuthKey(String key, int num) {
return CheckUtils.checkDigitLetterSpecial(key, num);
}
}
public class CheckInputForKeyboard implements AuthKeyStrategy {
/**
* 键盘连续字符校验(默认2个)
*
* @param key key
* @param num num
* @return boolean
*/
@Override
public Boolean checkAuthKey(String key, int num) {
return CheckUtils.checkInputHasOrderForKeyboard(key);
}
}
public class CheckInputForOrder implements AuthKeyStrategy {
/**
* 连续字符校验(默认2个)
*
* @param key key
* @param num num
* @return boolean
*/
@Override
public Boolean checkAuthKey(String key, int num) {
return CheckUtils.checkInputHasOrder(key);
}
}
3. 上下文 Context类
public class AuthKeyContext {
private final AuthKeyStrategy authKeyStrategy;
public AuthKeyContext(AuthKeyStrategy authKeyStrategy) {
this.authKeyStrategy = authKeyStrategy;
}
public boolean executeStrategy(String key , int num) {
return this.authKeyStrategy.checkAuthKey(key , num);
}
}
2. 工厂模式
主要解决:主要解决接口选择的问题。
public class AuthKeyCheckFactory {
public void checkInput(String authKey, int rule, Boolean isContinuous) {
if (isContinuous) {
if (new AuthKeyContext(new CheckInputForOrder()).executeStrategy(authKey, rule)) {
throw new ResultException(CheckEnum.S_22006.getStatus(), CheckEnum.S_22006.getMessage());
}
if (new AuthKeyContext(new CheckInputForKeyboard()).executeStrategy(authKey, rule)) {
throw new ResultException(CheckEnum.S_22007.getStatus(), CheckEnum.S_22007.getMessage());
}
}
if (!new AuthKeyContext(new CheckDigitLetterSpecial()).executeStrategy(authKey, rule)) {
switch (rule) {
case 1:
throw new ResultException(CheckEnum.S_22001.getStatus(), CheckEnum.S_22001.getMessage());
case 2:
throw new ResultException(CheckEnum.S_22002.getStatus(), CheckEnum.S_22002.getMessage());
case 3:
throw new ResultException(CheckEnum.S_22003.getStatus(), CheckEnum.S_22003.getMessage());
case 4:
throw new ResultException(CheckEnum.S_22004.getStatus(), CheckEnum.S_22004.getMessage());
case 5:
throw new ResultException(CheckEnum.S_22005.getStatus(), CheckEnum.S_22005.getMessage());
default:
throw new ResultException(CheckEnum.S_22001.getStatus(), CheckEnum.S_22001.getMessage());
}
}
}
}