觀察者模式定義了一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象發生改變時,會通知所有觀察者對象,使他們能夠自動更新自己
缺點:需要維護相關對象間的一致性。我們不希望爲了維持一致性而使各類緊密耦合,這樣會給維護、擴展和重用都帶來不便
優點:相互耦合,讓耦合的雙方都依賴於抽象,而不是具體依賴於具體,從而使得各自的變化都不會影響另一邊的變化
觀察者類一般有增加觀察者。減少觀察者,通知,通知者狀態四個方法。
其他類實現觀察這類四個方法
UML:
JAVA:
public class ObserverTest {
public static void main(String[] args) {
Boss boss = new Boss();
Observer observer1 = new StockObserver("lili",boss);//lili,觀察boss
Observer observer2 = new StockObserver("lilei",boss);//lilei,觀察boss
boss.attach(observer1);
boss.attach(observer2);
boss.detach(observer2);
boss.setSubjectState(true);
boss.notifying();
}
}
//抽象觀察者
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();
}
//例如看股票的同事 在觀察老闆有沒有回來
class StockObserver extends Observer{
public StockObserver(String name, Subject sub) {
super(name, sub);
}
@Override
public void Update() {
System.out.println(sub.getSubjectState()+" "+name+" 關閉股票行情,繼續工作");
}
}
//通知者
interface Subject{
void attach(Observer observer);
void detach(Observer observer);
void notifying();
boolean getSubjectState();
void setSubjectState(boolean subjectState);
}
class Boss implements Subject{
List<Observer> observers = new ArrayList<>();
boolean subjectState = false; //true在,false不在
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifying() {
for (Observer o:observers ) {
o.Update();
}
}
@Override
public boolean getSubjectState() {
return subjectState;
}
@Override
public void setSubjectState(boolean subjectState) {
this.subjectState = subjectState;
}
}