Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 像电力开关这样的设计模式?_C#_Design Patterns_Software Design - Fatal编程技术网

C# 像电力开关这样的设计模式?

C# 像电力开关这样的设计模式?,c#,design-patterns,software-design,C#,Design Patterns,Software Design,我用c语言编写代码,目前正在实现一个类似“电力开关”的组件 一般的想法是有很多类实现了ISwitch接口,当其中一个为false时,它基本上会触发Off()操作,当所有的都为true时,则触发On() 想法非常清楚,我非常确定这种行为/功能有一种设计模式,希望能参考文档,这样我就可以自学并了解最佳实践 干杯下面是一个例子: public delegate void HandleSwitchStateChanged(ISwitch source, bool switchedOn); public

我用c语言编写代码,目前正在实现一个类似“电力开关”的组件

一般的想法是有很多类实现了ISwitch接口,当其中一个为false时,它基本上会触发Off()操作,当所有的都为true时,则触发On()

想法非常清楚,我非常确定这种行为/功能有一种设计模式,希望能参考文档,这样我就可以自学并了解最佳实践

干杯

下面是一个例子:

public delegate void HandleSwitchStateChanged(ISwitch source, bool switchedOn);

public interface ISwitch
{
    event HandleSwitchStateChanged SwitchStateChanged;
    bool SwitchedOn { get; }
}

public enum SwitchesState
{
    AllOn,
    AllOff,
    Mixed
}

public class MonitorsMultipleSwitches
{
    private readonly ISwitch[] _switches;
    private SwitchesState _switchesState;

    public MonitorsMultipleSwitches(ISwitch[] switches)
    {
        _switches = switches;

        foreach (var item in switches)
        {
            item.SwitchStateChanged += HandleSwitchStateChanged;
        }
    }

    public void HandleSwitchStateChanged(ISwitch source, bool switchedOn)
    {
        SwitchesState newState;
        if (_switches.All(s => s.SwitchedOn))
            newState = SwitchesState.AllOn;
        else if (_switches.All(s => !s.SwitchedOn))
            newState = SwitchesState.AllOff;
        else
            newState = SwitchesState.Mixed;

        if (newState == _switchesState) return; // no meaningful change
        _switchesState = newState;

        // do something.
    }
}
在本例中,一个类监视多个交换机。如果其中任何一个的状态发生变化,它会检查是否全部打开、全部关闭或部分打开、部分关闭。然后,如果与之前的状态不同,它可以根据需要做出反应

(也许
AllOff
不是你关心的一个状态——要么它们都打开了,要么你不关心。)

下面是一个例子:

public delegate void HandleSwitchStateChanged(ISwitch source, bool switchedOn);

public interface ISwitch
{
    event HandleSwitchStateChanged SwitchStateChanged;
    bool SwitchedOn { get; }
}

public enum SwitchesState
{
    AllOn,
    AllOff,
    Mixed
}

public class MonitorsMultipleSwitches
{
    private readonly ISwitch[] _switches;
    private SwitchesState _switchesState;

    public MonitorsMultipleSwitches(ISwitch[] switches)
    {
        _switches = switches;

        foreach (var item in switches)
        {
            item.SwitchStateChanged += HandleSwitchStateChanged;
        }
    }

    public void HandleSwitchStateChanged(ISwitch source, bool switchedOn)
    {
        SwitchesState newState;
        if (_switches.All(s => s.SwitchedOn))
            newState = SwitchesState.AllOn;
        else if (_switches.All(s => !s.SwitchedOn))
            newState = SwitchesState.AllOff;
        else
            newState = SwitchesState.Mixed;

        if (newState == _switchesState) return; // no meaningful change
        _switchesState = newState;

        // do something.
    }
}
在本例中,一个类监视多个交换机。如果其中任何一个的状态发生变化,它会检查是否全部打开、全部关闭或部分打开、部分关闭。然后,如果与之前的状态不同,它可以根据需要做出反应


(也许
AllOff
不是您关心的状态-要么它们都打开,要么您不关心。)

考虑查看观察者模式@斯图奇,谢谢,我来看看!乍一看,通知所有观察者似乎比我所需要的有点开销,我基本上想知道在给定时间电路的开/关状态,所以我不确定我是否需要通知所有人,如果可以这样说的话,只通知“主控制器”创建一个管理器类,在
列表中添加开关
,并设置
公共bool On=>\u开关。所有(x=>x.On)
和反向关闭?@camiloterevento感谢您的回答,我发现下面的答案很有帮助。干杯,看观测者模式@斯图奇,谢谢,我来看看!乍一看,通知所有观察者似乎比我所需要的有点开销,我基本上想知道在给定时间电路的开/关状态,所以我不确定我是否需要通知所有人,如果可以这样说的话,只通知“主控制器”创建一个管理器类,在
列表中添加开关
,并设置
公共bool On=>\u开关。所有(x=>x.On)
和反向关闭?@camiloterevento感谢您的回答,我发现下面的答案很有帮助。干杯!谢谢你!没有考虑基于事件的实现尼斯!谢谢你!没有考虑基于事件的实现