案例:
- 定義被觀察者
/**
* @author Gjing
* 抽象被觀察者
**/
abstract class AbstractSubject {
/**
* 觀察者對象的集合
*/
private List<Listener> listenerList = new ArrayList<>();
/**
* 添加觀察者
*
* @param listener 觀察者
*/
void add(Listener listener) {
listenerList.add(listener);
}
/**
* 通知所有觀察者
*/
void notifyObserver() {
for (Listener listener : listenerList) {
listener.update("通知所有觀察者,按鈕被點擊。。。。。。");
}
}
}
/**
* @author Gjing
* 具體被觀察者
**/
class AbstractSubjectA extends AbstractSubject {
void click() {
System.out.println("按鈕被點擊");
notifyObserver();
}
}
- 定義觀察者
/**
* @author Gjing
* 抽象觀察者
**/
public interface Listener {
String getName();
/**
* 通知更新方法
*
* @param message 消息
*/
void update(String message);
}
/**
* @author Gjing
* A觀察者
**/
class ListenerA implements Listener {
@Override
public String getName() {
return "觀察者A";
}
@Override
public void update(String message) {
System.out.println("觀察者A收到消息更新:" + message);
}
}
/**
* @author Gjing
* 觀察者B
**/
class ListenerB implements Listener {
@Override
public String getName() {
return "觀察者B";
}
@Override
public void update(String message) {
System.out.println("觀察者B收到消息更新:" + message);
}
}
- 調用
/**
* @author Gjing
**/
public class Test {
public static void main(String[] args) {
//創建被觀察者
AbstractSubjectA subjectA = new AbstractSubjectA();
//添加觀察者
subjectA.add(new ListenerA());
subjectA.add( new ListenerB());
//被觀察者行動
subjectA.click();
}
}
優點
- 觀察者和被觀察者之間抽象耦合。觀察者模式容易擴展,被觀察者只持有觀察者集合,並不需要知道具體觀察者內部的實現。
- 對象之間的保持高度的協作。當被觀察者發生變化時,所有被觀察者都會通知到,然後做出相應的動作。
缺點
- 如果觀察者太多,被觀察者通知觀察者消耗的時間很多,影響系統的性能。
- 當觀察者集合中的某一觀察者錯誤時就會導致系統卡殼,因此一般會採用異步方式。
以上爲個人理解,如有誤歡迎各位指正