Hallo zusammen,
Folgende Anfängerfrage zum Entwurfsmuster (Ist lange her, dass ich das
letzte Mal objektorientiert unterwegs war...):
In meiner main() erzeuge ich eine Instanz eines MQTT-Clients:
1 | def main():
|
2 | client = mqtt.Client()
|
3 | client.on_connect = on_connect
|
4 | # ...
|
5 |
|
6 | if __name__ == "__main__":
|
7 | main()
|
die "Callback"-Funktionen sind ebenfalls definiert, z.B.:
1 | def on_connect(client, userdata, flags, rc):
|
2 | print("Connected")
|
3 | # do something
|
4 |
|
5 | def on_data(client, userdata, flags, rc):
|
6 | # do something
|
Soweit, so gut. Nun möchte ich mir in der main() eine Instanz meiner
Klasse "Player" erzeugen. Diese hat u.a. die Funktion
"load_content(self, number)", mit der verschiedene Inhalte umgeschaltet
werden können.
Beides für sich funktioniert einwandfrei, welche Entwurdsmuster bieten
sich nun an, auf MQTT-Input hin den Player umzuschalten?
Mir fällt sowas ein wie:
- Ich erstelle eine eigene Klasse MQTTClient, die dann das "client =
mqtt.Client()" als Klassenvariable bekommt (also statt das in main() zu
machen)
- MQTTClient erhält eine Variable listener + eine SetterFunktion.
Dann geht also in der main() sowas wie
1 | client = MQTTClient()
|
2 | player = Player()
|
3 |
|
4 | client.setListener(player)
|
und die Callbackfunktion kann dann entsprechend sowas wie
1 | def on_data(client, userdata, flags, rc):
|
2 | print("Data received")
|
3 | client.listener.dataReceived(userdata)
|
Klasse "Player" muss dieses "Interface" natürlich implementieren.
Alternativ, aber aus Sicht des MQTT-Clients gesehen etwas weniger
"universell" ginge evtl. auch direkt
1 | def on_data(client, userdata, flags, rc):
|
2 | print("Data received")
|
3 | client.listener.load_content(client, number)
|
Ist das so sinnvoll, oder welche anderen Möglichkeiten habe ich? Ist
dieses "Listener-Pattern" generell üblich?