观察者模式
第一次接触观察者模式,上网查了许多资料之后,以下是一些粗浅的理解。如有不对地方,请指正。
观察者模式:在对象之间定义一对多的依赖,当一个对象改变状态时,依赖它的对象会受到通知并自动更新。
在网上看到的一句话来形容特别好,观察者模式其实就是发布订阅模式,发布者发布消息,订阅者接收消息,订阅了就能收到消息,没订阅就收不到消息。用微信小程序来做例子最合适不过了,被观察者就是公众号,观察者就是用户,用户只有关注公众号之后才能收到推送消息。
我这里按照网上别人的帖子,自己做了一个类似的demo。
主要包含4个类:
被观察者接口
观察者接口
实际被观察者(公众号)
实际观察者(用户)
- 第一,完成被观察者接口
这个接口需要实现一些基本的功能,比如注册,删除,通知消息。
public interface Oberverable {
public void regist(Oberver o);
public void delete(Oberver o);
public void notifyObserver();
}
- 第二,完成观察者接口
这个接口需要实现响应动作的功能。
public interface Oberver {
public void receive(String message);
}
- 第三,实际被观察者(公众号)
这个类需要继承被观察者接口,接管一些基本的功能。当然,如果有其他功能可以在这里添加。最重要的一点:这里需要添加一个List,存放观察者(用户)。等被观察者做出动作(发布消息),通过遍历观察者来进行通知。
public class WeChatServer implements Oberverable {
List<Oberver> list;
public WeChatServer() {
list = new ArrayList<Oberver>();
}
@Override
public void regist(Oberver o) {
list.add(o);
}
@Override
public void delete(Oberver o) {
list.remove(o);
}
@Override
public void notifyObserver() {
System.out.println("开始发送通知消息");
send();
}
private void send() {
for (int i = 0; i < list.size(); i++) {
list.get(i).receive("PHP是世界上最好的语言");
}
}
- 第四,实现观察者(用户)
这个类需要继承观察者接口,实现响应动作(接收消息)。
public class User implements Oberver {
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void receive(String message) {
this.message = message;
show();
}
private void show() {
System.out.println(name + message);
}
}
- 第五、编写测试类
public class App {
public static void main(String[] args) {
User user1 = new User("张三");
User user2 = new User("李四");
User user3 = new User("王五");
WeChatServer server = new WeChatServer();
server.regist(user1);
server.regist(user2);
server.regist(user3);
server.notifyObserver();
server.delete(user1);
server.notifyObserver();
}
}
首先注册了三个用户张三、李四、王五。公众号发布了一条消息"PHP是世界上最好用的语言!",三个用户都收到了消息。
用户张三看到消息后颇为震惊,果断取消订阅,这时公众号又推送了一条消息,此时用户张三已经收不到消息,其他用户还是正常能收到推送消息。
来自:https://www.cnblogs.com/luohanguo/p/7825656.html