被观察者基类
package com.meteor.design_pattern.observer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by Meteor on 2016/3/27.
*/
public abstract class Observable {
List<Observer> observers = new ArrayList<Observer>();
public void registObserver(Observer o){
observers.add(o);
}
public void removeObserver(Observer o){
observers.remove(o);
}
public void notifyObservers(Object value){
for (Iterator it = observers.iterator();it.hasNext();){
Observer o = (Observer)it.next();
o.update(this,value);
}
}
}
产品类继承被观察者基类
package com.meteor.design_pattern.observer;
/**
* Created by Meteor on 2016/3/27.
*/
public class Product extends Observable {
private String name;
private double price;
public Product(){}
public Product(String name,double price){
this.name = name;
this.price = price;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
//产品名称改变时通知观察者
notifyObservers(name);
}
public double getPrice(){
return this.price;
}
public void setPrice(double price){
this.price = price;
//产品价格改变时通知观察者
notifyObservers(price);
}
}
观察者接口
package com.meteor.design_pattern.observer;
/**
* Created by Meteor on 2016/3/27.
*/
public interface Observer {
void update(Observable o,Object arg);
}
产品名称观察者实现观察者接口
package com.meteor.design_pattern.observer;
/**
* Created by Meteor on 2016/3/27.
*/
public class NameObserver implements Observer {
public void update(Observable o, Object arg) {
if(arg instanceof String){
String name = (String)arg;
System.out.println("观察者"+o+"名称已改变为:"+name);
}
}
}
产品价格观察者实现观察者接口
package com.meteor.design_pattern.observer;
/**
* Created by Meteor on 2016/3/27.
*/
public class PriceObserver implements Observer {
public void update(Observable o, Object arg) {
if(arg instanceof Double){
Double price = (Double)arg;
System.out.println("观察者"+o+"价格已改变为:"+price);
}
}
}
TEST
package com.meteor.design_pattern.observer;
/**
* Created by Meteor on 2016/3/27.
*/
public class ObserverTest {
public static void main(String[] args) {
Product product = new Product("car",12000);
NameObserver nameObserver = new NameObserver();
PriceObserver priceObserver = new PriceObserver();
product.registObserver(nameObserver);
product.registObserver(priceObserver);
product.setName("house");
product.setPrice(500000);
}
}
RESULT
观察者com.meteor.design_pattern.observer.Product@6d6f6e28名称已改变为:house
观察者com.meteor.design_pattern.observer.Product@6d6f6e28价格已改变为:500000.0