Observer
處理物件一對多的關係,當被觀察者的狀態改變,觀察者們會收到通知並更新。也稱發布訂閱模式(Publish/Subscribe)
from: Observer Pattern Tutorial with Java Examples
Example
訂閱報紙
Subject
pubilc interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
public class NewspaperOffice implements Subject() {
// 使用 List 來記錄所有訂閱者
List mObservers;
// 報紙內容
String mContent;
public NewspaperOffice()
{
mObservers = new ArrayList();
mContent = "";
}
public void sendNewspaper(String content)
{
mContent = content;
notifyObservers();
}
@Override
public void registerObserver(Observer o)
{
mObservers.add(o);
}
@Override
public void removeObserver(Observer o)
{
int i = mObservers.indexOf(0);
if(i > 0)
mObservers.remove(i);
}
@Override
public void notifyObservers()
{
for(int i = 0; i < mObservers.size(); i++)
{
Observer o = mObservers.get(i);
o.update(mContent);
}
}
}
Observer
public interface Observer {
public void update(String content);
}
public class Customer implements Observer {
// 訂閱者名稱
String mName;
public Customer(String name)
{
mName = name;
}
@Override
public void update(String content)
{
System.out.println(name + "get newspaper: "
+ content);
}
}
Usage
public class Test {
public static void main(String[] args)
{
// 建立報社
NewspaperOffice office = new NewspaperOffice();
// 訂閱者 Tom
Customer Tom = new Customer("Tom");
// 訂閱者 Peter
Customer Peter = new Customer("Peter");
// 訂閱者訂報紙
office.registerObserver(Tom);
office.registerObserver(Peter);
// 報社送報紙囉
office.sendNewspaper("Newspaper 1...");
// Tom 不想訂報紙了
office.removeObserver(Tom);
office.sendNewspaper("Newspaper 2...");
}
}
from: 觀察者模式 (Observer Pattern)
其他
- Java有內建
java.util.Observable
和java.util.Observer