觀察者模式由四個角色組成:抽象主題角色,抽象觀察者角色,具體主題角色,抽象觀察者角色,具體觀察者角色。
抽象主題角色(Subject):把所有的觀察者角色的引用保存在一個集合中,可以有任意數量的觀察者。其提供一個接口,可以添加、刪除觀察者,並可以向登記過的觀察者發送通知。
具體主題角色(Observer):實現了抽象主題角色提供的接口的一個具體類。
抽象觀察者角色(ConcreteSubject):提供一個借口,以接收主題角色發送的通知。
具體觀察者角色(ConcreteObserver):實現了抽象觀察者角色提供的接口的一個具體類。
類圖

JAVA代碼:
package com.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 抽象主題角色,被觀察
* @author hyp
*
*/
public interface Subject
{
void addWatcher(Watcher watcher);
void removeWatcher(Watcher watcher);
void notify(String message);
}
/**
* 抽象觀察者角色,觀察主題
* @author hyp
*
*/
public interface Watcher
{
void update(String message);
}
/**
* 具體主題角色
* @author hyp
*
*/
public class ConcreteSubject implements Subject
{
private List<Watcher> watchers = new ArrayList<Watcher>();
@Override
public void addWatcher(Watcher watcher)
{
watchers.add(watcher);
}
@Override
public void removeWatcher(Watcher watcher)
{
watchers.remove(watcher);
}
@Override
public void notify(String message)
{
for(Watcher w:watchers)
{
w.update(message);
}
}
}
/**
* 具體觀察者橘色
* @author hyp
*
*/
public class ConcreteWatcher implements Watcher
{
@Override
public void update(String message)
{
System.out.println(this.toString()+ ":" + message);
}
}
/**
* 測試觀察者模式
* @author hyp
*
*/
public class Test
{
public static void main(String[] args)
{
Subject subject= new ConcreteSubject();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();
Subject.addWatcher(watcher1);//添加觀察者
Subject.addWatcher(watcher2);
Subject.addWatcher(watcher3);
Subject.notify("Hello");//通知所有觀察者
Subject.removeWatcher(watcher1);//移除一個觀察者
Subject.notify("bye~");
}
}