1. 程式人生 > >設計模式:觀察者模式(Observer Pattern)

設計模式:觀察者模式(Observer Pattern)

目錄

一、模式含義

觀察者模式(Observer Pattern):定義物件之間的一種一對多依賴關係,使得每當一個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。

觀察者模式的別名:包括釋出-訂閱(Publish/Subscribe)模式模型-檢視(Model/View)模式源-監聽器(Source/Listener)模式從屬者(Dependents)模式

觀察者模式是一種物件行為型模式。

1.1Subject(目標):

目標又稱為主題,它是指被觀察的物件。在目標中定義了一個觀察者集合,一個觀察目標可以接受任意數量的觀察者來觀察,它提供一系列方法來增加和刪除觀察者物件,同時它定義了通知方法notify()。目標類可以是介面,也可以是抽象類或具體類。

1.2ConcreteSubject(具體目標):

具體目標是目標類的子類,通常它包含有經常發生改變的資料,當它的狀態發生改變時,向它的各個觀察者發出通知;同時它還實現了在目標類中定義的抽象業務邏輯方法(如果有的話)。如果無須擴充套件目標類,則具體目標類可以省略。

1.3Observer(觀察者):

觀察者將對觀察目標的改變做出反應,觀察者一般定義為介面,該介面聲明瞭更新資料的方法update(),因此又稱為抽象觀察者。

1.4ConcreteObserver(具體觀察者):

在具體觀察者中維護一個指向具體目標物件的引用,它儲存具體觀察者的有關狀態,這些狀態需要和具體目標的狀態保持一致;它實現了在抽象觀察者Observer中定義的update()方法。通常在實現時,可以呼叫具體目標類的attach()方法將自己新增到目標類的集合中或通過detach()方法將自己從目標類的集合中刪除

二、示例程式碼

2.1Subject(目標):

package com.yan.pattern.observer.define;

public interface Subject {
	public void addLisener(Observer o);
	
	public void removeLisener(Observer o);
	
	public void notiseObservers();
}

2.2ConcreteSubject(具體目標):

package com.yan.pattern.observer.define;

import java.util.ArrayList;
import java.util.List;

public class ConcreteSubject implements Subject{
	List<Observer> lists = new ArrayList<Observer>();
	
	public void addLisener(Observer o) {
		lists.add(o);
	}
	
	public void removeLisener(Observer o) {
		lists.remove(o);
	}
	
	private String message;
	
	public void setMessage(String message) {
		this.message = message;
		notiseObservers();
	}
	
	public void notiseObservers() {
		for(Observer observer : lists) {
			observer.showMessage(message);
		}
	}
}

2.3Observer(觀察者):

package com.yan.pattern.observer.define;


public abstract class Observer {
	public abstract void showMessage(String message);

}

2.4ConcreteObserver(具體觀察者):

package com.yan.pattern.observer.define;

public class CatObserver extends Observer{

	public void showMessage(String message) {
		System.out.println("我是貓觀察者,我接收了:" + message);
	}

}
package com.yan.pattern.observer.define;

public class DogObserver extends Observer{
	public void showMessage(String message) {
		System.out.println("我是狗觀察者,我接收了:" + message);
	}
}

2.5Client(模擬客戶端使用觀察者模式):

package com.yan.pattern.observer.define;

public class Client {
	public static void main(String[] args) {
		
		ConcreteSubject  observable = new ConcreteSubject();//能被觀察的
		
		Observer observer = new CatObserver();//觀察者
		observable.addLisener(observer);
		
		Observer observer2 = new DogObserver();
		observable.addLisener(observer2);
		
		observable.setMessage("我是能被觀察的  訊息");
		
		System.out.println("---------------------");
		
		observable.removeLisener(observer);
		
		observable.setMessage("我又更新了新訊息");
		
	}
}