欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么在c#項目中實現(xiàn)一個觀察者模式-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)怎么在c#項目中實現(xiàn)一個觀察者模式,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

迪慶州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站從2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

1、觀察者模式UML圖


怎么在c#項目中實現(xiàn)一個觀察者模式

2、氣象監(jiān)測類圖

怎么在c#項目中實現(xiàn)一個觀察者模式

3、氣象監(jiān)測代碼(書中C#版)

3.1 Observer

public interface IObserver
{
    void Update(float temperature, float humidity, float pressure);
}
public interface IDisplayElement
{
    void Display();
}
public class CurrentConditionDisplay : IObserver, IDisplayElement
{
    private readonly ISubject _weatherData;
 
    private float _temperature;
    private float _humidity;
 
    public CurrentConditionDisplay(ISubject weatherData)
    {
        _weatherData = weatherData;
        _weatherData?.RegisterObserver(this);
    }
 
    public void Update(float temperature, float humidity, float pressure)
    {
        _temperature = temperature;
        _humidity = humidity;
        Display();
    }
 
    public void Display()
    {
        Console.WriteLine($"Current Conditions: {_temperature}F degress and {_humidity}% humidity");
    }
}

3.2 Subject

public interface ISubject
{
    void RegisterObserver(IObserver o);
    void RemoveObserver(IObserver o);
    void NotifyObservers();
}
public class WeatherData : ISubject
{
    //觀察者列表
    private readonly List<IObserver> _observerList;
 
    //天氣數(shù)據(jù)
    private float _temperature;
    private float _humidity;
    private float _pressure;
 
    public WeatherData()
    {
        _observerList = new List<IObserver>();
    }
 
    /// <summary>
    /// 訂閱觀察者
    /// </summary>
    /// <param name="o">觀察者對象</param>
    public void RegisterObserver(IObserver o)
    {
        _observerList.Add(o);
    }
 
    /// <summary>
    /// 移除觀察者
    /// </summary>
    /// <param name="o">觀察者對象</param>
    public void RemoveObserver(IObserver o)
    {
        if (_observerList.Contains(o))
        {
            _observerList.Remove(o);
        }
    }
 
    /// <summary>
    /// 發(fā)布數(shù)據(jù)
    /// </summary>
    public void NotifyObservers()
    {
        foreach (var observer in _observerList)
        {
            observer.Update(_temperature, _humidity, _pressure);
        }
    }
 
    /// <summary>
    /// 數(shù)據(jù)發(fā)生改變
    /// </summary>
    private void MeasurementChanged()
    {
        NotifyObservers();
    }
 
    /// <summary>
    /// 更新數(shù)據(jù)
    /// </summary>
    /// <param name="temperature">溫度</param>
    /// <param name="humidity">濕度</param>
    /// <param name="pressure">氣壓</param>
    public void SetMeasurements(float temperature, float humidity, float pressure)
    {
        _temperature = temperature;
        _humidity = humidity;
        _pressure = pressure;
        MeasurementChanged();
    }
}

3.3 測試代碼

private static void TestWeatherData()
{
    var weatherData = new WeatherData();
    var currentConditionDisplay = new CurrentConditionDisplay(weatherData);
 
    weatherData.SetMeasurements(80, 65, 30.4f);
    weatherData.SetMeasurements(82, 70, 29.2f);
    weatherData.SetMeasurements(78, 90, 29.2f);
}

4、使用C#中IObservable接口實現(xiàn)氣象監(jiān)測

4.1 輔助類/結(jié)構(gòu)體

public struct WeatherMessage
{
    public float Temperature { get; set; }
    public float Humidity { get; set; }
    public float Pressure { get; set; }
}
 
public class MessageUnknownException : Exception
{
    internal MessageUnknownException()
    {
 
    }
}

4.2 IObserver具體實現(xiàn)

class CurrentConditionDisplayX : IObserver<WeatherMessage>, IDisplayElement
{
    private IDisposable _unsubscribe;
 
    private float _temperature;
    private float _humidity;
 
    public void Subscribe(IObservable<WeatherMessage> provider)
    {
        if (provider != null)
        {
            _unsubscribe = provider.Subscribe(this);
        }
    }
 
    public void Unsubscribe()
    {
        _unsubscribe?.Dispose();
        _unsubscribe = null;
    }
 
    public void OnCompleted()
    {
        Console.WriteLine("CurrentConditionDisplayX: OnCompleted");
        Unsubscribe();
    }
 
    public void OnError(Exception error)
    {
        Console.WriteLine("CurrentConditionDisplayX: OnError");
    }
 
    public void OnNext(WeatherMessage value)
    {
        _temperature = value.Temperature;
        _humidity = value.Humidity;
        Display();
    }
 
    public void Display()
    {
        Console.WriteLine($"Current Conditions: {_temperature}F degress and {_humidity}% humidity");
    }
}

4.3 IObservable具體實現(xiàn)

public class WeatherDataX : IObservable<WeatherMessage>
{
    private readonly List<IObserver<WeatherMessage>> _observerList;
 
    public WeatherDataX()
    {
        _observerList = new List<IObserver<WeatherMessage>>();
    }
 
    /// <summary>
    /// 通知提供程序:某觀察程序?qū)⒁邮胀ㄖ?    /// </summary>
    /// <param name="observer">要接收通知的對象。</param>
    /// <returns>使資源釋放的觀察程序的接口。</returns>
    public IDisposable Subscribe(IObserver<WeatherMessage> observer)
    {
        if(!_observerList.Contains(observer))
        {
            _observerList.Add(observer);
        }
        return new Unsubcriber(_observerList, observer);
    }
 
    public void SetMeasurements(Nullable<WeatherMessage> message)
    {
        foreach (var observer in _observerList)
        {
            if (!message.HasValue)
            {
                observer.OnError(new MessageUnknownException());
            }
            else
            {
                observer.OnNext(message.Value);
            }
        }
    }
 
    public void EndTransmission()
    {
        foreach (var observer in _observerList.ToArray())
        {
            if (_observerList.Contains(observer))
            {
                observer.OnCompleted();
            }
        }
        _observerList.Clear();
    }
 
    private class Unsubcriber : IDisposable
    {
        private List<IObserver<WeatherMessage>> _observerList;
        private IObserver<WeatherMessage> _observer;
 
        public Unsubcriber(List<IObserver<WeatherMessage>> observerList, IObserver<WeatherMessage> observer)
        {
            _observerList = observerList;
            _observer = observer;
        }
 
        public void Dispose()
        {
            if (_observerList != null && _observerList.Contains(_observer))
            {
                _observerList.Remove(_observer);
            }
        }
    }
}

4.4 測試代碼

private static void TestWeatherDataX()
{
    var weatherData = new WeatherDataX();
    var currentConditionDisplay = new CurrentConditionDisplayX();
 
    currentConditionDisplay.Subscribe(weatherData);
 
    weatherData.SetMeasurements(new WeatherMessage()
    {
        Temperature = 80,
        Humidity = 65,
        Pressure = 30.4f
    });
    weatherData.SetMeasurements(new WeatherMessage()
    {
        Temperature = 82,
        Humidity = 70,
        Pressure = 29.2f
    });
    weatherData.SetMeasurements(new WeatherMessage()
    {
        Temperature = 78,
        Humidity = 90,
        Pressure = 29.2f
    });
    weatherData.EndTransmission();
}

關(guān)于怎么在c#項目中實現(xiàn)一個觀察者模式就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

分享題目:怎么在c#項目中實現(xiàn)一個觀察者模式-創(chuàng)新互聯(lián)
本文鏈接:http://chinadenli.net/article46/deeihg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、全網(wǎng)營銷推廣、營銷型網(wǎng)站建設(shè)虛擬主機、微信公眾號企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化