观察者模式概念:目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。
大致过程如图
具体代码实现
定义抽象被观察者
package com.example.observerDemo;
/**
* description
* <p>
* 抽象被观察者
* @author slliao
* @date 2019/4/28 11:23.
*/
public interface SendService {
/**
* 注册一个用户
* @param o
*/
public void register(AcceptObject o);
/**
* 移除一个用户
* @param o
*/
public void remove(AcceptObject o);
/**
* 通知
*/
public void notif();
}
定义抽象观察者
package com.example.observerDemo;
/**
* description
* <p>
* 抽象观察者
* @author slliao
* @date 2019/4/28 11:25.
*/
public interface AcceptObject {
public void update(String message);
}
具体被观察者角色
实现了 SendService接口,对 三个方法进行了具体实现,同时有一个List集合,用以保存已经注册了的观察者,等需要通知观察者时,遍历该集合即可
package com.example.observerDemo;
import java.util.ArrayList;
import java.util.List;
/**
* description
* <p>
* 具体被观察者角色
* @author slliao
* @date 2019/4/28 11:26.
*/
public class SendServiceImpl implements SendService{
private List<AcceptObject> list;
private String message;
/**
* 初始化一个空集合list
*/
public SendServiceImpl(){
list=new ArrayList<>();
}
@Override
public void register(AcceptObject o) {
list.add(o);
}
@Override
public void remove(AcceptObject o) {
list.remove(o);
}
@Override
public void notif() {
for (AcceptObject l : list){
l.update(message);
}
}
public void sendMessage(String message){
this.message = message;
System.out.println(message);
notif();
}
}
具体观察者
package com.example.observerDemo;
/**
* description
* <p>
* 具体观察者
* @author slliao
* @date 2019/4/28 11:29.
*/
public class User implements AcceptObject {
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message=message;
read();
}
public void read(){
System.out.println(name+"接收到推送消息"+ message);
}
}
测试
public class Test {
public static void main(String[] args) {
User user1 = new User("张三");
User user2 = new User("李四");
User user3 = new User("王五");
SendServiceImpl ac = new SendServiceImpl();
ac.register(user1);
ac.register(user2);
ac.register(user3);
ac.sendMessage("微信发送第一条消息: 欢迎使用微信");
ac.remove(user3);
ac.sendMessage("微信发送第二条消息: 有新版本,请更新");
}
}
输出结果