设计思路
- 定义商品类:首先定义一个
Product
类来表示商品,包含商品的各种属性,如类别、价格、库存状态等。
- 定义查询构建器类:创建一个
ProductQueryBuilder
类,这个类将使用流畅接口模式。它内部维护一个符合条件的商品列表以及查询条件。通过方法链来设置不同的查询条件,最后通过一个方法返回符合条件的商品列表。
- 链式调用方法:在
ProductQueryBuilder
类中定义方法来设置按商品类别、价格范围、库存状态等查询条件,每个方法返回 self
以支持链式调用。
核心代码实现
class Product
attr_accessor :category, :price, :stock_status
def initialize(category, price, stock_status)
@category = category
@price = price
@stock_status = stock_status
end
end
class ProductQueryBuilder
def initialize(products)
@products = products
@filtered_products = @products.dup
end
def by_category(category)
@filtered_products.select! { |product| product.category == category }
self
end
def by_price_range(min, max)
@filtered_products.select! { |product| product.price >= min && product.price <= max }
self
end
def by_stock_status(status)
@filtered_products.select! { |product| product.stock_status == status }
self
end
def build
@filtered_products
end
end
# 示例使用
products = [
Product.new('electronics', 100, 'in_stock'),
Product.new('clothing', 50, 'out_of_stock'),
Product.new('electronics', 150, 'in_stock')
]
result = ProductQueryBuilder.new(products)
.by_category('electronics')
.by_price_range(100, 150)
.by_stock_status('in_stock')
.build
result.each do |product|
puts "Category: #{product.category}, Price: #{product.price}, Stock Status: #{product.stock_status}"
end