Восстановление прослушивателей

Создание Прослушивателя с loadobj

Предположим, что вы создаете прослушиватель свойства и хотите смочь сохранить и восстановить источник события и прослушиватель. Один подход должен создать прослушиватель из loadobj метод.

Использование переходного свойства загрузить прослушиватель

BankAccount класс хранит остаток на счете и состояние счета. PostSet прослушиватель присоединяется к AccountBalance свойство управляет состоянием счета.

Когда AccountBalance изменения значения свойства, коллбэк прослушивателя определяет состояние счета. Важные моменты включают:

  • BankAccount класс задает AccountManagerListener свойство содержать указатель прослушивателя. Это свойство включает loadobj метод, чтобы создать прослушиватель и возвратить ссылку на него в объекте, который загружается в рабочую область.

  • AccountManagerListener свойством является Transient потому что нет никакой потребности сохранить указатель прослушивателя BankAccount объект. Создайте прослушиватель, который присоединен к новому BankAccount объект создается во время процесса загрузки.

  • AccountBalance прослушиватель устанавливает AccountStatus.

  • Только AccountManager класс может получить доступ к AccountStatus свойство.

classdef BankAccount < handle
   properties (SetObservable, AbortSet)
      AccountBalance
   end
   properties (Transient)
      AccountManagerListener
   end
   properties (Access = ?AccountManager)
      AccountStatus
   end
   methods
      function obj = BankAccount(initialBalance)
         obj.AccountBalance = initialBalance;
         obj.AccountStatus = 'New Account';
         obj.AccountManagerListener = AccountManager.addAccount(obj);
      end
   end
   methods (Static)
      function obj = loadobj(obj)
         if isstruct(obj) % Handle error
            initialBalance = obj.AccountBalance;
            obj = BankAccount(initialBalance);
         else
            obj.AccountManagerListener = AccountManager.addAccount(obj);
         end
      end
   end
end

Примите AccountManager класс предоставляет услуги для различных типов учетных записей. Для BankAccount класс, AccountManager класс задает два Static методы:

  • assignStatus — Коллбэк для AccountBalance свойство PostSet прослушиватель. Этот метод определяет значение BankAccount AccountStatus свойство.

  • addAccount — Создает AccountBalance свойство PostSet прослушиватель. BankAccount конструктор и loadobj методы вызывают этот метод.

classdef AccountManager
   methods (Static)
      function assignStatus(BA,~)
         if BA.AccountBalance < 0 && BA.AccountBalance >= -100
            BA.AccountStatus = 'overdrawn';
         elseif BA.AccountBalance < -100
            BA.AccountStatus = 'frozen';
         else
            BA.AccountStatus = 'open';
         end
      end
      function lh = addAccount(BA)
         lh = addlistener(BA,'AccountBalance','PostSet', ...
            @(src,evt)AccountManager.assignStatus(BA));
      end
   end
end

Используя классы BankAccount и AccountManager

Создайте экземпляр BankAccount класс.

ba = BankAccount(100)
ba = 

  BankAccount with properties:

            AccountBalance: 100
    AccountManagerListener: [1x1 event.proplistener]
             AccountStatus: 'New Account'

Теперь установите значение учетной записи, чтобы подтвердить что AccountManager наборы AccountStatus соответственно:

ba.AccountBalance = -10;
ba.AccountStatus
ans =

overdrawn

Похожие темы