在Ruby中,块(Block)和迭代器(Iterator)是实现循环和数据处理的重要工具。以下是一些与块和迭代器相关的常用设计模式:
适配器模式用于将一个类的接口转换成客户端所期望的另一个接口形式。在Ruby中,块可以作为适配器使用,将一个集合适配成另一个集合的行为。
class ArrayAdapter
def initialize(array)
@array = array
end
def each(&block)
@array.each(&block)
end
end
# 使用示例
array = [1, 2, 3]
adapter = ArrayAdapter.new(array)
adapter.each { |item| puts item }
装饰器模式允许在不修改原始类的情况下,动态地添加新的功能。在Ruby中,块可以作为装饰器使用,为集合添加额外的操作。
class ArrayDecorator
def initialize(array)
@array = array
end
def each(&block)
@array.each(&block)
end
def log_each(&block)
each do |item|
block.call(item)
puts "Logged: #{item}"
end
end
end
# 使用示例
array = [1, 2, 3]
decorator = ArrayDecorator.new(array)
decorator.log_each { |item| puts item }
组合模式允许将对象组合成树形结构以表示“部分-整体”的层次结构。在Ruby中,块可以作为组合的一部分,处理集合中的元素。
class CompositeCollection
attr_accessor :elements
def initialize
@elements = []
end
def add(element)
@elements << element
end
def each(&block)
@elements.each(&block)
end
end
# 使用示例
collection = CompositeCollection.new
collection.add("Element 1")
collection.add("Element 2")
collection.add("Element 3")
collection.each { |element| puts element }
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露其内部的表示。在Ruby中,迭代器模式是内置的,通过each
方法实现。
class MyCollection
def initialize
@items = []
end
def add(item)
@items << item
end
def each(&block)
@items.each(&block)
end
end
# 使用示例
collection = MyCollection.new
collection.add(1)
collection.add(2)
collection.add(3)
collection.each { |item| puts item }
策略模式定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。在Ruby中,块可以作为策略使用,实现不同的处理逻辑。
class Strategy
def execute(&block)
block.call
end
end
class AddStrategy < Strategy
def execute(&block)
block.call(1)
end
end
class MultiplyStrategy < Strategy
def execute(&block)
block.call(2)
end
end
# 使用示例
strategy = AddStrategy.new
strategy.execute { |x| puts x + 1 } # 输出 2
strategy = MultiplyStrategy.new
strategy.execute { |x| puts x * 2 } # 输出 4
这些设计模式可以帮助你更灵活地使用块和迭代器,实现更复杂的功能和逻辑。