设计模式_17_观察者模式

基本介绍

观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer, Subject通 知Observer变化,Subject,是一的一方。 用户是Observer, 是多的一方。


image.png

例子:
天气预报项目需求,具体要求如下:

  1. 气象站可以将每天测量到的温度,显度,气压等等以公告的形式发布出去(比如
    发布到自己的网站或第三方)。
  2. 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
  3. 提供温度、气压和湿度的接口
  4. 测量数据更新时,要能实时的通知给第三方
public interface Observer {

    void update(float a,float b,float c);
}

public interface Subject {

    void register(Observer observer);
    
    void remove(Observer observer);
    
    void notifyObservers();
}

public class WeatherData implements Subject{
    
    float a;
    float b;
    float c;
    List<Observer> observers;
    
    
    
    public WeatherData() {
        this.observers = new ArrayList<Observer>();
    }
    
    @Override
    public void register(Observer observer) {
        // TODO Auto-generated method stub
        observers.add(observer);
    }
    @Override
    public void remove(Observer observer) {
        // TODO Auto-generated method stub
        if (observers.contains(observer)) {
            observers.remove(observer);
        }
    }
    @Override
    public void notifyObservers() {
        // TODO Auto-generated method stub
        for(Observer observer : observers){
            observer.update(a, b, c);
        }       
    }
    
    
    public void setData(float a,float b,float c){
        this.a = a;
        this.b = b;
        this.c = c;
        notifyObservers();
    }

}

public class Baidu implements Observer{

    float a;
    float b;
    float c;
    
    @Override
    public void update(float a, float b, float c) {
        // TODO Auto-generated method stub
        this.a=a;
        this.b=b;
        this.c =c;
        display();
    }

    private void display() {
        // TODO Auto-generated method stub
        System.out.println("a指标为:"+a);
        System.out.println("b指标为:"+b);
        System.out.println("c指标为:"+c);
    }

}

public class Client {
    
    public static void main(String[] args) {
        
        WeatherData subject = new WeatherData();
        
        Observer baidu = new Baidu();
        
        subject.register(baidu);
        
        subject.setData(1,2,3);
        
        System.out.println("=============指标进行了更新===========");
        subject.setData(4,5,6);
    }

}

观察者模式的好处

  1. 观察者模式设计后,会以集合的方式来管理用户(Observer), 包括注册,移除和通知。
  2. 这样,我们增加观察者(这里可以理解成一一个新的公告板),就不需要去修改核心类WeatherData不会修改代码,遵守了ocp原则。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。