觀察者模式(Observer Pattern):定義對象之間的一種一對多依賴關(guān)系广恢,使得每當一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新菩颖。
1噪珊、抽象主題(Subject)
:
它把所有觀察者對象的引用保存到一個聚集里,每個主題都可以有任何數(shù)量的觀察者饰豺。抽象主題提供一個接口亿鲜,可以增加和刪除觀察者對象。
2冤吨、具體主題(Concrete Subject)
:
將有關(guān)狀態(tài)存入具體觀察者對象蒿柳;在具體主題內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知漩蟆。
3垒探、抽象觀察者(Observer)
:
為所有的具體觀察者定義一個接口,在得到主題通知時更新自己怠李。
4圾叼、具體觀察者(Concrete Observer)
:
實現(xiàn)抽象觀察者角色所要求的更新接口蛤克,以便使本身的狀態(tài)與主題狀態(tài)協(xié)調(diào)。
觀察模式.png
import java.util.ArrayList;
import java.util.List;
/**
* @author apple
*
* 被觀察者
*
*/
public abstract class Subject {
private List<IObserver> observers = new ArrayList<IObserver>();
void attchObserver(IObserver observer) {
observers.add(observer);
}
void detachObserver(IObserver observer) {
observers.remove(observer);
}
void notifyObserver() {
for (IObserver observer : observers) {
observer.update();
}
}
}
/**
*
* @author apple
*
* 具體被觀察者
*
*/
public class RealSubject extends Subject {
public void dosomething() {
super.notifyObserver();
}
}
/**
*
* @author apple
*
* 觀察者
*
*/
public interface IObserver {
void update();
}
/**
*
* @author apple
*
* 具體觀察者
*
*/
public class RealObserver implements IObserver {
public void update() {
// TODO Auto-generated method stub
System.out.println("接受到信息夷蚊,更新通知");
}
}
/**
*
* @author apple
*
* 測試(場景)類
*
*/
public class Client {
public static void main(String[] args) {
RealSubject realsubject = new RealSubject();
realsubject.attchObserver(new RealObserver());
realsubject.dosomething();
}
}
使用場景
當一個抽象模型有兩個方面构挤,其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復(fù)用