Java實作觀察者模式
觀察者模式,簡單來說就是一對多的依賴,并且把觀察者和被觀察者對象分開松耦合
當某個對象的狀态發生更新時,所有依賴的觀察者都會收到更新,而斷掉依賴的則不在收到
代碼實作:
主題:售樓處的某位員工向有興趣的使用者群發房源降價的消息
1、建立觀察者接口Observer
public interface Observer {
//觀察者接口
void update(String msg);
}
2、建立被觀察者接口
public interface Subject {
//被觀察者的接口:注冊、取消注冊、觀察通知
void reg(Observer obs);
void unreg(Observer obs);
void sendMessage(String msg);
}
3、被觀察者的實作類
public class Building implements Subject {
List<Observer> obses = new ArrayList<Observer>();
//注冊
@Override
public void reg(Observer obs) {
obses.add(obs);
}
//取消注冊 拉黑
@Override
public void unreg(Observer obs) {
if (!obses.isEmpty()&&obses.contains(obs)){
obses.remove(obs);
}
}
//發消息,群發
@Override
public void sendMessage(String msg) {
for (Observer obs : obses) {
obs.update("某個售樓處的小姐姐:"+msg);
}
}
}
4、觀察者的實作類
public class Yourself implements Observer{
private String yourName;
public Yourself(String yourName) {
this.yourName = yourName;
}
@Override
public void update(String msg) {
System.out.println(yourName+"接到"+msg);
}
}
5、main方法
public class App {
public static void main(String[] args) {
//建立一個售樓處的小姐姐(生産者)
Subject sister = new Building();
//建立3個觀察者(消費者)
Observer ys1 = new Yourself("張三");
Observer ys2 = new Yourself("李四");
Observer ys3 = new Yourself("王五");
//去售樓處加小姐姐的微信
sister.reg(ys1);
sister.reg(ys2);
sister.reg(ys3);
//某天李四通知小姐姐取消訂閱,說我不看了别發我了
sister.unreg(ys2);
//樓盤價格降了,售樓處的小姐姐通過加的微信通知觀察者
sister.sendMessage("樓房價格降低了");
}
}
6、輸出
可以看到李四取消訂閱後,已經收不到消息了
“樓房價格降低了”);
}
}
6、輸出
可以看到李四取消訂閱後,已經收不到消息了
[外鍊圖檔轉存中...(img-aH8ede5k-1616731575003)]