Skip to content

Commit 3e379fe

Browse files
committed
增加观察者模式
1 parent 400faef commit 3e379fe

1 file changed

Lines changed: 106 additions & 0 deletions

File tree

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package behavioral;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import javax.xml.bind.attachment.AttachmentMarshaller;
7+
8+
/**
9+
* Created by 张春辉 on 2018年5月16日.
10+
* <p>
11+
* 观察者模式定义了一种一对多的依赖关系,让多个观察者对象
12+
* 同时监听某一个主题对象。这个主题对象在状态发生变化是,
13+
* 会通知所有观察者对象,使他们能够自动更新自己。
14+
* <p>大白话:
15+
 *其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
16+
*/
17+
public class ObserverPattern {
18+
/***
19+
* 抽象被观察者接口
20+
* 声明了添加、删除、通知观察者方法
21+
*/
22+
interface Subject{
23+
public void attach(Observer observer);
24+
public void deatch(Observer observer);
25+
public void notifyObserver();
26+
}
27+
28+
/***
29+
* 抽象观察者
30+
* 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
31+
*/
32+
interface Observer{
33+
public void update(String message);
34+
}
35+
36+
37+
38+
39+
static class ConsumerSubject implements Subject{
40+
41+
//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
42+
private List<Observer> list;
43+
private String message;
44+
45+
public ConsumerSubject() {
46+
list = new ArrayList<Observer>();
47+
}
48+
49+
50+
@Override
51+
public void attach(Observer observer) {
52+
list.add(observer);
53+
}
54+
55+
@Override
56+
public void deatch(Observer observer) {
57+
if(observer != null)
58+
list.remove(observer);
59+
}
60+
61+
@Override
62+
public void notifyObserver() {
63+
for(int i = 0; i < list.size(); i++) {
64+
Observer oserver = list.get(i);
65+
oserver.update(message);
66+
}
67+
}
68+
69+
public void setInfomation(String s) {
70+
this.message = s;
71+
System.out.println("更新消息: " + s);
72+
//消息更新,通知所有观察者
73+
notifyObserver();
74+
}
75+
76+
}
77+
78+
static class ConsumerObserver implements Observer{
79+
80+
String name;
81+
String message;
82+
83+
public ConsumerObserver(String name){
84+
this.name = name;
85+
}
86+
87+
@Override
88+
public void update(String message) {
89+
this.message = message;
90+
read();
91+
}
92+
93+
public void read() {
94+
System.out.println(name + " 收到推送消息: " + message);
95+
}
96+
97+
}
98+
99+
public static void main(String[] args) {
100+
ConsumerSubject subject = new ConsumerSubject();
101+
subject.attach(new ConsumerObserver("小红帽"));
102+
subject.attach(new ConsumerObserver("白雪公主"));
103+
subject.setInfomation("开始通知");
104+
}
105+
106+
}

0 commit comments

Comments
 (0)