觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽一個主題對象。這個主題對象再狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
主方法
/**
* 觀察者模式又可以稱作為發(fā)布-訂閱(Publish/Subscribe)模式
*/
public class main {
public static void main(String[] args) {
Boss boss = new Boss();
StockObserver stockObserver = new StockObserver("魏關(guān)姹", boss);
NBAObserver nbaObserver = new NBAObserver("易管查", boss);
boss.Attach(stockObserver);//股票者對BOSS添加觀察
boss.Attach(nbaObserver);//NBA球迷對BOSS添加觀察
boss.Detach(stockObserver);//股票者解除觀察,解除訂閱
boss.setSubjectState("我胡漢三回來了");//被觀察者狀態(tài)改變,換成秘書更好理解一些
boss.Notify();//通知到所有訂閱的觀察者
}
}
抽象主題類
/**
* 主題或抽象通知者,他爸所有對觀察者對象的引用保存在一個聚集中,
*/
public interface Subject {
void Attach(Observer observer);
void Detach(Observer observer);
void Notify();
String getSubjectState();
void setSubjectState(String value);
}
抽象觀察者類
/**
* 觀察者抽象父類
*/
public abstract class Observer {
protected String name;
protected Subject sub;
public Observer(String name, Subject sub) {
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
主題類實現(xiàn)類,被觀察者
import java.util.ArrayList;
import java.util.List;
/**
* 被觀察者實現(xiàn)類,也可以叫做具體主題或者具體通知者
*/
public class Boss implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
private String status;//主題的狀態(tài)
public void Attach(Observer observer) {
observers.add(observer);
}
public void Detach(Observer observer) {
observers.remove(observer);
}
public void Notify() {
for (Observer o: observers) {
o.Update();
}
}
public String getSubjectState() {
return status;
}
public void setSubjectState(String value) {
status = value;
}
}
觀察者1(也可以叫做訂閱者)
/**
* 炒股的觀察者
*/
public class StockObserver extends Observer {
public StockObserver(String name, Subject sub) {
super(name, sub);
}
public void Update() {
System.out.println("{" + sub.getSubjectState() + "}{" + name + "}關(guān)閉股票行情,繼續(xù)工作!");
}
}
觀察者2
/**
* NBA觀察者
*/
public class NBAObserver extends Observer {
public NBAObserver(String name, Subject sub) {
super(name, sub);
}
public void Update() {
System.out.println("{" + sub.getSubjectState() + "}{" + name + "}關(guān)閉NBA直播,繼續(xù)工作!");
}
}