Java 观察者模式

WechatIMG147.jpeg

介绍

shiyanlou:在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

角色

角色 说明
Subject 抽象目标类,一般至少提供三个接口:
添附(attach)
解附(detach)
通知(notify)
ConcreteSubject 具体目标,提供了观察者欲追踪的状态,也可设置目标状态
Observer 抽象观察者,定义观察者的更新操作接口
ConcreteObserver 具体观察者,实现抽象观察者的接口,做出自己的更新操作

角色示例

类名 担任角色 说明
OfficialAccount Subject 微信公众号,提供三个接口:
关注(follow)
取关(unFollow)
推送(send)
MyOfficialAccount ConcreteSubject 我的微信公众号
User Observer 用户
Developer ConcreteObserver 开发者

UML类图

观察者模式.png

代码

  • 创建 User.java,代码如下
1
2
3
4
abstract class User {
abstract public String receive(OfficialAccount officialAccount);
abstract public String getUsername();
}
  • 创建 Developer.java,代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Developer extends User {
protected String name;

public Developer(String name){
this.name = name;
}

@Override
public String receive(OfficialAccount officialAccount) {
return this.name+"接收到推送的文章:"+officialAccount.getArticle()+"\n";
}

@Override
public String getUsername(){
return this.name;
}
}
  • 创建 OfficialAccount.java,代码如下
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
import java.util.ArrayList;

abstract class OfficialAccount {
private ArrayList<User> userList;

public OfficialAccount(){
userList = new ArrayList<User>();
}

public String follow(User user) {
userList.add(user);
return user.getUsername()+" 关注了公众号";
}

public String unFollow(User user) {
userList.remove(user);
return user.getUsername()+" 取关了公众号";
}

public String send() {
String sendLog = "";
for (User user: userList) {
sendLog += user.receive(this);
}
return sendLog;
}

abstract public void setArticle(String article);

abstract public String getArticle();
}
  • 创建 MyOfficialAccount.java,代码如下
1
2
3
4
5
6
7
8
9
10
11
12
public class MyOfficialAccount extends OfficialAccount{

private String article;

public void setArticle(String article) {
this.article = article;
}

public String getArticle() {
return this.article;
}
}
  • 创建 OfficialAccountTest.java,代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class OfficialAccountTest {
public static void main(String[] args) {
OfficialAccount myOfficialAccount = new MyOfficialAccount();

User alan = new Developer("Alan");
User bob = new Developer("Bob");

System.out.println(myOfficialAccount.follow(alan));
System.out.println(myOfficialAccount.follow(bob));

myOfficialAccount.setArticle("《关于作者》");
System.out.println(myOfficialAccount.send());

myOfficialAccount.setArticle("《Java 观察者模式》");
System.out.println(myOfficialAccount.unFollow(bob));
System.out.println(myOfficialAccount.send());
}
}

执行

1
2
3
4
5
6
7
8
$ javac OfficialAccountTest.java
$ java OfficialAccountTest
Alan 关注了公众号
Bob 关注了公众号
Alan 接收到推送的文章:《关于作者》
Bob 接收到推送的文章:《关于作者》
Bob 取关了公众号
Alan 接收到推送的文章:《设计模式 观察者模式》
-------------本文结束感谢您的阅读-------------
0%