Как зарегистрировать обработчики событий в (обратном?) Шаблоне наблюдателя? - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь создать часть пользовательского интерфейса, состоящую из сетки перетаскиваемых пэдов, которые можно перетаскивать друг на друга.

Когда пэд упал на другой, они должны поменяться местами.

Я хочу, чтобы объекты классов Pad и Pads как можно больше не обращали внимания друг на друга, поэтому я подумал о применении шаблона наблюдателя с этими двумя классами, унаследованными от классов Observer и Observable соответственно.

Я придумал такой шаблонный код:

class Observable:
    def __init__(self):
        self.observers = []

    def subscribe(self, observer):
        self.observers.append(observer)

    def unsubscribe(self, observer):
        self.observers.remove(observer)

    def notify(self, data):
        for observer in self.observers:
            observer.receive(data)

class Observer:
    def receive(self, data):
        print('{} received {}'.format(self.id, data))

class Pads(Observable):
    def __init__(self, n_pads):
        super().__init__()
        self.pads = []
        for i in range(1, n_pads + 1):
            pad = Pad(i)
            self.pads.append(pad)
            self.subscribe(pad)

    def swap(self, src_pad, target_pad):
        a = self.pads.index(src_pad)
        b = self.pads.index(target_pad)
        self.pads[a], self.pads[b] = self.pads[b], self.pads[a]
        print('Swapped pad {} with pad {}'.format(src_pad.id, target_pad.id))  

class Pad(Observer):
    def __init__(self, id):
        self.id = id

    def drop_on(self, target_pad):
        print('Dropped pad {} on pad {}'.format(self.id, target_pad.id))
        # how to call 'swap' of 'Pads'class automatically here?

pads = Pads(16)
some_pad = pads.pads[8]
another_pad = pads.pads[11]

some_pad.drop_on(another_pad) 

# I do not want to call this manually. Instead, I want it to happen
# automatically after "some_pad.drop_on(another_pad)"
pads.swap(some_pad, another_pad) 

однако я не знаю, как двигаться дальше.

Полагаю, мне нужно реализовать метод notify класса Observable таким образом, чтобы метод swap класса Pads автоматически вызывался всякий раз, когда drop_on метод Pad называется.

Может кто-нибудь подсказать мне, как этого добиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...