装饰器模式与单例模式详解
1. 装饰器模式的使用与滥用
装饰器模式在创建者眼中备受青睐,然而使用者却可能对此感到头疼。装饰器模式有助于构建者将不同功能清晰分离,例如在一个类中实现行编号,在另一个类中进行校验和计算,在第三个类中添加时间戳。但当使用者试图将这些小的构建块类组合成一个完整的工作系统时,麻烦就来了。使用者无法像使用 EnhancedWriter.new(path) 那样直接实例化一个单一对象,而必须自己将所有组件组合起来。
为了减轻组装负担,装饰器的实现者可以提供一些实用工具,例如构建器。在实现装饰器模式时,需要注意保持组件接口的简单性,避免使其过于复杂,因为复杂的接口会让每个装饰器的实现变得更加困难。
装饰器模式还存在一些潜在的缺点。长链装饰器会带来性能开销,当用一系列装饰器替代单一的整体类时,虽然获得了编程的模块化和代码的清晰性,但程序中浮动的对象数量会增加。如果处理的是少量打开的文件,这可能不是什么大问题,但如果涉及大型公司的所有员工数据,问题就会变得严重。此外,通过 N 个装饰器链传递的数据会被转手 N 次。
使用方法别名技术装饰对象还会使代码调试变得困难,因为方法在堆栈跟踪中显示的名称与源代码文件中的名称不同。
2. 实际应用中的装饰器
在 ActiveSupport 中可以找到方法别名风格装饰对象的一个很好的例子。ActiveSupport 为所有对象添加了一个名为 alias_method_chain 的方法,该方法允许用任意数量的特性装饰方法。
以下是使用 alias_method_chain </
超级会员免费看
订阅专栏 解锁全文
665

被折叠的 条评论
为什么被折叠?



