目录
观察者模式中的角色
- 被观察者(observable)
- 观察者(observer)
通过一个简单案例来演示观察者模式
被观察者接口
/**
* 被观察者
*/
public interface Observable {
/**
* 添加观察者
*/
void addObserver(Observer observer);
/**
* 移除观察者
*/
void delObserver(Observer observer);
/**
* 通知观察者
*/
void advice(String msg, EventType eventType);
}
事件类型
/**
* 事件类型
*/
public enum EventType {
NEW_COMPOSITION(1, "发布了新作品,点击查看新作品"),
LIVE_BROADCAST(2, "正在直播中,前去观看");
private final Integer key;
private final String desc;
EventType(Integer key, String desc) {
this.key = key;
this.desc = desc;
}
public Integer getKey() {
return key;
}
public String getDesc() {
return desc;
}
}
up主类作为被观察者
import java.util.ArrayList;
import java.util.List;
/**
* up主(被观察者)
*/
public class UpOwner implements Observable {
// 维护一个观察者集合
private final List<Observer> observers = new ArrayList<>();
private final Integer id;
private final String name;
public UpOwner(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public void addObserver(Observer observer) {
if (!observers.contains(observer)) {
observers.add(observer);
}
}
@Override
public void delObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void advice(String msg, EventType eventType) {
for (Observer observer : observers) {
observer.take(msg, eventType);
}
}
/**
* 发布新作品
*/
public void uploadComposition() {
advice(buildMsg(), EventType.NEW_COMPOSITION);
}
/**
* 开始直播
*/
public void beginLive() {
advice(buildMsg(), EventType.LIVE_BROADCAST);
}
public String buildMsg() {
return String.format("您关注的up主[%s-%s]", getId(), getName());
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
}
观察者接口
package sjms.observer;
/**
* 观察者
*/
public interface Observer {
/**
* 被观察者执行的动作会触发该方法
*/
void take(String msg, EventType eventType);
}
粉丝类作为观察者
/**
* 粉丝(观察者)
*/
public class Fan implements Observer {
private final Integer id;
private final String name;
public Fan(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public void take(String msg, EventType eventType) {
System.out.println(this + "接收到消息:{" + msg + eventType.getDesc() + "}");
}
@Override
public String toString() {
return "粉丝[" + id + "-" + name + ']';
}
}
测试
public class MainTest {
public static void main(String[] args) {
// up主一
UpOwner up = new UpOwner(0, "up主一");
// 粉丝1、粉丝2、粉丝3
Observer fan1 = new Fan(1, "fan1");
Observer fan2 = new Fan(2, "fan2");
Observer fan3 = new Fan(3, "fan3");
// 粉丝1、粉丝2关注了up主一
up.addObserver(fan1);
up.addObserver(fan2);
// 此时up主一发布一条新作品,粉丝1、粉丝2能收到信息并做出反应,粉丝3并没有关注up主一,所以收不到信息
up.uploadComposition();
System.out.println("------显眼的分界线------");
// 粉丝1取关了up主一
up.delObserver(fan1);
// 粉丝3关注了up主一
up.addObserver(fan3);
// 此时up主一开启了直播,粉丝2、粉丝3能收到消息并做出反应,粉丝1已经取关了up主一,所以收不到消息
up.beginLive();
}
}