对信号控制的封装

这几天在写一个引力模拟的程序时,添加了一些常用的功能比如:

  ♦追踪最大质量物体

  ♦开关星球数据显示

  ♦开关碰撞检测

  ♦开关相对视角

 

 

无一例外,这些功能都用了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(); 
                }
            }
        }
    }
}
sign class

使用时先创建信号

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;

就能自动完成信号改变后的操作

 

posted @ 2020-04-11 11:17  ggtc  阅读(201)  评论(0编辑  收藏  举报
//右下角目录