观察者模式-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学习之观察者模式

观察者模式介绍及简单编码实现
  • baidu_33862742
  • baidu_33862742
  • 2016年11月17日 23:30
  • 174

<HeadFirst设计模式>笔记——命令模式

HeadFirst 设计模式 命令模式 摘抄
  • wilschan0201
  • wilschan0201
  • 2017年06月09日 14:00
  • 195

读《大话设计模式》和《head first 设计模式》心得

1.面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 2.如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责...
  • fuqiaoyimeng
  • fuqiaoyimeng
  • 2013年11月10日 18:17
  • 1160

HeadFirst观察者模式

HeadFirst——观察者模式 1.前言 观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变...
  • u013096145
  • u013096145
  • 2014年07月10日 22:27
  • 574

HeadFirst 观察者模式(observer)

使用目的降低交互对象的耦合度定义观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。1对多的关系 ,1 是被观察者(主题),多是观察者。观察者通...
  • u011733020
  • u011733020
  • 2017年11月08日 11:08
  • 97

调侃《HeadFirst设计模式》之装饰者模式

今天让我们继续跟随《Head First 设计模式》的足迹,聊一个新的设计模式,有了它,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。首先,按照惯例,从故事说起——    ...
  • sinat_23092639
  • sinat_23092639
  • 2015年04月05日 10:52
  • 828

调侃《HeadFirst设计模式》之工厂模式(一)

今天我们再次跟随《HeadFirst设计模式》的脚步,
  • sinat_23092639
  • sinat_23092639
  • 2015年04月11日 21:23
  • 1765

观察者模式简单例子

观测者模式定义了对象之间的一对多依赖,当一个对象状态发生改变时,其依赖者便会收到通知并做相应的更新。其原则是:为交互对象之间松耦合。以松耦合方式在一系列对象之间沟通状态,我们可以独立复用主题(Subj...
  • qq_15128547
  • qq_15128547
  • 2016年11月17日 20:00
  • 3010

设计模式(五)观察者模式

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听莫一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们...
  • itachi85
  • itachi85
  • 2016年03月02日 17:41
  • 37509

Java设计模式之观察者模式

本文继续介绍23种设计模式系列。介绍的是观察者模式。
  • jason0539
  • jason0539
  • 2015年04月16日 07:32
  • 29892
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:观察者模式-HeadFirst学习
举报原因:
原因补充:

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