zoukankan      html  css  js  c++  java
  • 对信号控制的封装

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

      ♦追踪最大质量物体

      ♦开关星球数据显示

      ♦开关碰撞检测

      ♦开关相对视角

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

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

  • 相关阅读:
    JavaScript tips:innerHTML与document.write的差异
    JavaScript tips:window.onload与$(document).ready()的差异
    剑指offer:重建二叉树
    算法:数组去重
    JavaScript tips:Function调用模式对this的影响
    P1217 [USACO1.5]回文质数 Prime Palindromes
    HDU 1002 A + B Problem II
    单片机及其工作原理粗略介绍
    Markdown格式及语法
    Kubernetes入门(三)——使用Deployment运行一个无状态应用
  • 原文地址:https://www.cnblogs.com/ggtc/p/12678332.html
Copyright © 2011-2022 走看看