zoukankan      html  css  js  c++  java
  • 规则引擎


    关于RuleSet,在以前的文章中有详细说明,这里就不再重提了.

    先看一个应用场景
    1.  y设备启动要先启动x设备,x设备关闭要先关闭y设备
    2.  n设备启动要先启动m设备,m设备关闭要先关闭n设备
    3.  m设备,n设备要靠a设备供电,所以要启动m或n设备必需要先启动a设备
    4.  要关闭a设备,m设备与n设备都要处于关闭状态
    5.  由于n设备耗电量效大,n设备运行的时候,为了保证安全,应将不相干的设备关闭


    开启n设备的规则


    不用工作流,使用传统代码方式实现

        public class 设备
        
    {
            
    //真表示开启,候表示关闭
            private bool _状态;
            
    public bool 状态
            
    get return _状态; } }

            
    private string _名称;
            
    public string 名称
            
    {
                
    get return _名称; }
                
    set { _名称 = value; }
            }


            
    public 设备(string name)
            
    { _名称 = name; }


            
    public void open()
            
    {
                _状态 
    = true;
                System.Console.WriteLine(
    "打开设备{0},{1}", _名称, _状态);
            }


            
    public void close()
            
    {
                _状态 
    = false;
                System.Console.WriteLine(
    "关闭设备{0},{1}", _名称, _状态);
            }

        }


            
    private static void 操作()
            
    {
                
    while (!a.状态)
                
    { a.open(); }

                
    while (x.状态)
                
    {
                    
    if (y.状态)
                    
    { y.close();}
                    
    else
                    
    { x.close();}
                }


                
    if (!x.状态)
                
    {
                    
    while (!m.状态)
                    
    { m.open();}
                    
    while (!n.状态)
                    
    { n.open();}
                    System.Console.WriteLine(
    "完成");
                }

            }


    使用状态机的方式实现



    使用Inplicit(隐式反应链)规则实现


    public class 设备
        
    {
            
    //真表示开启,候表示关闭
            private bool _状态;
            
    public bool 状态
            
    {
                
    get return _状态; }
                
    set 
                
    {
                    
    if (value)
                    
    { System.Console.WriteLine("打开设备{0},{1}",_名称, _状态);}
                    
    else
                    
    {System.Console.WriteLine("关闭设备{0},{1}", _名称, _状态);}
                    _状态 
    = value; 
                }

            }

            
    private string _名称;
            
    public string 名称
            
    {
                
    get return _名称; }
                
    set { _名称 = value; }
            }

            
    public 设备(string name)
            
    { _名称 = name;}
        }

    工作流


    policyActivity1的ruleset



     

    a: IF this.a.状态 THEN ELSE this.a.状态 = True
    xtyt: IF this.x.状态 && this.y.状态 THEN this.y.状态 = False
    xtyf: IF this.x.状态 && !this.y.状态 THEN this.x.状态 = False
    xfmf: IF !this.x.状态 && !this.m.状态 THEN this.m.状态 = True
    mtnf: IF this.m.状态 && !this.n.状态 THEN this.n.状态 = True
    mtnt: IF this.m.状态 && this.n.状态 THEN System.Console.Write("完成")




    三个例子的代码
    https://files.cnblogs.com/foundation/p.rar

  • 相关阅读:
    pycharm运行Django项目,提示UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6
    linux环境下 python环境import找不到自定义的模块
    python-获取URL中的json数据
    python-Excel读取-合并单元格读取
    自动驾驶控制算法第七讲 离散规划轨迹的误差计算
    静态语言和动态语言的区别
    Python函数-导入模块的顺序及原理
    使用Visual Studio查看C++类内存分布
    在VisualStudio调试器中使用内存窗口和查看内存分布
    visual studio 2019工具里添加开发中命令提示符的方法
  • 原文地址:https://www.cnblogs.com/foundation/p/860911.html
Copyright © 2011-2022 走看看