c# - 像电开关这样的设计模式?
问题描述
我正在用 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
不是你关心的状态——要么他们都在,要么你不关心。)
推荐阅读
- .net - 我们如何在查询中显示当前 sprint 中完成的小时数
- symfony - Symfony 4,Doctrine Innerjoin 不使用联结表
- node.js - 每秒奇怪的结果测试操作
- cmake - CMake 正在一个奇怪的位置搜索包
- android - 如何将项目水平添加到导航抽屉菜单?
- reactjs - 饼图下方的标题
- html - 为什么这个 CSS 按钮不是“可点击”的?
- rest - REST 的响应(通过 Powershell 发布)不完整
- linux - 我无法获得 sftp get 命令来重命名我正在下载的文件
- redis - Redis - 如何将zrange查询的结果存储为另一个有序集