码迷,mamicode.com
首页 > 其他好文 > 详细

单体【其他模式】

时间:2019-01-05 13:33:17      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:row   use   and   arraylist   empty   etag   int   date   sage   

单体

public class Monad {
    /**
     * Monad pattern【单体模式】:
     * Monad pattern 定义了一个单体结构,它支持在管道中一步步地处理数据。
     * Monad 由一个类型构造函数和两个操作组成,
     * bind():绑定已经解包的值,将其输入处理函数,并输出新的包裹值。
     * get():获取最终的处理结果
     */
    @Test(expected = IllegalStateException.class)
    public void all() {
        final User user = User.of("zxd", -1);
        Validator.of(user)
        .validate(User::getName, StringUtils::isNotBlank, "name can not be blank")
        .validate(User::getAge, age -> age >= 1 && age <= 120, "age is invalid")
        .get();
    }
}

@Value(staticConstructor = "of")
class User {
    private String name;
    private int age;
}

class Validator<T> {
    private final T t;
    private final List<Exception> exceptions = Lists.newArrayList();

    private Validator(T t) {
        this.t = t;
    }

    public static <T> Validator<T> of(T t) {
        return new Validator<>(Objects.requireNonNull(t));
    }

    public Validator<T> validate(Predicate<T> predicate, String message) {
        if (!predicate.test(t)) {
            exceptions.add(new IllegalStateException(message));
        }
        return this;
    }

    public <U> Validator<T> validate(Function<T, U> mapper, Predicate<U> predicate, String message) {
        return validate(mapper.andThen(predicate::test)::apply, message);
    }

    public T get() throws IllegalStateException {
        if (exceptions.isEmpty()) {
            return t;
        }
        final IllegalStateException e = new IllegalStateException();
        exceptions.forEach(e::addSuppressed);
        throw e;
    }
}

单体【其他模式】

标签:row   use   and   arraylist   empty   etag   int   date   sage   

原文地址:https://www.cnblogs.com/zhuxudong/p/10223944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!