以前,我们在讨论《业务分析三维度(场景+角色+时间)理论》 的软件设计的时候,对于场景中的访问者,动态附加场景许可的角色,如何通过访问者执行角色方法的问题,采用了下面的实现方式: Actor.ActAs Function(Para para); 这种方式本质上是将Actor转换成为了IRole接口的实例对象,然后进行方法访问的,但这样就暴露了角色对象,比如可以这样继续使用: IRole role=Actor.ActAs return role as T; } return null; } } 我们重点来看ActAs Actor("zhagnsan"); man.AddRole(new Animal());//为张三添加动物的本能职责 var result=man.ActAs 这里是程序输出: zhagnsan eat.rice. result:1 相比较文章开头的方式, 这里man.ActAs<IAnimal, int> 直接执行了角色对象的方法,而不给外部人员知晓zhangsan
husband1 = new Husband(zhangsan,diaochan); diaochan.ChildrenCount = 0; diaochan.ActAs <Wife>().Child_bearing(); //生孩子 zhangsan.ActAs<Husband>().Money += zhangsan.ActAs<Worker >().Work(); zhangsan.ActAs<Husband>().Child_rearing(); //生孩子 请看上面这个代码,基本上和我们的故事“剧本”描述的一模一样 zhangsan, diaochan); context.StartContext(); //场景参与人开始扮演角色 diaochan.ActAs <Wife>().Child_bearing(); zhangsan.ActAs<Husband>().Money += zhangsan.ActAs<Worker>().Work
} protected internal List<IRole<Actor>> Roles { get; private set; } public T ActAs Actor通过切换角色来实现不同的功能,这个可以通过Actor对象的ActAs泛型方法来切换当前Actor对象的角色。 ActAs泛型方法遍历Actor当前角色集合中所有的角色,如果找到就返回这个角色类型,找不到抛出异常,详细代码请看上面【演员的天分】。 回顾一下前面程序中Actor对象通过ActAs泛型方法切换当前角色执行角色功能的的示例代码示例,由于可以通过Actor对象来切换到拥有的角色对象,所以申明角色对象的变量都不需要了,这样能更加显示出角色谓词的强大力量 <Wife>().Child_bearing(); zhangsan.ActAs<Husband>().Money += zhangsan.ActAs<Worker>().Work