Sobes.tech
Middle
94
questionbank

Приведи примеры поведенческих шаблонов проектирования.

Ответ от нейросети

sobes.tech AI

  • Chain of Responsibility (Цепочка обязанностей): Передача запроса по цепочке обработчиков. Каждый обработчик либо обрабатывает запрос, либо передает его следующему. Пример: обработка событий в GUI.

  • Command (Команда): Инкапсуляция запроса в виде объекта, позволяя параметризовать клиента различными запросами, ставить их в очередь или логировать, а также поддерживать отмену операций. Пример: действия в меню текстового редактора.

  • Iterator (Итератор): Предоставление способа последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления. Пример: перебор элементов коллекции.

    // Пример использования Iterator
    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
    
  • Mediator (Посредник): Определение объекта, инкапсулирующего взаимодействие между набором объектов. Посредник способствует слабой связанности, избавляя объекты от необходимости явно ссылаться друг на друга. Пример: взаимодействие UI-компонентов в диалоговом окне.

  • Memento (Хранитель): Без нарушения инкапсуляции фиксация и внешнее сохранение внутреннего состояния объекта, чтобы позднее можно было восстановить этот объект в прежнее состояние. Пример: функция отмены (undo) в приложении.

  • Observer (Наблюдатель): Определение зависимости «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются и автоматически обновляются. Пример: событийно-ориентированные системы.

    // Пример реализации Observer
    public interface Observer {
        void update();
    }
    
    public class Subject {
        private List<Observer> observers = new ArrayList<>();
    
        public void addObserver(Observer observer) {
            observers.add(observer);
        }
    
        public void notifyObservers() {
            for (Observer observer : observers) {
                observer.update();
            }
        }
    }
    
  • State (Состояние): Позволяет объекту изменять свое поведение в зависимости от внутреннего состояния. Кажется, будто изменился класс объекта. Пример: различные состояния TCP-соединения.

  • Strategy (Стратегия): Определение семейства алгоритмов, инкапсуляция каждого из них и обеспечение их взаимозаменяемости. Позволяет выбирать алгоритм во время выполнения программы. Пример: различные алгоритмы сортировки.

    // Пример использования Strategy
    interface SortingStrategy {
        void sort(int[] array);
    }
    
    class BubbleSortStrategy implements SortingStrategy {
        @Override
        public void sort(int[] array) {
            // Реализация пузырьковой сортировки
        }
    }
    
    class Context {
        private SortingStrategy strategy;
    
        public void setStrategy(SortingStrategy strategy) {
            this.strategy = strategy;
        }
    
        public void executeSort(int[] array) {
            strategy.sort(array);
        }
    }
    
  • Template Method (Шаблонный метод): Определение скелета алгоритма в суперклассе, позволяя подклассам переопределить определенные шаги алгоритма без изменения его общей структуры. Пример: шаги построения отчета.

    // Пример реализации Template Method
    abstract class AbstractClass {
        public final void templateMethod() {
            step1();
            step2();
            step3();
        }
    
        abstract void step1();
        void step2() { /* Дефолтная реализация */ }
        abstract void step3();
    }
    
    class ConcreteClass extends AbstractClass {
        @Override
        void step1() {
            // Специфичная реализация шага 1
        }
    
        @Override
        void step3() {
            // Специфичная реализация шага 3
        }
    }
    
  • Visitor (Посетитель): Представление операции, которую необходимо выполнить над элементами структуры объектов. Visitor позволяет определить новую операцию без изменения классов элементов, над которыми она оперирует. Пример: операции над элементами дерева синтаксического анализа.