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