设计模式之【观察者模式】
目录
观察者模式中的角色
通过一个简单案例来演示观察者模式
被观察者接口
事件类型
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();}
}