我认为您也可以在这里使用“责任链”模式:
该模式允许多个对象处理请求,而无需将发送者类耦合到接收者的具体类。该链可以在运行时与任何遵循标准处理程序接口的处理程序动态组合。
使用这种模式的好处在于,您可以在单独的模块中定义和扩展不同的记分器,并在运行时根据问题条件动态组合它们。这是你如何做到的。首先,定义一个父 scorer 类:
from functools import reduce
class BaseScorer(object):
def __init__(self):
self._next_scorer = None
def set_next(self, scorer):
self._next_scorer = scorer
return scorer
def _call_next(self, house, score):
if self._next_scorer is None:
return score
return self._next_scorer.score(house, score)
def score(self, house, score=0):
raise NotImplementedError
@staticmethod
def chain(scorers):
reduce(lambda x, y: x.set_next(y), scorers)
return scorers[0]
然后,定义各种记分器类,例如:
class WindowScorer(BaseScorer):
def score(self, house, score=0):
if house.windows > 2:
score = score + 10
return self._call_next(house, score)
class GarageScorer(BaseScorer):
def score(self, house, score=0):
if house.garage:
score = score + 10
return self._call_next(house, score)
class FenceScorer(BaseScorer):
def score(self, house, score=0):
if house.fence == 'broken':
score = score - 5
return self._call_next(house, score)
这就是它的使用方法:
scorer = BaseScorer.chain([
WindowScorer(),
GarageScorer(),
FenceScorer()
])
house = House(windows=4, garage=True, fence='nice')
score = scorer.score(house)