当 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 });
考虑:
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 });