可以使用装饰器模式或者享元模式来解决这个问题。以下是一个使用装饰器模式的示例代码:
class SubObject:
def method(self, arg):
# do something
pass
class Object:
def __init__(self, sub_object):
self.sub_object = sub_object
def method(self, arg):
# do something
self.sub_object.method(arg)
# do something
class Decorator:
def __init__(self, obj):
self.obj = obj
def method(self, arg):
# check if the method has been called with the same argument before
if arg not in self.cache:
self.cache.add(arg)
self.obj.method(arg)
# the cache can be a set or any other data structure that provides constant time membership check
cache = set()
sub_obj = SubObject()
# create a list of objects
objects = [Object(sub_obj) for i in range(10)]
# decorate the objects with the decorator
for obj in objects:
obj.method = Decorator(obj).method
这个解决方法使用了一个装饰器 Decorator
,它保存一个缓存 cache
来避免重复调用相同的方法,如果缓存中没有包含当前参数,那么就调用被装饰对象的方法,否则就跳过。在代码示例中,我们创建了一个包含 10 个对象的列表,然后用装饰器装饰这些对象的方法。当调用被装饰的方法时,装饰器会检查缓存 cache
中是否已经有了相同的参数,如果没有,就调用原始的方法,同时将当前参数添加到缓存中,如果已经存在相同的参数,那么就直接跳过。这样一来,就避免了重复调用相同子对象的相同方法的问题。