-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobserver.py
More file actions
115 lines (85 loc) · 3.33 KB
/
Copy pathobserver.py
File metadata and controls
115 lines (85 loc) · 3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from pydantic import BaseModel
from typing import List
from abc import ABC, abstractmethod
class Event:
def __init__(self, type, details):
self.type = type
self.details = details
class Observer(ABC, BaseModel):
@abstractmethod
def eventOccurred(self, event: Event):
pass
class Subject(BaseModel):
_observers: List[Observer]
@abstractmethod
def attach(self, observer: Observer):
pass
@abstractmethod
def detach(self, observer: Observer):
pass
@abstractmethod
def notify(self, event: Event):
pass
class RecomendationEngine(Observer):
def eventOccurred(self, event: Event):
print(
"Я - Движок рекомендаций, и я получил {} с деталями: {}".format(
event.type, event.details
)
)
class NotificationSender(Observer):
def eventOccurred(self, event: Event):
print(
"Я - Отправитель уведомлений, и я получил {} с деталями: {}".format(
event.type, event.details
)
)
class AnalyticsCollector(Observer):
def eventOccurred(self, event: Event):
print(
"Я - Собиратель аналитики, и я получил {} с деталями: {}".format(
event.type, event.details
)
)
class AdvertisingIntegrator(Observer):
def eventOccurred(self, event: Event):
print(
"Я - Интегратор рекламы, и я получил {} с деталями: {}".format(
event.type, event.details
)
)
class PostEvent(Event):
def __init__(self, details):
type = "Post"
super().__init__(type, details)
class Publisher(Subject):
_observers: List[Observer] = []
def attach(self, observer: Observer):
if observer not in self._observers:
self._observers.append(observer)
def detach(self, observer: Observer):
if observer in self._observers:
self._observers.remove()
def notify(self, event: Event):
for observer in self._observers:
observer.eventOccurred(event)
def create_post(self, text):
event = PostEvent(text)
print("Создал пост, детали: {}".format(text))
self.notify(event)
recom_eng = RecomendationEngine()
notif_send = NotificationSender()
analyt_coll = AnalyticsCollector()
advert_integr = AdvertisingIntegrator()
publisher = Publisher()
publisher.attach(recom_eng)
publisher.attach(notif_send)
publisher.attach(analyt_coll)
publisher.attach(advert_integr)
publisher.create_post("Видео с милым котиком")
# output:
# Создал пост, детали: Видео с милым котиком
# Я - Движок рекомендаций, и я получил Post с деталями: Видео с милым котиком
# Я - Отправитель уведомлений, и я получил Post с деталями: Видео с милым котиком
# Я - Собиратель аналитики, и я получил Post с деталями: Видео с милым котиком
# Я - Интегратор рекламы, и я получил Post с деталями: Видео с милым котиком