设计模式之观察者模式

定义:

       定义了对象之间的一对多依赖关系,当一个对象改变时,其他依赖者都会收到消息并自动更新。

类图:

 

引用例子    1、我们将被依赖对象称为对象,依赖者称为对象的观察者。可以用订报纸的例子:订阅者 + 报纸 = 观察者模式

                   2、要实现一些布告板,布告板的信息来自于气象站,有各种不同的布告板,有的显示湿度、有的显示温度、天气预报等。

观察者模式实现方案:  Object气象站  oberver布告板  (由于布告板也有一些命名等通用属性所以也要进行接口抽象)

1 package com.observer;
2 
3 public interface Subject {//主题对象接口,包括对观察者的增删改查 消息通知 要在子类实现
4     public boolean remove(Observer o);
5     public boolean add(Observer o);
6     public void setChanged();
7     public void notifyObserver();
8 }
 1 package com.observer;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class ConcreateSubject implements Subject {
 6     //用来存储观察者对象的集合
 7     private ArrayList<Observer> Observerlist;
 8     //气象站的信息属性
 9     private float temperature;
10     private float humidity;
11     private float pressure;
12     private boolean isChanged;
13     //气象站构造函数,初始化,ischanged可以实现不是连续更新,而是设置间隔时间等
14     public ConcreateSubject(){
15         this.Observerlist = new ArrayList<>();
16         this.isChanged = false;
17     }
18     @Override
19     public boolean remove(Observer o) {//删除观察者
20         // TODO Auto-generated method stub
21         if(!this.Observerlist.contains(o))
22             return false;
23         return this.Observerlist.remove(o);
24     }
25 
26     @Override
27     public boolean add(Observer o) {//添加观察者
28         // TODO Auto-generated method stub
29         if(this.Observerlist.contains(o))
30             return false;
31         return this.Observerlist.add(o);
32     }
33 
34     @Override
35     public void setChanged() {//设置间隔
36         // TODO Auto-generated method stub
37         if(isChanged)
38             isChanged = false;
39         else
40             isChanged = true;
41         
42     }
43 
44     @Override
45     public void notifyObserver() {//将消息以推的方式告诉所有观察者
46         // TODO Auto-generated method stub
47             for(int i=0;i<this.Observerlist.size();i++){
48                 Observer o = (Observer)this.Observerlist.get(i);
49                 o.update(this.temperature,this.humidity,this.pressure);
50             }
51     }
52     //设置气象站信息
53     public void setMeasurments(float temperature,float humidity,float prssure){
54         this.humidity = humidity;
55         this.pressure = prssure;
56         this.temperature = temperature;
57     }
58 
59 }
1 package com.observer;
2 
3 public interface Observer {//观察者接口,所有观察者都要实现一个update方法,以便主题对象
4     //以推的方式向自己发送消息
5     public void update(float temperature, float humidity, float pressure);
6 }
package com.observer;

public class Observer1 implements Observer{
    ConcreateSubject subject;
    public Observer1(ConcreateSubject subject){
        this.subject = subject;
        subject.add(this);
    }
    @Override
    public void update(float temperature, float humidity, float pressure) {
        // TODO Auto-generated method stub
        System.out.println(temperature+"   "+pressure);
    }

}
package com.observer;

public class Observer2 implements Observer {
    private ConcreateSubject subject;
    public Observer2(ConcreateSubject subject){
        this.subject = subject;
        subject.add(this);
    }

    @Override
    public void update(float temperature, float humidity, float pressure) {
        // TODO Auto-generated method stub
        System.out.println(humidity);
    }

}
package com.observer;

public class ObserverTest {

    public static void main(String args[]){
        ConcreateSubject subject = new ConcreateSubject();
        Observer1 o1 = new Observer1(subject);
        Observer2 o2 = new Observer2(subject);
        subject.add(o2);
        subject.add(o1);
        subject.setMeasurments(11, 1, 111);
        subject.notifyObserver();;
        subject.remove(o2);
        subject.setMeasurments(0, 1, 2);
        subject.notifyObserver();;
    }
}

 

             

 

posted on 2017-07-18 19:36  笑傲江湖未平生  阅读(128)  评论(0)    收藏  举报