观察者模式目的:
当一个对象的状态发生改变时,已经登记的其他对象能够观察到这一改变从而作出自己相对应的改变。通过这种方式来达到减少依赖关系,解耦合的作用。
相关链接:
https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453152034&idx=1&sn=1e1db22c4a7cb2bfcc4a7ce141a9ef00&chksm=8cfd03a1bb8a8ab75c824b6866b1960485276f1dae410567d917bd0be71e4d071ab146e147cd&scene=178&cur_album_id=1761987817540206592#rd
简单来说就是先将观察者放进一个主题队列,再调用发送消息方法,循环调用每个观察者的处理方法。
示例代码:
private static ExecutorService executorService = Executors.newFixedThreadPool(5);
public static void main(String[] args) {
List<String> users = new ArrayList<>();
//模拟多个用户注册成功后,异步进行新人福利发放和短信通知,一般用消息队列做通知,这里用观察者模式实现
for (int i = 0; i < 5; i++) {
String userid = String.valueOf(i);
users.add(userid);
System.out.println(userid + "注册成功");
executorService.submit(new Runnable() {
@Override
public void run() {
//将福利发放和短信通知添加进observice的list中,后续有其他操作再添加即可
ComCreateSubject comCreateSubject = new ComCreateSubject();
pushObservice(comCreateSubject);
//发送消息之后,就可以做其他事
comCreateSubject.sendMessage(userid);
}
});
}
}
private static List<Observice> pushObservice(ComCreateSubject comCreateSubject) {
comCreateSubject.attach(new sendCard());
comCreateSubject.attach(new sendMessage());
return comCreateSubject.getObservice();
}
定义一个subject,添加,删除,发送消息给观察者等方法的接口
public interface subject {
public void attach(Observice observice);
public void remove(Observice observice);
public void sendMessage(String userid);
public List<Observice> getObservice();
}
实现subject
public class ComCreateSubject implements subject {
private List<Observice> observices = new ArrayList<>();
@Override
public void attach(Observice observice) {
observices.add(observice);
}
@Override
public void remove(Observice observice) {
observices.remove(observice);
}
@Override
public void sendMessage(String userid) {
for (Observice observice : observices) {
observice.deal(userid);
}
}
@Override
public List<Observice> getObservice() {
return observices;
}
}
定义观察者方法的接口
public interface Observice {
public void deal(String userid);
}
具体的某个观察者
public class sendCard implements Observice {
public void deal(String userid) {
try {
// 模拟服务调用 线程睡1秒钟
TimeUnit.SECONDS.sleep(1);
System.out.println(userid + "发送优惠卷");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class sendMessage implements Observice{
public void deal(String userid) {
try {
// 模拟服务调用 线程睡1秒钟
TimeUnit.SECONDS.sleep(1);
System.out.println(userid + "发送短信");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}