使用其他语言实现 Flex [Bindable]

36 阅读2分钟

在 ActionScript 中,可以使用[Bindable]属性标记变量,这种方式可以让变量值的变化实时生效,且能立即体现到整个应用程序中,这是非常方便的。 那么,在其他编程语言中如何实现这个功能呢?起初我考虑使用事件或包装器类,但没能想出干净的解决方案。

huake_00015_.jpg

2、解决方案

可以采用观察者模式来实现。

例如,假设有这样一个类:Person,它拥有一个属性name。如果想让name的变化实时生效,可以使用观察者模式来实现。

方式一:

Python 实现

class Person:
    def __init__(self, name):
        self._name = name
        self._observers = []

    def add_observer(self, observer):
        self._observers.append(observer)

    def notify_observers(self):
        for observer in self._observers:
            observer.update(self)

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, new_name):
        self._name = new_name
        self.notify_observers()


class Observer:
    def update(self, person):
        pass


class NameObserver(Observer):
    def update(self, person):
        print(f"Person's name changed to {person.name}")


# Create a person instance
person = Person("John Doe")

# Create a name observer
name_observer = NameObserver()

# Add the observer to the person
person.add_observer(name_observer)

# Change the person's name
person.name = "Jane Doe"

在上述Python代码中:

  • 定义了一个Person类,它有一个属性name
  • 定义了一个Observer类,它是抽象的观察者类。
  • 定义了一个NameObserver类,它是观察者类,当Personname属性发生变化时,它会收到通知并输出改变后的值。
  • 创建一个Person实例并给它一个初始值John Doe
  • 创建一个NameObserver实例。
  • 将观察者添加到Person实例中。
  • 改变Personname属性,观察者将收到通知并打印出改变后的name值。

这样,当Personname属性发生改变时,NameObserver就会收到通知并打印出改变后的值。

方式二:

JavaScript 实现

class Person {
  constructor(name) {
    this._name = name;
    this._observers = [];
  }

  addObserver(observer) {
    this._observers.push(observer);
  }

  notifyObservers() {
    for (const observer of this._observers) {
      observer.update(this);
    }
  }

  get name() {
    return this._name;
  }

  set name(newName) {
    this._name = newName;
    this.notifyObservers();
  }
}

class Observer {
  update(person) {}
}

class NameObserver extends Observer {
  update(person) {
    console.log(`Person's name changed to ${person.name}`);
  }
}

// Create a person instance
const person = new Person("John Doe");

// Create a name observer
const nameObserver = new NameObserver();

// Add the observer to the person
person.addObserver(nameObserver);

// Change the person's name
person.name = "Jane Doe";

在上述JavaScript代码中:

  • 定义了一个Person类,它有一个属性name
  • 定义了一个Observer类,它是抽象的观察者类。
  • 定义了一个NameObserver类,它是观察者类,当Personname属性发生变化时,它会收到通知并输出改变后的值。
  • 创建一个Person实例并给它一个初始值John Doe
  • 创建一个NameObserver实例。
  • 将观察者添加到Person实例中。
  • 改变Personname属性,观察者将收到通知并打印出改变后的name值。