在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