C# 事件,用于根据订阅者的要求通知订阅者



我有一个类形状,它改变了它的颜色,它应该在发生变化时通知订阅者。 但是,订阅者希望收到以下通知:

  • 订阅者 1希望仅在形状颜色更改为greenyellowred
  • 订阅者 2希望仅在形状颜色更改为red时收到通知
  • 订阅者 3希望随时收到通知 形状颜色更改为任何颜色

这是我的形状课

public class Shape  
{  
public event EventHandler ColorChanged;  
void ChangeColor()  
{  
// set new color 
OnColorChanged(...);  
}  
protected virtual void OnColorChanged(MyEventArgs e)  
{  
if(ColorChanged != null)  
{  
ColorChanged(this, e);  
}  
}  
} 

和我的订阅者

public class Subscriber1
{
public Subscriber1(Shape shape)
{
shape.ColorChanged += new EventHandler(OnColorChanged);
}
void OnColorChanged(object sender, EventArgs e)
{
// this subscriber wants to get notified only if color changes to green, yellow and red
}
}
public class Subscriber2
{
public Subscriber2(Shape shape)
{
shape.ColorChanged += new EventHandler(OnColorChanged);
}
void OnColorChanged(object sender, EventArgs e)
{
// this subscriber wants to get notified only if color changes to red
}
}
public class Subscriber3
{
public Subscriber3(Shape shape)
{
shape.ColorChanged += new EventHandler(OnColorChanged);
}
void OnColorChanged(object sender, EventArgs e)
{
// this subscriber wants to get notified every time shape color changes
}
}

如何让 Shape 在他们的首选条件下通知这些订阅者颜色变化(即,我希望仅在您的颜色变为红色时才收到通知)?

我看到的每个示例都会通知所有订阅者所有更改,我正在尝试使它

  • 订阅者可以告诉 Shape 他们希望收到哪些更改通知
  • 然后,Shape仅通知这些订阅者他们要求的内容

您必须为每个不同的可能订阅选项维护委托列表:

private Dictionary<Color, EventHandler> colorChangedHandlers;
private EventHandler color_changed_to_red;
private EventHandler color_changed_to_yellow;
.
.
.
// then, add all of the delegates to the list

订户将不得不打电话

shapeInstance.SubscribeColorChanged(EventHandler handler, params Color[] desiredColors);

然后,你必须实现它,如下所示:

public void SubscribeColorChanged(EventHandler handler, params Color[] colors)
{
foreach (Color c in colors)
{
colorChangedHandlers[c] += handler;
}
}

当然,您还需要配套Unsubscribe方法:

public void UnsubscribeColorChanged(EventHandler handler, params Color[] desiredColors)
{
foreach (Color c in desiredColors)
{
foreach (KeyValuePair<Color, EventHandler> kvp in colorChangedHandlers)
{
if (kvp.Key == c) {
EventHandler tmp = kvp.Value;
tmp -= handler;
}
}
}
}

然后,您必须更改OnColorChanged方法

protected virtual void OnColorChanged(Color color)
{
colorChangedEventHandlers[color]?.Invoke(this, EventArgs.Empty);
}

所有这些都只是针对一个ColorChanged事件,该事件可以使用派生的EventArgs类上的NewColor属性进行处理!另外,对于自定义颜色,它必须更加复杂,因为这仅处理Colors枚举中的值。这可能是可能的,但我不会向任何没有明确和不屑需求的人推荐它。

相关内容

  • 没有找到相关文章

最新更新