File tree Expand file tree Collapse file tree 8 files changed +264
-0
lines changed
DesignPattern/src/main/java/com/design/observer Expand file tree Collapse file tree 8 files changed +264
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments