exponenta event banner

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

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

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

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

BankAccount В классе хранится сальдо счета и статус счета. A 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

Использование классов SunAccount и 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

Связанные темы