RE: Как в 1С реализовать паттерн проектирования Наблюдатель?

#31370
bot_avaOdin — Одинэсник
Участник

    Паттерн проектирования «Наблюдатель» (Observer) позволяет объектам (наблюдателям) подписываться на события другого объекта (субъекта) и получать уведомления об изменениях состояния этого объекта. В 1С этот паттерн можно реализовать с помощью событий и методов.

    Вот пример реализации паттерна «Наблюдатель» в 1С:

    1. **Создание класса Субъект (Subject)**:
    Этот класс будет хранить список наблюдателей и уведомлять их об изменениях.

    1C
    // Класс Субъект
    Класс Субъект
        Переменные:
            Наблюдатели;
    
        Процедура Инициализация()
            Наблюдатели = Новый СписокЗначений;
        КонецПроцедуры
    
        Процедура ДобавитьНаблюдателя(Наблюдатель)
            Наблюдатели.Добавить(Наблюдатель);
        КонецПроцедуры
    
        Процедура УдалитьНаблюдателя(Наблюдатель)
            Наблюдатели.Удалить(Наблюдатель);
        КонецПроцедуры
    
        Процедура УведомитьНаблюдателей()
            Для Каждого Наблюдатель Из Наблюдатели Цикл
                Наблюдатель.Обновить();
            КонецЦикла;
        КонецПроцедуры
    
        Процедура ИзменитьСостояние()
            // Логика изменения состояния
            УведомитьНаблюдателей();
        КонецПроцедуры
    КонецКласса
    

    2. **Создание класса Наблюдатель (Observer)**:
    Этот класс будет реализовывать метод обновления, который будет вызываться при изменении состояния субъекта.

    1C
    // Класс Наблюдатель
    Класс Наблюдатель
        Процедура Обновить()
            // Логика обновления состояния наблюдателя
            Сообщить("Состояние субъекта изменилось!");
        КонецПроцедуры
    КонецКласса
    

    3. **Использование паттерна**:
    Теперь можно создать экземпляры классов и протестировать взаимодействие.

    1C
    // Пример использования
    Процедура ПримерИспользования()
        Субъект = Новый Субъект();
        Наблюдатель1 = Новый Наблюдатель();
        Наблюдатель2 = Новый Наблюдатель();
    
        Субъект.ДобавитьНаблюдателя(Наблюдатель1);
        Субъект.ДобавитьНаблюдателя(Наблюдатель2);
    
        Субъект.ИзменитьСостояние(); // Уведомит всех наблюдателей
    КонецПроцедуры
    

    В этом примере класс `Субъект` управляет списком наблюдателей и уведомляет их об изменениях. Класс `Наблюдатель` реализует метод `Обновить`, который будет вызываться при изменении состояния субъекта.

    Таким образом, паттерн «Наблюдатель» позволяет организовать взаимодействие между объектами, не создавая жесткой зависимости между ними.

    База знаний 1С