观察者模式(Observer Pattern)
半塘 2024/3/29 Java进阶
对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
# 1、观察者模式案例
以客户端注册到服务中心,服务中心修改配置时,通知各个客户端更新后的配置
// 客户端规范
public interface ServerClient {
void updateConfig(String serverName,String port);
}
// 客户端:OneClient
public class OneClient implements ServerClient{
@Override
public void updateConfig(String serverName, String port) {
System.out.println("OneClient被通知服务中心名称和端口修改===>"+serverName+"===>"+port);
}
}
// 客户端:TwoClient
public class TwoClient implements ServerClient{
@Override
public void updateConfig(String serverName, String port) {
System.out.println("TwoClient被通知服务中心名称和端口修改===>"+serverName+"===>"+port);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public interface Server {
// 注册服务
void resisterServer(ServerClient o);
// 移除服务
void removeServer(ServerClient o);
// 更新服务配置
void updateServerConfiguration();
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
实现服务中心
public class ServerCenter implements Server{
private final List<ServerClient> serverClientList;
private String serverName;
private String serverPort;
public ServerCenter() {
this.serverClientList = new ArrayList<>();
}
public void setServerCenterConfig(String serverName, String serverPort) {
this.serverName = serverName;
this.serverPort = serverPort;
updateServerConfiguration();
}
@Override
public void resisterServer(ServerClient o) {
serverClientList.add(o);
}
@Override
public void removeServer(ServerClient o) {
serverClientList.remove(o);
}
@Override
public void updateServerConfiguration() {
for (ServerClient serverClient : serverClientList) {
serverClient.updateConfig(serverName,serverPort);
}
}
}
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
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
public class ClientTest {
public static void main(String[] args) {
// 服务中心
ServerCenter center = new ServerCenter();
// 创建客户端
OneClient oneClient = new OneClient();
TwoClient twoClient = new TwoClient();
// 将客户端注册到服务中心
center.resisterServer(oneClient);
center.resisterServer(twoClient);
// 服务中心修改配置,并通知各个客户端
center.setServerCenterConfig("星云服务中心","8080");
// 注销客户端oneClient
center.removeServer(oneClient);
center.setServerCenterConfig("星云服务中心2","9000");
}
}
/**
* 输出结果:
* OneClient被通知服务中心名称和端口修改===>星云服务中心===>8080
* TwoClient被通知服务中心名称和端口修改===>星云服务中心===>8080
* TwoClient被通知服务中心名称和端口修改===>星云服务中心2===>9000
* /
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
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