📅  最后修改于: 2023-12-03 15:23:42.655000             🧑  作者: Mango
复合设计模式是指将两个或更多的设计模式组合起来,以解决复杂的问题。这些设计模式在某些情况下会产生冲突,但在大多数情况下,它们可以组合使用,以实现更灵活,高效的解决方案。
一个典型的例子是将观察者模式与装饰器模式结合使用。通过使用装饰器模式,我们可以对对象进行定制,而不必影响到其他对象。当我们需要通知其他对象发生更改时,我们可以使用观察者模式来发送通知。
class Observable(object):
def __init__(self):
self.observers = []
def add_observer(self, observer):
if observer not in self.observers:
self.observers.append(observer)
def remove_observer(self, observer):
try:
self.observers.remove(observer)
except ValueError:
pass
def notify_observers(self, *args, **kwargs):
for observer in self.observers:
observer(*args, **kwargs)
class Person(Observable):
def __init__(self, name='', age=0):
super(Person, self).__init__()
self.name = name
self.age = age
def set_age(self, age):
self.age = age
self.notify_observers(self)
def set_name(self, name):
self.name = name
self.notify_observers(self)
class Logger(object):
def __init__(self, filename):
self.filename = filename
def __call__(self, obj):
with open(self.filename, 'a') as f:
f.write('%s: %s\n' % (obj.name, obj.age))
class Decorator(object):
def __init__(self, object):
self.object = object
def __getattr__(self, name):
return getattr(self.object, name)
class ObservablePerson(Decorator, Observable):
def set_age(self, age):
self.object.set_age(age)
self.notify_observers(self)
def set_name(self, name):
self.object.set_name(name)
self.notify_observers(self)
在上面的示例中,我们将观察者模式用于Person类,当年龄或姓名更改时发送通知。通过使用Decorator模式,我们可以创建一个ObservablePerson类,它具有Person类的所有功能,并且可以作为一个Subject使用。每当年龄或姓名更改时,ObservablePerson对象将通知其观察者。
通过使用复合设计模式,我们可以更好地组织和管理代码。这样我们就可以更快地解决问题,并且能够更灵活地扩展我们的代码。虽然重构代码可能需要花费一些时间和精力,但在长期内会为我们节省大量的时间和精力。