什么是行为参数化

作者: 橙小张 | 来源:发表于2018-04-18 13:46 被阅读6次

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

    行为参数化

    从语言使用上解释

    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. 传统的值参数化是直接给你结果;给你一条鱼,或者给你一只兔子

    相关文章

      网友评论

        本文标题:什么是行为参数化

        本文链接:https://www.haomeiwen.com/subject/otpvkftx.html