请类比下列代码给出观察者模式的代码;# coding : utf-8 from abc import abstractmethod, ABCMeta class Graphic(metaclass=ABCMeta): @abstractmethod def draw(self): pass @abstractmethod def add(self, graphic): pass def getchildren(self): pass class Point(Graphic): def __init__(self, x, y): self.x = x self.y = y def draw(self): print(self) def add(self, graphic): raise TypeError def getchildren(self): raise TypeError def __str__(self): return "点(%s, %s)" % (self.x, self.y) class Line(Graphic): def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 def draw(self): print(self) def add(self, graphic): raise TypeError def getchildren(self): raise TypeError def __str__(self): return "线段[%s, %s]" % (self.p1, self.p2) # 复合图形 class Picture(Graphic): def __init__(self): self.children = [] def add(self, graphic): self.children.append(graphic) def getchildren(self): return self.children def draw(self): print("------复合图形------") for g in self.children: g.draw() print("------END------") pic1 = Picture() pic1.add(Point(2,3)) pic1.add(Line(Point(1,2), Point(4,5))) pic1.add(Line(Point(0,1), Point(2,1))) pic2 = Picture() pic2.add(Point(-2,-1)) pic2.add(Line(Point(0,0), Point(1,1))) pic = Picture() pic.add(pic1) pic.add(pic2) pic1.draw()
时间: 2023-06-26 20:03:35 浏览: 102
观察者模式的代码示例:
假设我们有一个主题对象(Subject),它维护了一组观察者对象(Observer)。当主题对象发生变化时,它会通知所有观察者对象,以便它们可以采取相应的行动。
以下是一个简单的观察者模式的示例代码:
```python
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self, subject):
pass
class Subject:
def __init__(self):
self.observers = []
def attach(self, observer):
self.observers.append(observer)
def detach(self, observer):
self.observers.remove(observer)
def notify(self):
for observer in self.observers:
observer.update(self)
class Data(Subject):
def __init__(self):
super().__init__()
self.data = None
def set_data(self, data):
self.data = data
self.notify()
def get_data(self):
return self.data
class Observer1(Observer):
def update(self, subject):
print("Observer1: Subject's data has changed to", subject.get_data())
class Observer2(Observer):
def update(self, subject):
print("Observer2: Subject's data has changed to", subject.get_data())
data = Data()
observer1 = Observer1()
observer2 = Observer2()
data.attach(observer1)
data.attach(observer2)
data.set_data(10)
data.detach(observer2)
data.set_data(20)
```
在这个示例中,我们定义了一个主题对象(Subject)和两个观察者对象(Observer1和Observer2)。主题对象维护一个观察者对象列表,并具有添加、删除和通知观察者的方法。观察者对象继承自抽象基类Observer,并实现了update方法,以便在主题对象发生变化时得到通知。主题对象也继承自抽象基类,并实现了具体的业务逻辑(在这个示例中,它只是更新数据并通知观察者)。最后,我们创建了一个Data对象,并附加了两个观察者对象。然后,我们修改了Data对象的数据,并检查观察者对象是否得到了通知。我们还演示了如何使用detach方法从主题对象中分离观察者对象。
阅读全文