行为参数化:可以帮助你处理频繁变更需求的一种软件开发模式
行为参数化
从语言使用上解释
- 定义接口,接口中有且仅有一个抽象方法
public interface TestPredicate<T> {
boolean test(T t);
}
2、定义实现类
public class UserNamePredicate implements TestPredicate<User> {
@Override
public boolean test(User user) {
if ("sailfish".equals(user.getName())) {
return true;
}
return false;
}
}
public class UserAgePredicate implements TestPredicate<User> {
@Override
public boolean test(User user) {
if (18 < user.getAge()) {
return true;
}
return false;
}
}
- 第一个实现类是筛选名称是
sailfish
的用户 - 第二个实现类是帅选年龄大于18的用户
3、 业务流层处理
public static List<User> filterUser(List<User> list, TestPredicate predicate) {
ArrayList<User> users = Lists.newArrayList();
for (User user : list) {
boolean isTrue = predicate.test(user);
if (isTrue) {
users.add(user);
}
}
return users;
}
public static void main(String[] args) {
ArrayList<User> userList = Lists.newArrayList(new User[]{
new User("hongshu", 55),
new User("sailfish", 18),
new User("biezhi", 22),
});
List<User> users = filterUser(userList, new UserNamePredicate());
}
从设计模式思考
- 行为参数化有点类似设计模式中的策略模式
- 行为参数化符合
开闭原则
从业务改动上思考
如果按照一般方法来实现按照名称或者是按照年龄来区分的话,代码可能是这样的
public static List<User> filterUserByName(List<User> list, String name) {
ArrayList<User> users = Lists.newArrayList();
for (User user : list) {
if (name.equals(user.getName())) {
users.add(user);
}
}
return users;
}
public static List<User> filterUserByAge(List<User> list, int age) {
ArrayList<User> users = Lists.newArrayList();
for (User user : list) {
if (age < user.getAge()) {
users.add(user);
}
}
return users;
}
- 这样的问题是拷贝了代码(存在重复代码)
行为参数化和参数化值的区别
就好像授人以鱼和授人以渔的故事一样。
- 行为参数化是给你说过程怎么做;你可以去钓鱼,也可以去打猎
- 传统的值参数化是直接给你结果;给你一条鱼,或者给你一只兔子
网友评论