我有以下代码:
class Person:
def __init__(self):
# address
street = None
post_code = None
city = None
# empoyment
company_name = None
position = None
class PersonBuilder:
def __init__(self, person=Person()):
self.person = person
def build(self):
return self.person
@property
def works(self):
return PersonJobBuilder(self.person)
@property
def lives(self):
return PersonAddressBuilder(self.person)
class PersonJobBuilder(PersonBuilder):
def __init__(self, person):
super().__init__(person)
def at(self, company):
self.person.company_name = company
return self
class PersonAddressBuilder(PersonBuilder):
def __init__(self, person):
super().__init__()
def city(self, city):
self.person.city = city
return self
pb = PersonBuilder()
person = pb
.works
.at('Cora')
.lives
.city('Kandu')
.build()
上面的代码不尊重开-关原则,因为每次我想添加新的构建器时,我都需要更改PersonBuilder
类以添加lives
、works
等方法。
我知道可以使用继承,但PersonAddressBuilder
从PersonJobBuilder
继承没有意义。
那么,还有哪些其他解决方案可用?
减少类之间依赖关系的一种典型方法是不使用继承,而是使用mixin模型。
这种方法与您喜欢的鸭子类型方法非常一致,但代价是必须确保字段和方法名称不会在 mixins 中重复 - 当范围很窄时不是问题;有时当你设计混合供不同类重用时会是一个问题。