23种设计模式(4)—— 策略模式

策略模式(Strategy Pattern):一个类的行为或其算法可以在运行时更改。

比如实际项目中,有一些数据交互的工作,我们需要对数据的值进行合法性校验,如手机号,性别等,这时,我们一般使用if else去校验,耦合度太高,后期也不便于维护,这时我们就可以使用策略模式,直接上伪代码。

先定义一个枚举类:

package com.cjian.GOF.strategy.strategy2;

/**
 *  校验类型的枚举类
 */
public enum ParamTypeEnum {
    EMAIL("1","Email"),PHONE("2","Sex");

    //数据类型
    private String type;
    //数据对应的实体名称,与类名一致,这里可以使用注解优化的
    private String name;

    ParamTypeEnum(String type, String name) {
        this.type = type;
        this.name = name;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setName(String name) {
        this.name = name;
    }

    //根据类型返回对应的实体bean名称
    public static String getName(String type) {
        ParamTypeEnum[] var1 = values();
        int var2 = var1.length;

        for(int var3 = 0; var3 < var2; ++var3) {
            ParamTypeEnum value = var1[var3];
            if (String.valueOf(value.type).equals(type)) {
                return value.name;
            }
        }
        return null;
    }
}

接着我们来使用策略模式:

定义一个校验接口,以及邮箱和性别的实现类:

package com.cjian.GOF.strategy.strategy2;

public interface ParamValidate {
    String validate(String param);
}
package com.cjian.GOF.strategy.strategy2;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @description: 邮箱校验类
 * @time: 2021/8/30 9:56
 */
public class Email implements ParamValidate {
    @Override
    public String validate(String param) {
        String str
            = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
        Pattern p = Pattern.compile(str);
        Matcher m = p.matcher(param);
        if (m.matches() == false) {
            return "邮箱格式不正确";
        } else {
            return null;
        }
    }
}
package com.cjian.GOF.strategy.strategy2;

/**
 * @description:性别校验
 * @time: 2021/8/30 9:56
 */
public class Sex implements ParamValidate {
    @Override
    public String validate(String param) {
        if (!"1".equals(param) && !"0".equals(param)) {
            return "性别格式不正确";
        } else {
            return null;
        }
    }
}

定义持有具体的处理者类:

package com.cjian.GOF.strategy.strategy2;

/**
 * @description: 持有某个处理策略
 * @time: 2021/8/30 9:56
 */
public class ParamValidateStrategy {

    //持有的具体策略的对象
    private ParamValidate paramValidate;

    /**
     * 构造函数,传入一个具体策略对象
     *
     * @param paramValidate 具体策略对象
     */
    public ParamValidateStrategy(ParamValidate paramValidate) {
        super();
        this.paramValidate = paramValidate;
    }

    /**
     * 执行策略方法
     */
    public String validate(String param) {
        return paramValidate.validate(param);
    }
}

测试类:

package com.cjian.GOF.strategy.strategy2;

/**
 * @description:
 * @time: 2021/8/30 10:20
 */
public class Test {

    public static void main(String[] args)
        throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException {

        System.out.println(validate("1", "231"));
        System.out.println(validate("2", "1"));
    }

    private static String validate(String type, String value)
        throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //获取对应的校验类型
        String className = ParamTypeEnum.getName(type);
        //根据枚举值获取对应的枚举描述,从而反射生成校验类(校验类的类名与枚举描述必须一致)
        Class<?> forName = Class.forName("com.cjian.GOF.strategy.strategy2." + className);
        Object obj = forName.newInstance();
        ParamValidateStrategy paramValidateStrategy = new ParamValidateStrategy((ParamValidate) obj);
        return paramValidateStrategy.validate(value);
    }
}

优雅的避免了if else语句,也便于后期的功能拓展及维护  

猜你喜欢

转载自blog.csdn.net/cj_eryue/article/details/119992271