对信号控制的封装
这几天在写一个引力模拟的程序时,添加了一些常用的功能比如:
♦追踪最大质量物体
♦开关星球数据显示
♦开关碰撞检测
♦开关相对视角
无一例外,这些功能都用了bool型变量作为控制信号,如下:
sign konckSign;//碰撞检测 sign relativeSign;//相对视角 sign lockSign;//追踪 List<sign> listSign=new List<sign>();//信号集合
这些信号控制着是否调用相关功能函数,比如:
if (konckSign.SignValue)//启用碰撞检测 knockCheck();//碰撞检测
顺便一说,sign类,knockCheck()是我自己写的。我会在后面介绍。
使用控制信号有两个很大的问题,或者说麻烦。
♦在多个地方对信号进行改变,容易造成冲突与矛盾
♦信号改变时往往有着类似的操作,加上有时还要在多个地方对信号改变,造成代码重复
因此,我将对信号的操作抽出来,单独写成了一个类
using System.Windows.Forms; namespace 引力模拟 { /// <summary> /// 控制信号 /// </summary> class sign { private bool signValue;//控制信号 /// <summary> /// 封装了信号改变时的一系列操作,维护信号与表现的一致性 /// </summary> public bool SignValue { get { return signValue; } set { signValue = !value; this.dispatch(); } } private bool initSign;//初始信号,用于初始化 public Control control;//响应信号改变的控件 public string trueText;//信号为真时的字符串 public string falseText;//信号为假时的字符串 public sign(bool sign, Control control,string trueText,string falseText) { this.signValue = sign; this.initSign = sign; this.control = control; this.trueText = trueText; this.falseText = falseText; } /// <summary> /// 触发信号改变,维护信号与表现的一致性 /// </summary> public void dispatch() { if (signValue) { signValue = false; control.Text = falseText; } else { signValue = true; control.Text = trueText; } } /// <summary> /// 控制信号初始化,由于增加控制信号会在多个地方引发改动,容易出现疏漏与矛盾,最好集中处理 /// </summary> /// <param name="listSign">需要初始化的信号集合</param> public static void signInitialize(List<sign> listSign) { foreach (sign item in listSign) { if (item.signValue!=item.initSign) { item.dispatch(); } } } } }
使用时先创建信号
private void Form1_Load(object sender, EventArgs e) {
konckSign = new sign(true, this.button3, "关闭碰撞检测", "开启碰撞检测");
relativeSign = new sign(false, this.button4, "关闭相对坐标", "开启相对坐标");
lockSign = new sign(false, this.button5, "停止追踪", "追踪最大物体");
listSign.Add(konckSign);
listSign.Add(relativeSign);
listSign.Add(lockSign);
}
改变时就很简单
//碰撞检测 private void button3_Click(object sender, EventArgs e) { konckSign.dispatch();//碰撞检测信号改变时的操作 }
同时还在类中封装了字段,使得我们不用关心信号改变时的操作,改变信号的值时也能维护维护信号与表现的一致性
public bool SignValue { get { return signValue; } set { signValue = !value; this.dispatch(); } }
使用时更简单
lockSign.SignValue = false;
就能自动完成信号改变后的操作