观察者模式是什么?
观察者模式定义了对象间一种一对多的依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式的适用范围
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");
}
}
链接:http://www.codeproject.com/Articles/565642/Observer-design-pattern-in-java