介绍
说白了就是发布订阅,服务端先添加订阅的观察者用户,等服务端触发某个事件时通知订阅过的用户,然后让用户处理自己的业务逻辑
该模式包含四个角色
1、一个抽象的主题接口就是被观察的主题接口,可以用来添加、删除和通知观察者
2、’具体的被观察者对象
3、抽象的观察者接口
4、具体的观察者对象
代码实现
1、抽象的观察者接口
package com.zhouzy.sjms.model;
/**
* 观察者
* @author Administrator
*
*/
public interface Observer {
public void receive(String message);
}
2、具体的观察者,我这里定义了两个
package com.zhouzy.sjms.model;
public class Customer1 implements Observer{
private String name;
public Customer1(){
}
public Customer1(String name){
this.name = name;
}
@Override
public void receive(String message) { //订阅用户收到消息后的处理逻辑
System.out.println("用户:"+name+" 收到消息:"+message);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.zhouzy.sjms.model;
public class Customer2 implements Observer{
private String name;
public Customer2(){
}
public Customer2(String name){
this.name = name;
}
@Override
public void receive(String message) { //订阅用户收到消息后的处理逻辑
System.out.println("用户:"+name+" 收到消息:"+message);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、抽象的被观察者主题接口,里面可以添加、删除和提醒观察者
package com.zhouzy.sjms.service;
import com.zhouzy.sjms.model.Observer;
/***
* 抽象被观察者接口
* 声明了添加、删除、通知观察者方法
* @author jstao
*
*/
public interface IObserver {
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObserver();
}
4、具体的被观察者对象
package com.zhouzy.sjms.service;
import java.util.ArrayList;
import java.util.List;
import com.zhouzy.sjms.model.Observer;
public class ObserverImp implements IObserver{
//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
private List<Observer> list;
private String message;
public ObserverImp(){
list = new ArrayList<Observer>();
}
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
list.remove(observer);
}
@Override
public void notifyObserver() {
list.forEach(observer -> {//遍历通知订阅过的观察者
observer.receive(message);
});
}
public void doProcess(){//观察的对象处理业务逻辑,某件事通知已订阅的观察者
System.out.println("正在处理业务逻辑");
System.out.println("处理完了,接下来通知观察者");
String message = "我是你订阅的客服,提醒你服务已到期";
this.message = message;
notifyObserver();
}
}
5、测试
package com.zhouzy.sjms.observer;
import org.junit.Test;
import com.zhouzy.sjms.model.Customer1;
import com.zhouzy.sjms.model.Customer2;
import com.zhouzy.sjms.model.Observer;
import com.zhouzy.sjms.service.ObserverImp;
public class ObserverTest {
@Test
public void testObserver() {
ObserverImp observer = new ObserverImp();
Observer c1 = new Customer1("张三");
Observer c2 = new Customer2("李四");
observer.addObserver(c1);//添加观察者
observer.addObserver(c2);
observer.doProcess();
observer.removeObserver(c1);//删除观察者
observer.doProcess();
}
}
完美实现!