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

Создайте прослушиватель с loadobj

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

Используйте свойство Transient для загрузки прослушивателя

The BankAccount класс сохраняет сальдо счета и статус счета. A PostSet прослушиватель, подключенный к AccountBalance свойство контролирует состояние учетной записи.

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

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

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

  • The 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 прослушиватель. The 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

Похожие темы