一 FacetPattern(侧面模式)
意图:限制一个接口来提供较少的authority,通常接口仅提供方法的子集或者参数的子集。
在面向能力编程(CapabilityOrientedProgramming)中Facets被作为一种安全模式,Facets符合最小权利原则(PrincipleOfLeastAuthority) 。例如,如果一些对象的客户端仅需要读信息,那么仅提供客户端只读的Facet。
Facets应当以这样一种方式实现:如果方法最初被添加到接口,那么默认情况下不被添加到Facet。方法应当在必须明确指示(通过元数据或命名约定)时才被包括到一个Facet中。如果一个对象先前知道需要哪些Facets,作为优化措施对象能够cache这些Facets。
和其它的安全模式相似,FacetPattern被用来增强系统的安全和鲁棒性。即使当安全自身不是一个问题的情况下,通过提供一个带有确定性的或纯粹性的功能子集的接口也是有好处的。
FacetPattern的一个Facet不同于适配器模式中的适配器,Facet接口总是原始接口的子集,功能是限制权限而不是在不兼容的接口之间进行转换。
FacetPattern也属于封装模式,使用了封装机制或者handle/body机制。
本段翻译自 http://c2.com/cgi-bin/wiki?CaretakerPattern
二 Caretaker Pattern(临时代理模式)
意图: 对客户可以临时许可一种能力,使用完后能够随即撤销。
适用场景: 在能力系统中,当你想要一个对象能够对不同的客户来分别临时撤销许可时可以使用Caretaker Pattern。
Caretaker Pattern也是封装模式(也称做HandleBodyPattern)的变种。
为了创建可撤销的能力,在Caretaker Pattern模式中通过透明的转发消息到特定的接收者(body)来许可一种能力,最后通过设置引用的封装对象(接收对象的封装)为null来撤销原先许可的能力。为此,Caretaker Pattern模式中客户不能看到主体对象(body对象),仅能看到临时代理对象,封装是透明的,临时代理对象不能够察觉主体对象的存在与否,所以也不必有指向临时代理对象的指针。
正常情况临时代理有一个与转发接口分离的接口,被用来触发撤销操作。
如果系统使用许可标志,临时代理能够限制那种许可被允许,而不是仅支持要么全有要么全无的许可。这可以通过与FacetPattern模式中的handle对象组合来达到这种效果。
ParadigmRegained的作者(MarkMiller和JonathanShapiro)认为Caretaker Pattern通过使参数失效来撤销许可是不可实施的。
通常认为DataAccessObject是Caretaker Pattern模式的一个子类。
本段 翻译自http://c2.com/cgi-bin/wiki?FacetPattern