import java.util.ArrayList;
/**
* 观察者模式
* 组成:被观察的接口、观察者接口、被观察具体对象、观察者具体对象
* 应用:GUI的事件监听
* @author fantasy
*
*/
public class ObserverTest {
public static void main(String[] args) {
Price p = new Price(30.0f);
Person p1 = new Person("李雷");
Person p2 = new Person("韩梅梅");
System.out.println("-------------自己封装-------------");
p.addObserver(p1);
p.addObserver(p2);
p.setPrice(20.0f);
System.out.println("-------------使用JDK的api-------------");
Price2 pr = new Price2(30.0f);
Person2 p12 = new Person2("李雷2");
Person2 p22 = new Person2("韩梅梅2");
pr.addObserver(p12);
pr.addObserver(p22);
pr.setPrice(20.0f);
}
}
//被观察者接口
interface Observable{
public void addObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
//观察者接口
interface Observer{
public void update(float price);
}
//具体的被观察者
class Price implements Observable{
private ArrayList<Observer> list = new ArrayList<Observer>();
private float price;
public Price(float price){
this.price = price;
}
@Override
public void addObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
list.remove(o);
}
@Override
public void notifyObservers() {
for(Observer o:list){
o.update(price);
}
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
notifyObservers();//通知所有的观察者
}
}
//具体的观察者
class Person implements Observer{
private String name;
public Person(String name){
this.name = name;
}
@Override
public void update(float price) {
System.out.println(name+"得到价格:"+price);
}
}
class Price2 extends java.util.Observable{
private float price;
public Price2(float price){
this.price = price;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
this.setChanged();//设置changed=true
this.notifyObservers();
}
}
class Person2 implements java.util.Observer{
private String name;
public Person2(String name){
this.name = name;
}
@Override
public void update(java.util.Observable o, Object arg) {
if(o instanceof Price2){
Price2 p2 = (Price2)o;
System.out.println(name+":"+p2.getPrice());
}
}
}