观察者模式是我们在设计中常用的一种模式,在这种模式下,消息发送者和消息接收者相当于一种订阅号的模式,类似于我们在日常中使用的微信公众号功能,由公众号下发一篇文章,然后所有关注了该公众号的用户都能接收到这条信息。
原理逻辑
观察者模式的实现原理图如下:
虽然观察者模式涉及到很多类,
消息提供者接口则是提供一些关于消息接收者的注册、取关、发送消息等接口方法。
消息接收者接口提供一个消息处理方法。
但其实观察者模式所有的秘密全部集中在消息提供者的实现类中,实现类将消息提供者和消息接收者关联起来。
这个实现类主要做了以下的工作:
- 维护一个消息接收者的容器(Collection、数组等),这个就是用来管理所有订阅者的秘密
- 在发送消息的时候,遍历所有订阅者,调用他们接口的方法,完成对信息的处理
代码示例
消息发送者,接口
/** * message provider of observer pattern * * @author mica */ public interface MessageProvider { /** * register new receiver to MessageProvider * @param receiver message receiver */ void register(MessageReceiver receiver); /** * remove receiver, the receiver will never receive * messaege from provider unless it register to provider * @param receiver message receiver */ void removeListener(MessageReceiver receiver); /** * send message to everyone who register to provider * dispatch message * @param message message to send */ void notify(String message); }
消息发送者,实现类
/** * MessageProvider implements * * @author mica */ public class MessageProviderImpl implements MessageProvider{ /** object to store message receiver (only registered) */ private Set<MessageReceiver> receivers = new HashSet<>(); @Override public void register(MessageReceiver receiver) { receivers.add(receiver); } @Override public void removeListener(MessageReceiver receiver) { receivers.remove(receiver); } @Override public void notify(String message) { for (MessageReceiver receiver : receivers) { receiver.receive(message); } } }
在实现类中,通过一个Set维护消息接收者的容器,然后在消息发送者发送消息的时候遍历Set集合中的所有元素,并调用他们的receive方法,以此完成消息接收端“自动”收取到了信息,或者说是消息接收端“自动”执行了receive方法。
消息接收者
/** * message (from message provider) receiver * * @author mica */ public interface MessageReceiver { /** * receive message from provider * * @param message message to receive */ void receive(String message); }
来源:https://www.cnblogs.com/micadai/p/12467136.html