【问题标题】:When a variable change in a C# console application, the connection automatically change当 C# 控制台应用程序中的变量更改时,连接会自动更改
【发布时间】:2021-04-13 13:27:00
【问题描述】:

考虑:

Console.WriteLine("Set firstValue");
decimal first = Convert.ToDecimal(Console.ReadLine());

第一个变量

Console.WriteLine("Set Changeable Value");
decimal changeable = first + 5;

第二个值取决于第一个值:

Console.WriteLine("Set firstValue again");
first = Convert.ToDecimal(Console.ReadLine());

更改第一个值时,自动更改可变值。 但我想使用观察者和策略设计模式,真的搞砸了。

【问题讨论】:

标签: c# design-patterns console-application observer-pattern strategy-pattern


【解决方案1】:

observer pattern in C# on Wikipedia的例子:

public class Payload
{
    public string Message { get; set; }
}

public class Subject : IObservable<Payload>
{
    public IList<IObserver<Payload>> Observers { get; set; }

    public Subject()
    {
        Observers = new List<IObserver<Payload>>();
    }

    public IDisposable Subscribe(IObserver<Payload> observer)
    {
        if (!Observers.Contains(observer))
        {
            Observers.Add(observer);
        }
        return new Unsubscriber(Observers, observer);
    }

    public void SendMessage(string message)
    {
        foreach (var observer in Observers)
        {
            observer.OnNext(new Payload { Message = message });
        }
    }
}

public class Unsubscriber : IDisposable
{
    private IObserver<Payload> observer;
    private IList<IObserver<Payload>> observers;
    public Unsubscriber(IList<IObserver<Payload>> observers, IObserver<Payload> observer)
    {
        this.observers = observers;
        this.observer = observer;
    }

    public void Dispose()
    {
        if (observer != null && observers.Contains(observer))
        {
            observers.Remove(observer);
        }
    }
}

public class Observer : IObserver<Payload>
{
    public string Message { get; set; }

    public void OnCompleted()
    {
    }

    public void OnError(Exception error)
    {
    }

    public void OnNext(Payload value)
    {
        Message = value.Message;
    }

    public IDisposable Register(Subject subject)
    {
        return subject.Subscribe(this);
    }
}

下面是对上述代码的实际测试。

private void TestObserver()
{
    var subjectState1 = "Initial Update";
    var subjectState2 = "Second Update";
    var subjectState3 = "Last Update";

    var subject = new Subject();

    subject.SendMessage(subjectState1);

    Log("Updated subject to '" + subjectState1 + "'");

    var observer1 = new Observer.Observer();
    var observer2 = new Observer.Observer();

    var ob1Unobserve = subject.Subscribe(observer1);
    var ob2Unobserve = subject.Subscribe(observer2);

    Log("Ob1 val: " + observer1.Message);
    Log("Ob2 val: " + observer2.Message);

    subject.SendMessage(subjectState2);

    Log("Updated subject to '" + subjectState2 + "'");
    Log("Ob1 val: " + observer1.Message);
    Log("Ob2 val: " + observer2.Message);

    ob1Unobserve.Dispose();
    ob2Unobserve.Dispose();

    subject.SendMessage(subjectState3);

    Log("Updated subject to '" + subjectState3 + "'");
    Log("Ob1 val: " + observer1.Message);
    Log("Ob2 val: " + observer2.Message);
}

我注意到初始状态并没有在订阅时发送给观察者,如果你需要它,可以这样实现。

在 Subject 类中,我添加了以下内容:

我为 CurrentState 添加了一个属性:

public string CurrentState { get { return currentState; } }
private string currentState = null;

在 SendMessage 内部我缓存了当前状态:

currentState = message;

在订阅中,我将当前状态推送到订阅的 observable:

observer.OnNext(new Payload { Message = currentState });

【讨论】:

  • 没关系。我做到了。但我想选择策略。例如 x=5 FirstObserver x+5 SecondObserver x*5 。当我改变 x 如何显示观察者的价值
  • @mach 我使用维基百科上的可观察模式示例更新了我的答案
猜你喜欢
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2019-03-18
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多