zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新;

    系统描述:设计一个气象站,每当温度变化时,显示温度的布告板就会更新;

    主题接口:Subject.java

    package cn.weather.demo;
    /**
     * 主题接口
     * @author wy
     *
     */
    public interface Subject {
        //注册观察者
        public void registerObserver(Observer o);
        //移除观察者
        public void removeObserver(Observer o);
        //通知观察者
        public void notifyObserver();
    }
    
    
    
    观察者接口:

    package cn.weather.demo;
    
    /**
     * 观察者接口
     * @author wy
     *
     */
    public interface Observer {
    	public void update (int temp,int humidity);	
    }
    

    布告板接口

    package cn.weather.demo;
    
    public interface DisplayData {
    	public void display();
    }
    

    一个具体的主题,这是被观察的对象,在主题中有一个观察者的集合,

    package cn.weather.demo;
    
    import java.util.ArrayList;
    
    public class WeatherData implements Subject {
    	private ArrayList<Observer> observers;
    	private int temp;
    	private int humidity;
    
    	public WeatherData() {
    		observers = new ArrayList<Observer>();
    	}
    
    	@Override
    	public void registerObserver(Observer o) {
    		// TODO Auto-generated method stub
    		observers.add(o);
    	}
    
    	@Override
    	public void removeObserver(Observer o) {
    		// TODO Auto-generated method stub
    		observers.remove(o);
    	}
    
    	@Override
    	public void notifyObserver() {
    		// TODO Auto-generated method stub
    		for (Observer observer : observers) {
    			observer.update(temp, humidity);
    		}
    	}
    
    	public void measurementChanged() {
    		notifyObserver();
    	}
    
    	public void setMeasurements(int temp, int humidity) {
    		this.temp = temp;
    		this.humidity = humidity;
    		measurementChanged();
    	}
    
    }
    
    创建一个布告板,也就是观察者,其中包含了主题通知该观察者时所需要做的动作

    package cn.weather.demo;
    
    import java.awt.image.ImageConsumer;
    
    public class FirstDisplayer implements Observer, DisplayData {
    
    	private int temp;
    	private int humidity;
    	private Subject weather;
    
    	public FirstDisplayer(Subject weather) {
    		this.weather = weather;
    		weather.registerObserver(this);
    	}
    
    	@Override
    	public void update(int temp, int humidity) {
    		this.temp = temp;
    		this.humidity = humidity;
    		display();
    	}
    
    	@Override
    	public void display() {
    		System.out.println("first displayer:");
    		System.out.println("temp:" + temp + "; humidity: " + humidity + "; ");
    		System.out.println();
    	}
    }
    
    在创建2个观察者

    package cn.weather.demo;
    
    public class SecondDisplayer implements Observer, DisplayData {
    
    	private int temp, humidity;
    	private Subject subject;
    
    	public SecondDisplayer(Subject subject) {
    		this.subject = subject;
    		subject.registerObserver(this);
    	}
    
    	@Override
    	public void display() {
    		// TODO Auto-generated method stub
    		System.out.println("second diplayer: ");
    		System.out.println("temp:" + this.temp + "; humidity:" + this.humidity);
    		System.out.println();
    	}
    
    	@Override
    	public void update(int temp, int humidity) {
    		// TODO Auto-generated method stub
    		this.temp = temp;
    		this.humidity = humidity;
    		display();
    	}
    
    }
    
    package cn.weather.demo;
    
    public class ThirdDisplayer implements Observer {
    
    	private int min;
    	private int sec;
    	private Subject subject;
    
    	public ThirdDisplayer(Subject subject) {
    		this.subject = subject;
    		subject.registerObserver(this);
    	}
    
    	@Override
    	public void update(int min, int sec) {
    		this.min = min;
    		this.sec = sec;
    		show();
    	}
    
    	public void show() {
    		System.out.println("third displayer:");
    		System.out.println("min:" + min + "; sec:" + sec);
    		System.out.println();
    	}
    
    }
    

    测试:

    package cn.weather.demo;
    
    import java.util.Date;
    
    public class Test {
    	public static void main(String[] args) {
    		 WeatherData weatherData = new WeatherData();
    		 FirstDisplayer firstDisplayer = new FirstDisplayer(weatherData);
    		 weatherData.setMeasurements(10, 20);
    		
    		 SecondDisplayer secondDisplayer = new SecondDisplayer(weatherData);
    		 weatherData.setMeasurements(500, 200);
    		
    		 weatherData.setMeasurements(300, 0);
    		
    	}
    }
    
    观察者模式,就是在主题中设置一个观察点方法,每次运行该方法,就会通知所有的观察者,即调用观察者的通知方法,观察者在这个通知方法中进行其他处理。

  • 相关阅读:
    Angular vs. React vs. Vue
    探索Virtual DOM的前世今生
    GRPC 负载均衡
    揭秘!用标准Go语言能写脚本吗?
    grpc 连接 复用 在 Go 中发现竞态条件 (Race Conditions)
    读取网络包
    User Datagram Protocol
    注册表项 DeviceInstance
    gopacket 抓包 过滤器
    Mysql 通信协议抓包分析
  • 原文地址:https://www.cnblogs.com/wyang0126/p/5039917.html
Copyright © 2011-2022 走看看