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

Создание Прослушивателя с 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

Похожие темы