如何解决当 C# 控制台应用程序中的变量更改时,连接会自动更改
考虑:
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);
}
我注意到初始状态不会在订阅时发送给观察者,如果您需要,可以这样实现。
在 Subject 类中,我添加了以下内容:
我为 CurrentState 添加了一个属性:
public string CurrentState { get { return currentState; } }
private string currentState = null;
在 SendMessage 内部我缓存了当前状态:
currentState = message;
在订阅中,我将当前状态推送到订阅可观察对象:
observer.OnNext(new Payload { Message = currentState });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。