一、简述
引用:【设计模式】SpringBoot优雅使用策略模式
策略模式有3种角色,分别为:选择器、抽象策略、策略实例。
其中选择器selector
又被称为上下文context
,其作用为通过不同的标识来获取对应的策略实例。策略实例就是封装不同算法的实例对象实例对象&spm=1001.2101.3001.7020),而抽象策略就是策略实例的顶层接口。
简单类图大概就是这个样子:
二、实现
1、定义对象
1 2 3 4 5 6 7 8 9
|
@Data public class User { private String name; private Integer age; private Boolean isSp; }
|
2、抽象策略处理器
1 2 3 4 5 6 7 8 9 10 11
| public interface TestService { public void doMethod(User user);
default void spHandle(User user){ user.setAge(user.getAge()+1); }
}
|
3、定义策略选择器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Service public class TestServiceFactory {
@Resource private Map<String, TestService> services;
public TestService instance(User user) { try { String beanName = StringUtils.concatenateFields(user, "_"); if (services.containsKey(beanName)) { return services.get(beanName); } return services.get("default"); } catch (IllegalAccessException e) { throw new RuntimeException(e); } }
}
|
对象字段拼接字符串工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class StringUtils extends StrUtil {
public static String concatenateFields(Object obj, String separator) throws IllegalAccessException { StringBuilder sb = new StringBuilder(); Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) { field.setAccessible(true); Object value = field.get(obj);
if (value != null && !(value instanceof String && ((String) value).trim().isEmpty())) { if (sb.length() > 0) { sb.append(separator); } sb.append(value.toString()); } } return sb.toString(); }
}
|
4、策略实现类
注意:此处定义beanName时会按照对象属性的顺序进行拼接
默认策略实现
1 2 3 4 5 6 7 8 9 10
| @Service("default") public class DefaultTestServiceImpl implements TestService { @Override public void doMethod(User user) { spHandle(user); System.out.println("DefaultTestServiceImpl"); } }
|
实现策略A
1 2 3 4 5 6 7 8 9 10
| @Service("sherlock_18_false") public class ATestServiceImpl implements TestService {
@Override public void doMethod(User user) { spHandle(user); System.out.println("DefaultTestServiceImpl"); } }
|
实现策略B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Service("sherlock_true") public class BTestServiceImpl implements TestService {
@Override public void doMethod(User user) { spHandle(user); System.out.println("DefaultTestServiceImpl"); } @Override public void spHandle(User user) { } }
|