观察者设计模式
课程大纲
一、 观察者模式原理
1、观察者模式定义:简单的说观察者模式定义了一个一对多的依赖关系,让一个或者多个观察者对象监察一个主题对象,这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
二、 观察者模式实现
1、 Subject(被观察的对象接口)
(1)、规定ConcreteSubject的统一接口
(2)、每个Subject可以有多个Observer
2、ContreteSubject(具体被观察对象)
(1)、维护所有具体观察者的引用的列表
(2)、状态发生改变时会通知所有注册的观察者
3、Observer(观察者接口)
(1)、规定了ConcreteObserver的统一接口
(2)、定义了一个Update()方法,在被观察者对象的状态改变时会被调用。
4、ConcreteObserver(具体观察者)
(1)、维护一个对ConcreteSubject的引用
(2)、特定状态与ConcreteSubject同步
(3)、实现Observer接口,通过update()方法接收ConcreteSubject的通知。
三、 观察者模式作用
1、 观察者模式在被观察者和观察者对象之间建立一个抽象的耦合,被 观察者角色所知道的只是一个具体观察者列表。
2、 由于观察者和被观察者没有紧密的耦合在一起,因此他们可以属于不同的抽象化层次,如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
3、 观察者模式支持广播通讯,被观察者会向所有的登记过的观察者发出通知。
代码
观察者接口
package com.guanchazhe;
/**
* 观察者接口
* @author Administrator
*
*/
public interface Observer {
/**
* 观察者更新信息的方法
* @param price
*/
void update(float price);
}
被观察者接口
package com.guanchazhe;
/**
* 被观察者接口
* @author Administrator
*
*/
public interface Subject {
/**
* 注册一个观察者
* @param o
*/
void registerObserver(Observer o);
/**
* 删除观察者
* @param o
*/
void deleteObserver(Observer o);
/**
* 通知观察者(跟新信息)
* @param o
*/
void notifyObserver();
}
具体的被观察者对象
package com.guanchazhe;
import java.util.Vector;
/**
* 具体的被观察者
* @author Administrator
*
*/
public class Doll implements Subject{
//被观察者维护的是一个观察者对象的列表(集合里面存放的都是观察者对象)
private Vector<Observer> v = new Vector<Observer>();
private float price;//布娃娃的价格
public Doll(float price) {
this.price = price;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
//修改价格时,通知所有的观察者
this.price = price;
notifyObserver();
}
@Override
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
v.add(o);
}
@Override
public void deleteObserver(Observer o) {
// TODO Auto-generated method stub
v.remove(o);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
//通知所有的观察者和对象
for (Observer o : v) {
o.update(price);
}
}
}
具体的观察者对象
package com.guanchazhe;
/**
* 具体的观察者对象
* @author Administrator
*
*/
public class Person implements Observer{
private String name;
public Person(String name) {
this.name = name;
// TODO Auto-generated constructor stub
}
@Override
public void update(float price) {
// TODO Auto-generated method stub
System.out.println(name+"关注的娃娃 的价格已经更新为:"+price);
}
}
测试类
package com.guanchazhe;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个被 观察者对象
Doll doll = new Doll(3000);
//创建两个观察者对象
Person p1 = new Person("小白");
Person p2 = new Person("小黑");
//注册成为观察者
doll.registerObserver(p1);
doll.registerObserver(p2);
System.out.println("第一轮促销:");
doll.setPrice(2800);
System.out.println("第二轮促销:");
doll.setPrice(2599);
System.out.println("第三轮促销:");
doll.setPrice(1988);
doll.deleteObserver(p2);
System.out.println("第四轮促销:");
doll.setPrice(1599);
}
}