当 C# 控制台应用程序中的变量更改时,连接会自动更改

When a variable change in a C# console application, the connection automatically change

考虑:

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());

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

有例子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);
}

我注意到初始状态不会在订阅时发送给观察者,如果您需要,可以这样实现。

在主题 class 中,我添加了以下内容:

我为 CurrentState 添加了一个 属性:

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

在 SendMessage 内部缓存当前状态:

currentState = message;

在 Subscribe 内部,我将当前状态推送到订阅 observable:

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