什么是行为参数化

字数 293阅读 440

行为参数化:可以帮助你处理频繁变更需求的一种软件开发模式

行为参数化

从语言使用上解释

  1. 定义接口,接口中有且仅有一个抽象方法
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());
    }

从设计模式思考

  1. 行为参数化有点类似设计模式中的策略模式
  2. 行为参数化符合开闭原则

从业务改动上思考

如果按照一般方法来实现按照名称或者是按照年龄来区分的话,代码可能是这样的

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;
    }
  • 这样的问题是拷贝了代码(存在重复代码)

行为参数化和参数化值的区别

就好像授人以鱼和授人以渔的故事一样。

  1. 行为参数化是给你说过程怎么做;你可以去钓鱼,也可以去打猎
  2. 传统的值参数化是直接给你结果;给你一条鱼,或者给你一只兔子

推荐阅读更多精彩内容