动作和行为

1.动作

1.1.什么是动作

    动作相当于传统编程中的函数和方法,所以动作是可以执行的。动态模型编程认为每一个事物都可以是动作,所以动作是通过事物转化而来的。

    需要注意的是动态模型认为任何事物都可以转化为动作,但并不保证任何一个动作都可以正确执行,具体需要参看动作的执行原理。

1.2.动作对应的Java类

   在X-Meta引擎中动作对应的类是:

  • org.xmeta.Action
    动作是函数和方法。

    以下代码演示了动作和程序的关系:

//事物
Thing thing = new Thing();

//动作,任何事物都可以转化为动作
Action action = thing.getAction();

//动作可以执行
action.run();

2.行为

2.1.什么是行为?

    如果一个动作属于某个事物,那么我们就把它当作这个事物的行为,比如一个事物的名为ations子事物下的所有子事物一般是它的各种行为定义事物。

2.2.行为的执行方法

    行为是属于事物的,因此一般通过事物来调用:

//事物
Thing thing = new Thing();

//执行它的行为
thing.doAction("actionName");

3. 示例

3.1 示例代码

    本示例的代码主要有:PersonWithAction.xer.xml和PersonWithActionTest.java。在X-Meta引擎的源码中可以找到。

3.2 行为的定义

    在这里我们只讲行为的定义,因为任何事物都可以转化为动作,所以不需要专门讲动作的定义了,事物即动作。

    行为的定义在PersonWithAction.xer.xml。

<Person name="Tom" age="40">
    <Child name="Smith" age="10"/>
    <actions name="actions" descriptors="actions">
        <JavaAction name="run" useOuterJava="true"   descriptors="JavaAction" 
                methodName="run"  outerClassName="org.xmeta.example.PersonWithActionTest"/>
    </actions>
</Person>

    在这里Person的第一个事物名为actions的子节点是<actions name="actions" descriptors="actions">,它下面的<JavaAction name="run"...../>是行为的定义。

    由于任何事物都可以转化为动作,所以actions节点下的事物可以是任意事物,并不一定是JavaAction,JavaAction是使用Java定义的动作,还可以使用GroovyAction、LuaAction、PythonAction或其他可以当做动作的事物等。

3.3 动作和行为的测试代码

    可以在Java代码中执行动作和行为,见下面的代码。

package org.xmeta.example;

import org.xmeta.Action;
import org.xmeta.ActionContext;
import org.xmeta.Thing;
import org.xmeta.World;

public class PersonWithActionTest {
	/**
	 * 事物的行为实现。
	 * 
	 * @param actionContext
	 */
	public static void run(ActionContext actionContext){
		Thing self = (Thing) actionContext.get("self");
		
		//属性
		System.out.println("name=" + self.get("name"));
		System.out.println("age=" + self.get("age"));

		//子事物
		for(Thing child : self.getChilds()){
			System.out.println("child name=" + child.get("name"));
			System.out.println("child age=" + child.get("age"));
		}
	}
	
	public static void main(String args[]){
		//初始化World,World是获取事物的容器
		World world = World.getInstance();
		world.init(".");
		
		//获取Perxon.xer.xml定义的事物
		Thing person = world.getThing("org.xmeta.example.PersonWithAction");
		person.doAction("run");
		
		//Person也可以转化为动作执行,不过这里执行会出现异常,因此action直接执行是不包含self变量
		Action action = person.getAction();
		action.run();
	}
}

4. 动作和行为的差别

    在4中的例子里,最后执行动作会抛出异常,这是因为动作在执行时没有self变量,而行为执行时有self变量。

    这里的self变量相当于Java中的this变量,当一个动作被当做行为执行时那么它所属的事物(对象)本身就会以self为变量名放入到变量上下文中,而仅仅当做动作执行时则没有这个操作。

Copyright ©  2007-2014 XWorker.org  版权所有

沪ICP备08000575号