- 原文地址:http://www.cnblogs.com/WhiteCloud/archive/2006/07/31/464484.html
- 引用:http://www.cnblogs.com/WhiteCloud/services/trackbacks/464484.aspx
这个设计挺优雅,Group里可以添加Group和User……子又有孙、孙又生子,子子孙孙,无穷匮焉……不过,扯点题外话:在实际的应用当中,用户和用户组的关系不是这样简单的,一个用户是否具有某种权限,首先要看它自己(而不是组)是不是明确地拥有该权限,如果明确拥有,则它肯定有此权限;如果明确拒绝,则肯定无此权限;如果既未拥有也未拒绝,才去查看它的每一个组是不是拥有此权限,换句话说:仅当一个用户未明确拥有或拒绝某个权限时,该权限才从用户组继承。
从这一点上来说,“用户”和“用户组”这两个类,它们的行为并不一致,简单地说,Group类只有GrantPurview的行为,而User类却同时还有DenyPurview以及ClearPurview这两个行为,用户使用它们,就必须知道Group和User的区别,知道它们是哪一个具体子类。应用Composite模式的意图是“对单个对象和组合对象的使用具有一致性”,而Group和User完全是两种不同的类,如果使用者必须弄清他们正在使用哪一个具体子类,那么就不具有一致性。换句话说,如果UserBase这个接口也有DenyPurview和ClearPurview,那么在Group的实现里,就必然是一个退化函数。(至于User里AddChild方法抛出异常,这个倒可以在安全性和透明性上权衡)。
啊,再说一遍,题外话而已,没有否定黄MM的意思 :)