目錄
觀察者模式中的角色
通過一個簡單案例來演示觀察者模式
被觀察者接口
事件類型
up主類作為被觀察者
觀察者接口
?粉絲類作為觀察者
測試
測試結果
觀察者模式中的角色
- 被觀察者(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;}@Overridepublic void addObserver(Observer observer) {if (!observers.contains(observer)) {observers.add(observer);}}@Overridepublic void delObserver(Observer observer) {observers.remove(observer);}@Overridepublic 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;}@Overridepublic void take(String msg, EventType eventType) {System.out.println(this + "接收到消息:{" + msg + eventType.getDesc() + "}");}@Overridepublic String toString() {return "粉絲[" + id + "-" + name + ']';}
}
測試
public class MainTest {public static void main(String[] args) {// up主一UpOwner up = new UpOwner(0, "up主一");// 粉絲1、粉絲2、粉絲3Observer 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();}
}