观察者模式

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.util.ArrayList;
import java.util.List;

/**
* @Author Liruilong
* @Description 观察者模式
* @Date 8:47 2019/9/5
**/
// 声明一个观察者接口,将不同的观察者聚合在一起
@FunctionalInterface
interface Observer{
void notify(String tweet);
}
// 申明不同的观察者,定义不同的行为
class NYTimes implements Observer{

@Override
public void notify(String tweet) {
if (tweet != null && tweet.contains("money")){
System.out.println("Breaking news in NY !" + tweet);
}
}
}
class LeMonde implements Observer{

@Override
public void notify(String tweet) {
if (tweet != null && tweet.contains("queen")){
System.out.println(""+tweet);
}
}
}
class Guardian implements Observer{

@Override
public void notify(String tweet) {
if (tweet != null && tweet.contains("wine")){
System.out.println("Today cheese ,wine and news!"+tweet);
}
}
}
interface Subject{
// 注册一个新的观察者
void registerObserver(Observer o);
// 对实现观察者行为
void notifyObservers(String twee);
}
/**
* @Author Liruilong
* @Description 内部维护一个观察者列表.
* @Date 9:44 2019/9/5
* @Param
* @return
**/

class Feed implements Subject{

private final List<Observer> observers = new ArrayList<>();

@Override
public void registerObserver(Observer o) {
this.observers.add(o);
}

@Override
public void notifyObservers(String twee) {
observers.forEach(o ->o.notify(twee));
}

// 实现观察方法
public static void main(String[] args) {
Feed f = new Feed();
// 将不同的观察者放入观察者列表,具体的观察方法由实现类完成..
f.registerObserver(new NYTimes());
f.registerObserver(new Guardian());
//
f.notifyObservers("嗯. 来了一条特大新闻!!!!");
f.notifyObservers("嗯. 来了一条特大新闻!!!!money");

// 使用Lambda表达式,将观察者的观察行为参数化
f.registerObserver((String string) ->{
if (string != null){
System.out.println("这个新闻太水啦!" + string);
}
});
f.registerObserver((String string) ->{
if (string != null){
System.out.println("这个新闻挺好的!!" + string);
}
});

}
}