• 规则引擎



    关于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

  • 相关阅读:
    转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
    转: Orz是一个基于Ogre思想的游戏开发架构
    转:Ogre源代码浅析——脚本及其解析(一)
    IntelliJ IDEA添加过滤文件或目录
    为什么要使用ConcurrentHashMap
    volatile关键字解析
    Spring Boot MyBatis 通用Mapper 自动生成代码
    使用mysql乐观锁解决并发问题
    使用Redis分布式锁处理并发,解决超卖问题
    浅析 pagehelper 分页
  • 原文地址:https://www.cnblogs.com/foundation/p/860911.html
Copyright © 2020-2023  润新知