观察者模式-HeadFirst学习

原创 2015年11月17日 22:18:22

1、观察者模式定义:

定义对象之间的一对多依赖,如此,一个对象的状态改变时,他的所有依赖者都会收到通知,并自动更新;

2、关键点

该模式定义了两个对象之间的松耦合关系,观察者不知被观察者的细节,被观察者不必知道观察者的具体表现,只要双方交互的接口未变,在扩展性的观察者时,被观察者不必修改代码;

3、例子源码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ObserverPattern
{
    public interface Observer
    {
        void update(string tem,string hum,string pre);
    }

    public interface DisplayElement
    {
        void display();
    }

    public interface Subject
    {
        void registerObserver(Observer observer);

        void removeRegister(Observer observer);

        void notifyObservers();
    }


    public class WeatherData : Subject
    {

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

        #region Subject 成员

        public void registerObserver(Observer observer)
        {
            vecObservers.Add(observer);
        }

        public void removeRegister(Observer observer)
        {
            vecObservers.Remove(observer);
        }

        public void notifyObservers()
        {
            foreach (Observer observer in vecObservers)
            {
                observer.update(m_tem, m_hum, m_pre);
            }
        }

        #endregion


        public void SetMeasureMent(string tem, string hum, string pre)
        {
            m_tem = tem;
            m_hum = hum;
            m_pre = pre;

            notifyObservers();
        }

        private string m_tem;
        private string m_hum;
        private string m_pre;

        private List<Observer> vecObservers;
    }

    public class CurrentConditionDisplay : Observer, DisplayElement
    {
        public CurrentConditionDisplay(Subject pSubject)
        {
            m_Subject = pSubject;
            m_Subject.registerObserver(this);
        }

        #region Observer 成员

        public void update(string tem, string hum, string pre)
        {
            m_tem = tem;
            m_hum = hum;
            m_pre = pre;

            display();
        }

        #endregion

        #region DisplayElement 成员

        public void display()
        {
            Console.WriteLine(string.Format("当前显示牌显示状态,{0},{1},{2}", m_tem, m_hum, m_pre));
        }

        #endregion

        private string m_tem;
        private string m_hum;
        private string m_pre;

        private Subject m_Subject;
    }

    public class StatisticsConditionDisplay : Observer, DisplayElement
    {
        public StatisticsConditionDisplay(Subject pSubject)
        {
            m_Subject = pSubject;
            m_Subject.registerObserver(this);
        }

        #region Observer 成员

        public void update(string tem, string hum, string pre)
        {
            m_tem = tem;
            m_hum = hum;
            m_pre = pre;

            display();
        }

        #endregion

        #region DisplayElement 成员

        public void display()
        {
            Console.WriteLine(string.Format("统计显示牌显示状态,{0},{1},{2}", m_tem, m_hum, m_pre));
        }

        #endregion

        private string m_tem;
        private string m_hum;
        private string m_pre;

        private Subject m_Subject;
    }

    public class ForecastConditionDisplay : Observer, DisplayElement
    {
        public ForecastConditionDisplay(Subject pSubject)
        {
            m_Subject = pSubject;
            m_Subject.registerObserver(this);
        }

        #region Observer 成员

        public void update(string tem, string hum, string pre)
        {
            m_tem = tem;
            m_hum = hum;
            m_pre = pre;

            display();
        }

        #endregion

        #region DisplayElement 成员

        public void display()
        {
            Console.WriteLine(string.Format("预报显示牌显示状态,{0},{1},{2}", m_tem, m_hum, m_pre));
        }

        #endregion

        private string m_tem;
        private string m_hum;
        private string m_pre;

        private Subject m_Subject;
    }

}

namespace ObserverPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            WeatherData pSubject = new WeatherData();
            Observer pObserver1 = new CurrentConditionDisplay(pSubject);
            Observer pObserver2 = new StatisticsConditionDisplay(pSubject);
            Observer pObserver3 = new ForecastConditionDisplay(pSubject);
            pSubject.SetMeasureMent("100", "100", "100");
            pSubject.SetMeasureMent("100", "200", "300");
            pSubject.SetMeasureMent("300", "200", "100");
            
            pSubject.removeRegister(pObserver3);

            pSubject.SetMeasureMent("1000", "1000", "1000");
        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《HeadFirst设计模式》学习笔记1-观察者模式

类图 注意问题ConcreteSubject类内要维护一个Observer队列 ConcreteObserver类内要有一个Subject对象作为引用代码主题接口public interface...

观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

一、问题描述 Weather-O-Rama气象站计划建立下一代的Internet气象观察站,该气象站必须建立在WeatherData对象的基础上,WeatherData对象提供天气数据,有三...

观察者模式(Observer Pattern)(三):使用java内置的支持实现HeadFirst气象站

一、问题描述 Weather-O-Rama气象站计划建立下一代的Internet气象观察站,该气象站必须建立在WeatherData对象的基础上,WeatherData对象提供天气数据,有三...

【HeadFirst设计模式】(二)观察者模式

第二章“观察者模式”,我们通过一个气象监测的应用来了解。先来了解一下背景。 (我的博客原文地址:https://chaycao.github.io/2016/08/27/ObserverPatter...

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

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

《HeadFirst设计模式》读书笔记-第2章-观察者模式

定义观察者模式(observer pattern)定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会接收到通知并自动更新。类图代码实现下面以气象站为例子,说明观察者模式的实...
  • rex_nie
  • rex_nie
  • 2017年03月07日 02:18
  • 110

HeadFirst 设计模式-观察者模式

观察者模式 主要是定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。不用被动的实时去查询被主题的状态。交互对象之间是松耦合的。 这是一种主动将新消息通知。随后我们...

【HeadFirst 设计模式】观察者模式

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 观察者模式的类图: 设计原则:为了交互对象之间的松耦合设计而努力。 观察者模式提...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:观察者模式-HeadFirst学习
举报原因:
原因补充:

(最多只允许输入30个字)