读CEGUI::Window等的源码会发现,Window将Property子类作为静态字段,而在构造时才通过addProperty将静态属性指针加入到属性集。PropertySet保存了属性值访问代理的集合,通过这些接口可以实现属性值访问。而Property并不存贮属性值,仅为属性值访问代理。属性值保存在PropertySet的子类对象中。PropertySet的子类保存属性的值,同时重新定义了这些值的直观访问接口,避免了必须通过字符串界面的属性集访问造成的性能损伤。
PropertySet从
PropertyReceiver继承,并且Property通过PropertyReceiver进行get、set,这可将Property的属性操作和PropertySet解耦合。Property只需通过PropertyReceiver即可进行属性操作,而无需关注PropertyReceiver是否是一个PropertySet,无需关注Property是否被用在了一个PropertySet中,无需关注属性值保存者是否继承自PropertySet,完全独立了Property和Property的使用者。
用属性集而不是给对象增加很多字段,可以保持对象接口简洁统一。属性集也可以和对象之间的继承关系很好的配合,子类会自然拥有基类属性集的访问权。属性集很容易让人想起数据库中的表,比起杂乱组织的字段,“表”的概念更容易被理解和接受。
属性集有“自我描述”的功能,可以通过遍历对象的属性集得到其支持的所有属性(有点
反射的味道)。这对
CELayoutEditor等编辑器的制作非常有用。避免因为要编辑的对象字段调整而导致编辑器必须同步调整。
欣赏CEGUI动态属性集的设计。
推荐阅读:
《游戏编程精粹2》1.7 用于通用C++成员访问的属性类。其中谈到动态属性集还可以用来暴露方法,这样可以做到对象方法的动态插接!
评论