hand first 设计模式 --观察者模式
2009-09-17 00:00:00 来源:WEB开发网利用java api 实行观察者模式
1.推模式(主题将一样数据发生给所有的观察者)
主题
Java代码
public class WeacherData extends Observable {
private int data1;
private int data2;
public void update(){
this.setChanged();
//这里将WeacherData 对象传递给观察者属于推模式
this.notifyObservers(this);
}
public int getData1() {
return data1;
}
public int getData2() {
return data2;
}
public void setData(int data1,int data2){
this.data1 = data1;
this.data2 = data2;
}
}
观察者
Java代码
public class ClientData implements Observer {
Observable obser;
private int data1;
private int data2;
public ClientData(Observable obser){
this.obser = obser;
obser.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(o instanceof WeacherData ){
WeacherData w = (WeacherData)arg;
//data = w.getData1();
data1 = w.getData1();
data2 = w.getData2();
display();
}
}
public void display(){
System.out.println("data1 is "+data1+" and data2 is "+data2);
}
}
2.拉模式(不同的观察者有选择的获取想要的数据)
Java代码
public class WeacherData extends Observable {
private int data1;
private int data2;
public void update(){
this.setChanged();
//没有传递数据给观察者
this.notifyObservers();
}
public int getData1() {
return data1;
}
public int getData2() {
return data2;
}
public void setData(int data1,int data2){
this.data1 = data1;
this.data2 = data2;
}
}
Java代码
public class ClientData implements Observer {
Observable obser;
private int data1;
private int data2;
public ClientData(Observable obser){
this.obser = obser;
obser.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(o instanceof WeacherData ){
WeacherData w = (WeacherData)o;
//观察都根据需求,得到想要的数据
data1 = w.getData1();
//data2 = w.getData2();
display();
}
}
public void display(){
System.out.println("data1 is "+data1+" and data2 is "+data2);
}
}
测试
Java代码
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeacherData data = new WeacherData();
ClientData client = new ClientData(data);
data.setData(1, 2);
}
}
注意观察都显示结果是无序的.
缺点:
主题类不能再继承其他类了.
设计原则
为交互对象之间松耦合设计
- ››设计模式一 - Simple Factory, Factory Method, A...
- ››设计模式重构应用---Decorator模式
- ››设计模式重构应用---Template Method模式
- ››hand first 设计模式 --策略模式
- ››hand first 设计模式 --观察者模式
- ››hand first 设计模式 - 装饰者模式
- ››hand first 设计模式 - 工厂模式
- ››hand first 设计模式 - 抽象工厂模式
- ››hand first 设计模式 - 单例模式
- ››hand first 设计模式 - 命令模式
- ››hand first 设计模式 -适配器模式
- ››hand first 设计模式 -外观模式
赞助商链接