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());
            }
        }
    }
}