观察者模式(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
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

实现服务中心

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
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