场景

在MVC的架构中,我们想从Model层传递一些错误信息到View层,比如用户注册这个功能,用户填写了密码,邮箱,然后提交注册, 这时候我们后端需要对前端的数据做校验,同时将校验的结果返回给View层,这时候就能用到Notification模式.

思路

先定义Notification:

 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 Notification {
    private List _errors;

    public Notification() {
        _errors = new ArrayList();
    }
    public void clear() {
        _errors.clear();
    }
    public boolean hasError() {
        if (this._errors != null && this.errors().size() > 0) {
            return true;
        }
        return false;
    }
    public List errors() {
        return this._errors;
    }
    public class Error {
        private String _message;

        public Error(String messgae) {
            this._message = messgae;
        }
        public String getMessage() {
            return _message;
        }
        public void set_message(String _message) {
            this._message = _message;
        }
    }
}

定义IDomainValidator接口,如果是接口,notification就是实例共享的,在调用完errors方法后,需要clear,注意防止多线程问题,我这里用的抽象类

1
2
3
4
5
6
7
8
9
public abstract class IDomainValidator {
    /* 校验结果通知 */
    protected Notification notification;

    public IDomainValidator() {
        notification = new Notification();
    }
    abstract void validate();
}

领域模型:

 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
33
public class User extends IDomainValidator {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    /**
     * 校验领域模型
     */
    public void validate() {
        if (age < 18) {
            notification.errors().add(notification.new Error("年龄小于18岁"));
        }
        if (name.equals("xiaog")) {
            notification.errors().add(notification.new Error("名字不能为:" + name));
        }
        // 当然你还可以对该领域做其他的校验
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

测试:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public static void main(String[] args) {
      User user = new User("xiaog", 17);
      user.validate();
      if (user.notification.hasError()) {
        for (Notification.Error error : user.notification.errors()) {
          System.out.println(error.getMessage());
        }
      }
     }
}

Notification模式的好处是:

  • 一次处理多条信息
  • 消耗更少的系统资源(也就是尽量在系统中少抛出Exception,少一些catch) 你还可以对这个模式进行扩展,将错误信息进一步封装。

参考

Notification