23种设计模式—— 策略模式
Posted cj_eryue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23种设计模式—— 策略模式相关的知识,希望对你有一定的参考价值。
策略模式(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语句,也便于后期的功能拓展及维护
以上是关于23种设计模式—— 策略模式的主要内容,如果未能解决你的问题,请参考以下文章