from abc import ABC, abstractmethod
# Observer Pattern
class Subject:
def __init__(self):
self._observers = []
self._state = None
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._state)
def set_state(self, state):
self._state = state
self.notify()
class Observer(ABC):
@abstractmethod
def update(self, state):
pass
class ConcreteObserver(Observer):
def __init__(self, name):
self.name = name
def update(self, state):
print(f"{self.name} received state update: {state}")
# Strategy Pattern
class Strategy(ABC):
@abstractmethod
def execute(self, data):
pass
class ConcreteStrategyA(Strategy):
def execute(self, data):
return sorted(data)
class ConcreteStrategyB(Strategy):
def execute(self, data):
return sorted(data, reverse=True)
class Context:
def __init__(self, strategy):
self._strategy = strategy
def set_strategy(self, strategy):
self._strategy = strategy
def do_algorithm(self, data):
return self._strategy.execute(data)
# Command Pattern
class Command(ABC):
@abstractmethod
def execute(self):
pass
class Receiver:
def action(self):
print("Receiver: Action performed")
class ConcreteCommand(Command):
def __init__(self, receiver):
self._receiver = receiver
def execute(self):
self._receiver.action()
class Invoker:
def __init__(self):
self._commands = []
def store_command(self, command):
self._commands.append(command)
def execute_commands(self):
for command in self._commands:
command.execute()
# Demonstration
if __name__ == "__main__":
# Observer
subject = Subject()
observer1 = ConcreteObserver("Observer1")
observer2 = ConcreteObserver("Observer2")
subject.attach(observer1)
subject.attach(observer2)
subject.set_state("State 1")
# Strategy
data = [3, 1, 2]
context = Context(ConcreteStrategyA())
print("Strategy A result:", context.do_algorithm(data))
context.set_strategy(ConcreteStrategyB())
print("Strategy B result:", context.do_algorithm(data))
# Command
receiver = Receiver()
command = ConcreteCommand(receiver)
invoker = Invoker()
invoker.store_command(command)
invoker.execute_commands()