HeadFirst 设计模式-观察者模式

观察者模式

主要是定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。不用被动的实时去查询被主题的状态。交互对象之间是松耦合的。

这是一种主动将新消息通知。随后我们将看到由观察者自身判定是否需要最新的数据,主动的去获取通知。

具体的代码如下:

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

namespace Observer
{
   
    interface Observer
    {
        void update(float temperature, float humidity, float pressure);
    }
    interface Subject
    {
        void registObserver(Observer o);
        void removeObserver(Observer o);
        void notifyObserver();
    }
    interface DisplayElement
    {
        void dispaly();
    }

    class WeatherData : Subject
    {
        private System.Collections.ArrayList observers;//这种方式类必须管理一个数据结构,当信息发生改变,通知每一个观察者
        //而这种行为应该独立出来,不是针对特殊的应用,在WeatherData中仅有自己的私有内部成员变量
        private float temperature;
        private float humidity;
        private float pressure;
        public WeatherData()
        {
            observers = new ArrayList();
        }
        public void registObserver(Observer o)//添加的对象是Observer
        {
            observers.Add(o);
        }
        public void removeObserver(Observer o)
        {
            int index = observers.IndexOf(o);
            if (index >= 0)
            {
                observers.RemoveAt(index);
            }
        }

        //通知所有的观察者
        public void notifyObserver()
        {
            foreach (Object o in observers)
            {
                Observer observer = (Observer)o;
                observer.update(temperature, humidity, pressure);
            }
        }
        public void setMeasurements(float temperature, float humidity, float pressure)
        {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            notifyObserver();
        }
    }

    //实现两个接口
    class CurrentConditionsDisplay : Observer, DisplayElement
    {
        private float temperature;
        private float humidity;
        private float pressure;
        private Subject subject;

        public CurrentConditionsDisplay(Subject subject)//以Subject 作为参数,可为之后删除观察者提供对象
        {
            this.subject = subject;
            subject.registObserver(this);
        }
        public void update(float temperature, float humidity, float pressure)
        {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            this.dispaly();

        }
        public void dispaly()
        {
            Console.WriteLine("Current conditions:" + temperature + " F degrees and " + humidity + " % humidity");
        }
    }


    //但是上面的方法是不是没有问题了呢,有一个关键的是,观察者是被动的接受信息,如果观察者只是想知道一些想了解的信息???
    //观察者模式的关键是每个观察者的内部都有一个更新函数。在主题对象中有一个列表控制着所有的观察者
    //修改方式如下

}

//@Author tj
//@Date:2014-2-19
//@Observer Model

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

namespace Observer
{
    class Program
    {
        static void Main(string[] args)
        {
            WeatherData weatherData = new WeatherData();
            CurrentConditionsDisplay currentConditionDisplay = new CurrentConditionsDisplay(weatherData);
            weatherData.setMeasurements(80, 90, 30.4f);

           
            //以下使用接口
            Console.WriteLine("using Observable");

            WeatherData1 weatherData1 = new WeatherData1();
            CurrentConditionsDisplay1 currentConditionDisplay1= new CurrentConditionsDisplay1(weatherData1);
            weatherData1.setMeasurements(78, 80, 30.4f);
            Console.ReadLine();
        }
    }

   
    
    class Observer1
    {
         public virtual void update(Observable obj, Object arg){}//实现多态的方式
    }
    class Observable
    {
        bool changed;
        ArrayList observers;//对结构进行管理,可以独立于当前的天气预报的应用。
        public Observable()
        {
            changed = false;
            observers = new ArrayList();
        }
        public void addObserver(Observer1 o)
        {
            observers.Add(o);
        }
        public void deleteObservers(Observer1 o)
        {
            int index = observers.IndexOf(o);
            if (index >= 0)
            {
                observers.RemoveAt(index);
            }
        }
        public void notifyObservers(Object arg)
        {
            if (changed)
            {
                foreach(Object obj in observers)
                {
                    Observer1 observer = (Observer1)obj;
                    observer.update(this, arg);
                }
                changed = false;
            }
        }
        public void notifyObservers()
        {
            notifyObservers(null);
        }
        public void setChanged()
        {
            changed = true;
        }

        //为什么上面的不能采取这种方式呢,直接的在Subject中定义,因为我们要对观察者进行更新,更新的几个参数如何的能够显示在Subject中
        //这个类很巧妙的将参数换做为Observable,WeatherData继承此,那么当调用update时实质是调用WeatherData1中的数据于观察者中
    }
    class WeatherData1 : Observable
    {
        private float temperature;
        private float humidity;
        private float pressure;

        public WeatherData1() {}
        public float getTemperature() 
        {
            return temperature;
        }
        public float getHumidity() 
        {
            return humidity;
        }
        public float getPressure() 
        {
            return pressure;
        }
        public void setMeasurements(float temperature,float humidity,float pressure)
        {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            measurementsChanged();
        }
        public void measurementsChanged()//观察者可以通过在类里面调用此函数,再触发状态的改变。也就是观察者主动获取数据的过程
        {
            setChanged();
            notifyObservers();
        }
    }
    class CurrentConditionsDisplay1:Observer1
    {
        Observable observerable;//观察对象
        private float temperature;
        private float humidity;
        public CurrentConditionsDisplay1(Observable observable)
        {
            this.observerable = observable;
            observable.addObserver(this);//
        }

       public  override void update(Observable obj, Object arg) 
        { 
            if (obj is WeatherData1)
            {
                WeatherData1 weatherData = (WeatherData1)obj;
                this.temperature = weatherData.getTemperature();
                this.humidity = weatherData.getHumidity();
                display();
            }
        }

        public void display()
        {
            Console.WriteLine("new current conditions:" + temperature + " F degrees and " + humidity + "%humidity");
        }
    }
}

运行结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Head First设计模式-深入浅出设计模式》是一本以简单有趣的方式介绍设计模式的书籍。设计模式是在软件开发中解决特定问题的一种经验总结,它们提供了在实际开发中可重用、可靠、灵活的解决方案。 该书的主要特点是通过生动有趣的讲解和丰富多样的图表、示例来帮助读者更好地理解和应用设计模式。作者采用了大量的图形和实例来解释设计模式的概念,使读者能够迅速理解并应用这些概念。 这本书涵盖了23种常用的设计模式,如工厂模式、单例模式、适配器模式、装饰器模式等。每一种设计模式都以一个实际的例子开始,引出该模式解决的问题,然后详细解释其结构和应用,最后通过示例代码展示如何使用该模式。 此外,该书还介绍了设计模式之间的关系和如何选择合适的设计模式。它教授了读者如何在具体问题中识别出适用的设计模式,并提供了一些实际的应用建议。 《Head First设计模式-深入浅出设计模式》以其独特的教学风格和简洁明了的讲解深受读者喜爱。这本书不仅适合初学者了解设计模式,也适合有一定经验的开发人员进一步提高他们的软件设计和编程能力。 总之,这本书以其生动有趣的讲解方式和大量的图表、实例为读者介绍了设计模式的基本概念和具体应用,是学习和理解设计模式的一本不可或缺的指南。 ### 回答2: 《Head First设计模式:深入浅出设计模式》是一本主要介绍软件设计模式的书籍。设计模式是在软件开发中经常出现的问题的解决方案,可以帮助开发人员更好地构建可重用、可扩展、可维护的代码。 这本书以深入浅出的方式介绍了23种常见的设计模式,通过生动有趣的讲解和大量的图形和实例,使读者能够更加轻松地理解和掌握设计模式。它采用了非传统的学习方式,通过讲故事、练习、谜题等方式将设计模式的概念和使用方法娓娓道来。 该书首先从简单的设计模式开始,引导读者逐步理解和掌握基础的设计原则和模式,如单例模式、工厂模式等。然后,逐渐深入介绍更复杂的模式,如装饰器模式、观察者模式、策略模式等。每个模式都通过具体的案例和代码示例进行讲解,帮助读者理解模式的思想和应用场景。 除了具体的设计模式之外,这本书还关注了如何将设计模式应用到现实的软件开发中。它探讨了如何根据不同的需求选择合适的设计模式,以及如何通过设计模式提高代码的质量和可维护性。 总的来说,《Head First设计模式:深入浅出设计模式》是一本非常有趣、易懂且实用的设计模式入门书籍。无论是初学者还是有一定经验的开发人员,都能从中获得有益的知识和经验,提高软件开发的能力和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值