Skip to content

Commit f61d489

Browse files
committed
设计模式-观察者模式
1 parent c04b47b commit f61d489

File tree

8 files changed

+264
-0
lines changed

8 files changed

+264
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.design.observer.v1;
2+
3+
import com.design.observer.v1.observer.SubscribeConcreteObserver;
4+
import com.design.observer.v1.subject.BlogConcreteSubject;
5+
6+
/**
7+
* 观察者模式,使用JDK的提供的类完成
8+
*
9+
* @author wliduo[i@dolyw.com]
10+
* @date 2022/1/20 14:02
11+
*/
12+
public class Main {
13+
14+
public static void main(String[] args) {
15+
// 构建具体目标
16+
BlogConcreteSubject blogConcreteSubject = new BlogConcreteSubject("dolyw.com");
17+
// 添加观察者
18+
blogConcreteSubject.addObserver(new SubscribeConcreteObserver("王明"));
19+
blogConcreteSubject.addObserver(new SubscribeConcreteObserver("王美丽"));
20+
// 具体目标发送变化,发布新博客
21+
blogConcreteSubject.publish("母猪的产后护理");
22+
}
23+
24+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.design.observer.v1.observer;
2+
3+
import com.design.observer.v1.subject.BlogConcreteSubject;
4+
5+
import java.util.Observable;
6+
import java.util.Observer;
7+
8+
/**
9+
* 具体观察者,使用JDK提供的Observable类抽象观察者Observer
10+
*
11+
* @author wliduo[i@dolyw.com]
12+
* @date 2022/1/20 14:21
13+
*/
14+
public class SubscribeConcreteObserver implements Observer {
15+
16+
private String name;
17+
18+
public SubscribeConcreteObserver(String name) {
19+
this.name = name;
20+
}
21+
22+
/**
23+
* 发布新博客后,订阅者接收到消息
24+
*
25+
* @param o
26+
* @param arg
27+
*/
28+
@Override
29+
public void update(Observable o, Object arg) {
30+
BlogConcreteSubject blog = (BlogConcreteSubject) o;
31+
String title = (String) arg;
32+
System.out.println(name + "订阅的博客[" + blog.getName() + "]又发布了新文章-" + title);
33+
}
34+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.design.observer.v1.subject;
2+
3+
import java.util.Observable;
4+
5+
/**
6+
* 具体目标,使用JDK提供的Observable类抽象目标
7+
*
8+
* @author wliduo[i@dolyw.com]
9+
* @date 2022/1/20 14:13
10+
*/
11+
public class BlogConcreteSubject extends Observable {
12+
13+
private String name;
14+
15+
public BlogConcreteSubject(String name) {
16+
this.name = name;
17+
}
18+
19+
public String getName() {
20+
return name;
21+
}
22+
23+
/**
24+
* 发布新文章,通知所有订阅了博客的人
25+
*
26+
* @param title
27+
* @return void
28+
* @throws
29+
* @author wliduo[i@dolyw.com]
30+
* @date 2022/1/20 14:17
31+
*/
32+
public void publish(String title) {
33+
// 设置标识位 changed = true,表示被观察者发生了改变
34+
setChanged();
35+
// 通知观察者,可以给观察者传递数据
36+
notifyObservers(title);
37+
}
38+
39+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.design.observer.v2;
2+
3+
import com.design.observer.v2.observer.SubscribeConcreteObserver;
4+
import com.design.observer.v2.subject.AbstractSubject;
5+
import com.design.observer.v2.subject.BlogConcreteSubject;
6+
7+
/**
8+
* 观察者模式,使用原生方式完成
9+
*
10+
* @author wliduo[i@dolyw.com]
11+
* @date 2022/1/20 14:02
12+
*/
13+
public class Main {
14+
15+
public static void main(String[] args) {
16+
// 构建具体目标
17+
AbstractSubject blogConcreteSubject = new BlogConcreteSubject("dolyw.com");
18+
// 添加观察者
19+
blogConcreteSubject.addObserver(new SubscribeConcreteObserver("王明"));
20+
blogConcreteSubject.addObserver(new SubscribeConcreteObserver("王美丽"));
21+
// 具体目标发送变化,发布新博客
22+
blogConcreteSubject.publish("Java入门到放弃");
23+
}
24+
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.design.observer.v2.observer;
2+
3+
import com.design.observer.v2.subject.AbstractSubject;
4+
5+
/**
6+
* 抽象观察者
7+
*
8+
* @author wliduo[i@dolyw.com]
9+
* @date 2022/1/20 14:05
10+
*/
11+
public abstract class AbstractObserver {
12+
13+
/**
14+
* 观察者接收通知
15+
*
16+
* @param abstractSubject
17+
* @param arg
18+
* @return void
19+
* @throws
20+
* @author wliduo[i@dolyw.com]
21+
* @date 2022/1/21 15:39
22+
*/
23+
public abstract void update(AbstractSubject abstractSubject, Object arg);
24+
25+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.design.observer.v2.observer;
2+
3+
import com.design.observer.v2.subject.AbstractSubject;
4+
import com.design.observer.v2.subject.BlogConcreteSubject;
5+
6+
/**
7+
* 具体观察者,使用原生方式实现
8+
*
9+
* @author wliduo[i@dolyw.com]
10+
* @date 2022/1/20 14:21
11+
*/
12+
public class SubscribeConcreteObserver extends AbstractObserver {
13+
14+
private String name;
15+
16+
public SubscribeConcreteObserver(String name) {
17+
this.name = name;
18+
}
19+
20+
/**
21+
* 订阅目标发布新博客后,订阅者接收到消息
22+
*
23+
* @param abstractSubject
24+
* @param arg
25+
*/
26+
@Override
27+
public void update(AbstractSubject abstractSubject, Object arg) {
28+
BlogConcreteSubject blog = (BlogConcreteSubject) abstractSubject;
29+
String title = (String) arg;
30+
System.out.println(name + "订阅的博客[" + blog.getName() + "]又发布了新文章-" + title);
31+
}
32+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.design.observer.v2.subject;
2+
3+
import com.design.observer.v2.observer.AbstractObserver;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
/**
9+
* 抽象目标
10+
*
11+
* @author wliduo[i@dolyw.com]
12+
* @date 2022/1/20 14:03
13+
*/
14+
public abstract class AbstractSubject {
15+
16+
protected List<AbstractObserver> observerList = new ArrayList<>();
17+
18+
public synchronized void addObserver(AbstractObserver observer) {
19+
if (observer == null) {
20+
throw new NullPointerException();
21+
}
22+
if (!observerList.contains(observer)) {
23+
observerList.add(observer);
24+
}
25+
}
26+
27+
public synchronized void deleteObserver(AbstractObserver observer) {
28+
observerList.remove(observer);
29+
}
30+
31+
/**
32+
* 通知所有观察者
33+
*
34+
* @param arg
35+
*/
36+
public void notifyObservers(Object arg) {
37+
for (AbstractObserver abstractObserver : observerList) {
38+
abstractObserver.update(this, arg);
39+
}
40+
}
41+
42+
/**
43+
* 目标发生变化
44+
*
45+
* @param title
46+
*/
47+
public abstract void publish(String title);
48+
49+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.design.observer.v2.subject;
2+
3+
/**
4+
* 具体目标,使用原生方式实现
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2022/1/20 14:13
8+
*/
9+
public class BlogConcreteSubject extends AbstractSubject {
10+
11+
private String name;
12+
13+
public BlogConcreteSubject(String name) {
14+
this.name = name;
15+
}
16+
17+
public String getName() {
18+
return name;
19+
}
20+
21+
/**
22+
* 发布新文章,通知所有订阅了博客的人
23+
*
24+
* @param title
25+
* @return void
26+
* @throws
27+
* @author wliduo[i@dolyw.com]
28+
* @date 2022/1/20 14:17
29+
*/
30+
@Override
31+
public void publish(String title) {
32+
// 通知观察者,可以给观察者传递数据
33+
notifyObservers(title);
34+
}
35+
36+
}

0 commit comments

Comments
 (0)