《Head First 设计模式》C#版:二、观察者模式

标签: 设计模式 《Head First 设计模式》 C#版
5人阅读 评论(0) 收藏 举报
分类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// Observer pattern 观察者模式
/// 模式定义 :定义对象之间一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖都会收到通知并自动更新
/// 设计原则 : 为了交互对象之间的松耦合设计而努力
/// </summary>
public class ObserverPattern : MonoBehaviour {
    void Start () {
        //实例化一个天气数据
        WeatherData data = new WeatherData();
        //实例化一个通知面板
        CurrentConditionDisplay conditionDisplay = new CurrentConditionDisplay(data);
        //通知观察者天气数据变化了
        data.SetMeasurements(123, 456, 789);
        data.SetMeasurements(1233, 4566, 7899);
        //移除观察者
        conditionDisplay.RemoveObserver();
       //这次天气变化就收不到了 
        data.SetMeasurements(12133, 45166, 78919);




    }

}
// ==========  气象站  =========

/// <summary>
/// Current condition display. 布告板类  继承 Observer 是为了从weatherData里面获取 通知
/// DisplayElement 是布告板必须继承的接口
/// </summary>
public class CurrentConditionDisplay : DisplayElement,Observer{

    private float temp;
    private float humi;
    /// <summary>
    /// 此处用subject 是为了方便操作 remove 接口
    /// </summary>
    public Subject weather;
    public CurrentConditionDisplay(Subject data){
        this.weather = data;
        this.weather.RegisterObserver(this);
    }

    public void RemoveObserver()
    {
        this.weather.RomoveObserver(this);
    }
    public void Update(float temp, float humidity, float pressure){
        this.temp = temp;
        this.humi = humidity;
        Display();
    }

    public void Display(){
        Debug.Log("temp = " + temp + " humi = " + humi);
    }
}

/// <summary>
/// Weather data.
/// </summary>
public class WeatherData : Subject{
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData(){
        observers = new List<Observer>();
    }

    public void RegisterObserver(Observer observer){
        observers.Add(observer);
    }

    public void RomoveObserver(Observer observer){
       int index = observers.IndexOf(observer);
        if(index >= 0)
            observers.RemoveAt(index);
    }
    /// <summary>
    /// 通知每一个观察者  因为接口实现了update
    /// </summary>
    /// <param name="observer">Observer.</param>
    public void NotifyObserver(){
        int count = observers.Count;
        for (int index = 0; index < count;index ++){
            observers[index].Update(temperature,humidity,pressure);
        }
    }
    /// <summary>
    /// Measurementses the changed. 当气象站变化的时候 通知每一个观察者
    /// </summary>
    public void MeasurementsChanged(){
        NotifyObserver();
    }

    /// <summary>
    /// 天气变化从这个方法告诉 天气Data类  
    /// </summary>
    /// <param name="temp">Temp.</param>
    /// <param name="hunm">Hunm.</param>
    /// <param name="pressure">Pressure.</param>
    public void SetMeasurements(float temp,float hunm,float pressure){
        this.temperature = temp;
        this.pressure = pressure;
        this.humidity = hunm;
        MeasurementsChanged();
    }



}

/// <summary>
/// 观察主题 
/// </summary>
public interface Subject {
    /// <summary>
    /// 注册观察者
    /// </summary>
    /// <param name="observer">Observer.</param>
    void RegisterObserver(Observer observer);
    /// <summary>
    /// 移除观察者
    /// </summary>
    /// <param name="observer">Observer.</param>
    void RomoveObserver(Observer observer);
    /// <summary>
    /// 当主题改变时 通过接口 通知所有观察者 
    /// </summary>
    void NotifyObserver();

}

/// <summary>
/// Observer. 观察者 
/// </summary>
public interface Observer{
    void Update(float temp, float humidity, float pressure);
}

/// <summary>
/// 显示通知内容
/// </summary>
public interface DisplayElement{
    void Display(); 
}



查看评论

Javascript 设计模式之观察者模式【专家辅导】

-
  • 1970年01月01日 08:00

观察者模式详解——参考《Head First设计模式》

本文结合《Head First设计模式一书》谈谈自己对观察者模式的理解,并列出了观察者模式的C++代码。...
  • lisiyuannnn
  • lisiyuannnn
  • 2016-09-14 15:59:07
  • 226

Head First 设计模式(二)观察者模式

Head First,观察者模式
  • z55887
  • z55887
  • 2017-03-22 21:20:14
  • 146

Head First设计模式之观察者模式(Observer Pattern)

前言:     这一节开始学习观察者模式,开始讲之前会先像第一节那样通过一个应用场景来引入该模式。具体场景为:气象站提供了一个WeatherData对象,该对象可以追踪获取天气的温度、气压、湿度信息,...
  • xuemoyao
  • xuemoyao
  • 2016-03-12 23:20:26
  • 2079

调侃《HeadFirst设计模式》之观察者模式

上次总结完了策略模式,这次继续跟随着《Head First 设计模式》,聊下观察者模式。     现在你接到了一个气象监测应用的项目,此系统中的三个部分是气象站(获取实际气象数据的物理装置)、Weat...
  • sinat_23092639
  • sinat_23092639
  • 2015-03-25 21:12:56
  • 628

【C++实现】HeadFirst设计模式之观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 一方可称为主题(subject),另一方可称为观察者(observer),一个主题可拥有...
  • tigerstudent
  • tigerstudent
  • 2014-08-02 14:42:15
  • 984

Head First 设计模式(中文完整版带书签+附书源码).part2.rar

  • 2016年01月18日 21:17
  • 57.47MB
  • 下载

Head First设计模式 高清PDF 带完整书签

  • 2018年03月25日 17:25
  • 128.26MB
  • 下载

Head First 设计模式(中文完整版+附书源码)

  • 2015年12月15日 13:12
  • 45.45MB
  • 下载

《Head First 设计模式》 终于出中文版了。

《Head First 设计模式》  以前在博克园里看到过第一章的翻译,被里面生动的讲解深深地吸引了,但是的制只有英文版没有中文版的时候很是失望。不过现在好了,中文版终于出来了。不是到大家知不知...
  • jyk
  • jyk
  • 2007-10-18 19:32:00
  • 936
    个人资料
    持之以恒
    等级:
    访问量: 7349
    积分: 416
    排名: 11万+
    文章分类
    最新评论