我是OOP设计的新手,有很多关于合成和聚合的文章,但是我找不到真正的代码示例,所以我写了一个简单的例子:
class Car
attr_reader :model, :valve
attr_writer :passenger
def initialize(model, valve)
@model = model
@engine = Engine.new(valve)
end
def run
puts "wowowowo"
end
end
class Engine
def initialize(valve)
@valve = valve
end
end
class Passenger
def initialize(name)
@name = name
end
end
p = Passenger.new("Foo")
car = Car.new("9-3 convertible", 4)
car.passenger(p)
这是做出决定的原因:
对于这种情况,当引擎实例的owner汽车实例不再存在时,该引擎实例将不可用。因此,发动机遵循汽车的生命周期。
引擎是汽车的一部分,所以汽车own引擎。
乘客实例在汽车实例不再存在时仍然可用,因此乘客拥有自己的生命周期,
请指出如果我对此有什么疑问,我的代码是否是好的设计?
更新:为澄清起见,我认为汽车->发动机是组成部分,汽车->乘客是集合体
组成
当两个实体之间存在合成时,组成的对象cannot不存在另一个实体而存在。组成是强关联,而聚集是弱关联。
Tree-Leaf是composition。叶是一部分树。没有树木,叶子就不存在。
聚合
[当两个实体之间存在合成时,组成的对象can不存在另一个实体而存在。
Car-Engine是aggregation。因为如果汽车停止工作,并且我们从数据库中将其删除,则由于该引擎可能仍在运行,因此不会删除该引擎。我们可以在另一辆车内使用此引擎。