觀察者模式是什麼?
觀察者模式的適用範圍
1. 一個抽象模型有兩個方面,其中一個方面依賴於另一個方面,將這兩者方莊在獨立的對象中以使它們可以各自獨立地改變和複用。
2. 當對一個對象的改變需要同時改變其他對象,而不知道具體有多少對象有待改變時。
3. 當一個對象必須通知其他對象,而它又不能假定其他對象是誰,即不希望這些對象是緊耦合的。
觀察者模式的示例
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
import java.util.ArrayList;
public class Product implements Subject{
private ArrayList<Observer> observers = new ArrayList<Observer>();
private String productName;
private String productType;
String availability;
public Product(String productName, String productType,String availability) {
super();
this.productName = productName;
this.productType = productType;
this.availability=availability;
}
public ArrayList<Observer> getObservers() {
return observers;
}
public void setObservers(ArrayList<Observer> observers) {
this.observers = observers;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductType() {
return productType;
}
public void setProductType(String productType) {
this.productType = productType;
}
public String getAvailability() {
return availability;
}
public void setAvailability(String availability) {
this.availability = availability;
notifyObservers();
}
public void notifyObservers() {
System.out.println("Notifying to all the subscribers when product became available");
for (Observer ob : observers) {
ob.update(this.availability );
}
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
}
public interface Observer {
public void update(String availability);
}
public class Person implements Observer{
String personName;
public Person(String personName) {
this.personName = personName;
}
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
public void update(String availabiliy) {
System.out.println("Hello "+personName+", Product is now "+availabiliy+" on flipkart");
}
}
測試:public class ObserverPatternMain {
/**
* @Author arpit mandliya
*/
public static void main(String[] args) {
Person arpitPerson=new Person("Arpit");
Person johnPerson=new Person("John");
Product samsungMobile=new Product("Samsung", "Mobile", "Not available");
//When you opt for option "Notify me when product is available".Below registerObserver method
//get executed
samsungMobile.registerObserver(arpitPerson);
samsungMobile.registerObserver(johnPerson);
//Now product is available
samsungMobile.setAvailability("Available");
}
}