Обмен технологиями

Примеры реализации сценариев использования шаблонов проектирования, преимущества и недостатки (структурный шаблон - шаблон прокси, шаблон внешнего вида)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

структурный образец

Шаблон прокси

Шаблон прокси — это структурный шаблон проектирования, который контролирует доступ к другому объекту путем введения прокси-объекта. Этот прокси-объект может предоставлять дополнительные функции прокси-объекту, такие как управление доступом, отложенная инициализация, ведение журнала или доступ к сети.

Применимая сцена

  1. удаленный агент

    • Обеспечивает локальное представление объекта в разных адресных пространствах.
  2. виртуальный агент

    • Создавайте дорогие объекты по мере необходимости.
  3. агент защиты

    • Управляйте доступом к исходному объекту.
  4. Умное руководство

    • Выполните некоторые дополнительные операции при доступе к объекту, такие как операции подсчета или обнаружение ссылок.

Пример реализации (Java)

Ниже приведен простой пример реализации шаблона прокси, показывающий, как контролировать доступ к реальному объекту через прокси-объект.

1. Определите интерфейс темы
public interface Subject {
    void request();
}
  • 1
  • 2
  • 3
  • иллюстрироватьSubject Интерфейс определяетrequest Метод. Это метод, который должен реализовать как реальный объект, так и прокси-объект.
2. Определите реальный предметный класс (RealSubject).
public class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • иллюстрироватьRealSubject класс реализованSubject Интерфейсrequest Метод, представляющий класс, который фактически обрабатывает запрос.
3. Определить класс прокси (Прокси)
public class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    public void request() {
        if (this.checkAccess()) {
            this.realSubject.request();
            this.logAccess();
        }
    }

    private boolean checkAccess() {
        // 检查访问权限
        System.out.println("Proxy: Checking access prior to firing a real request.");
        return true;
    }

    private void logAccess() {
        // 记录请求日志
        System.out.println("Proxy: Logging the time of request.");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • иллюстрировать
    • Proxy класс реализованSubject интерфейс и содержитRealSubject объект.
    • существовать request В этом методе прокси-класс сначала проверяет права доступа, а затем вызывает метод реального объекта.request метод и, наконец, запишите журнал запросов.
4. Код клиента
public class Client {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);
        
        proxy.request();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • иллюстрировать
    • Client класс созданRealSubject иProxy объект, черезProxy Вызов объектаrequest метод управленияRealSubject Доступ.

преимущество

  1. Изоляция

    • Режим прокси может служить посредником между вызывающим объектом и реальным объектом, уменьшая связь между компонентами системы и усиливая изоляцию между объектами.
  2. безопасность

    • Доступ к реальным объектам можно контролировать через прокси, что позволяет проводить проверки безопасности и углубленную проверку.
  3. Масштабируемость

    • Режим прокси позволяет гибко добавлять функции без изменения конкретного объектного кода.
  4. Разумный

    • Некоторые дополнительные операции, такие как отложенная инициализация и журналы доступа, можно реализовать без изменения интерфейса сервисного объекта.

недостаток

  1. сложность кода

    • Внедрение агентов также означает увеличение сложности системы, возможное введение новых классов и интерфейсов, а также увеличение понимания кода и затрат на обслуживание.
  2. Время отклика

    • Режим прокси-сервера может привести к замедлению работы системы, особенно если к операции прокси-сервера добавляется много логики обработки.
  3. Сложность дизайна

    • Правильная разработка и реализация шаблона прокси требует тщательного рассмотрения общей конструкции системы, чтобы гарантировать отсутствие негативного влияния на производительность системы.

Диаграмма классов

Client
  |
  v
Subject <---- Proxy <---- RealSubject
  • 1
  • 2
  • 3
  • 4

Подведем итог

Шаблон прокси обеспечивает эффективный способ контроля и управления доступом к объектам. Используя прокси, вы можете добавлять различные функции, сохраняя при этом четкость ответственности бизнес-объектов. Этот режим особенно подходит для сценариев, требующих контроля доступа и других операций предварительной обработки бизнес-объектов.

Фасадный узор

Шаблон фасада — это шаблон структурного проектирования, который упрощает использование сложных подсистем, предоставляя унифицированный интерфейс для доступа к группе интерфейсов в подсистеме. Шаблон фасада определяет высокоуровневый интерфейс, который упрощает использование этой подсистемы.

Применимая сцена

  1. Упрощение интерфейсов к сложным системам

    • Обеспечьте простой интерфейс для сложных подсистем, чтобы уменьшить сложность внешнего взаимодействия с подсистемами.
  2. Иерархия

    • В многоуровневой структуре системы шаблоны внешнего вида могут использоваться для определения входа на каждый уровень и упрощения зависимостей между уровнями.
  3. Разделенная система

    • Введение шаблона внешнего вида уменьшает связь между подсистемой и клиентом.

Пример реализации (Java)

Ниже приведен простой пример реализации шаблона «Фасад», показывающий, как упростить использование подсистем с помощью классов фасада.

1. Определить классы подсистем
public class SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA: operationA");
    }
}

public class SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB: operationB");
    }
}

public class SubsystemC {
    public void operationC() {
        System.out.println("SubsystemC: operationC");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
2. Определите класс внешнего вида
public class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;

    public Facade() {
        this.subsystemA = new SubsystemA();
        this.subsystemB = new SubsystemB();
        this.subsystemC = new SubsystemC();
    }

    public void operation1() {
        System.out.println("Facade: operation1");
        subsystemA.operationA();
        subsystemB.operationB();
    }

    public void operation2() {
        System.out.println("Facade: operation2");
        subsystemB.operationB();
        subsystemC.operationC();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
3. Код клиента
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation1();
        facade.operation2();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Примечания

  1. Класс подсистемы

    • SubsystemA, SubsystemB, и SubsystemC Это конкретный класс реализации подсистемы, и каждый класс имеет свой уникальный метод работы.
  2. Класс внешнего вида

    • Facade Классы содержат объекты подсистемы и предоставляют упрощенные интерфейсы.operation1 иoperation2 для вызова функций подсистемы.
  3. клиентский код

    • Client урок пройденFacade класс для звонкаoperation1 иoperation2, что упрощает использование сложных подсистем.

преимущество

  1. Упрощенный интерфейс

    • Шаблон внешнего вида обеспечивает простой интерфейс для подсистем, уменьшая сложность взаимодействия с подсистемами.
  2. Слабая связь

    • Шаблон внешнего вида уменьшает связь между подсистемой и клиентом, что помогает улучшить удобство обслуживания и масштабируемость системы.
  3. лучшее наслоение

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

недостаток

  1. Не соответствует принципу открытия-закрытия

    • При добавлении новых функций подсистемы может возникнуть необходимость изменения класса внешнего вида, что нарушает принцип открытости-закрытости (открыт для расширений, закрыт для модификаций).
  2. Может вызвать проблемы с производительностью

    • В некоторых случаях использование шаблона фасада может привести к снижению производительности системы, поскольку все запросы должны проходить через класс фасада.

Диаграмма классов

Client
  |
  v
Facade ----> SubsystemA
          ----> SubsystemB
          ----> SubsystemC
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Подведем итог

Шаблон «Фасад» упрощает работу со сложными подсистемами, предоставляя упрощенный интерфейс. Он подходит для сценариев, где необходимо упростить интерфейс подсистемы, сократить прямое взаимодействие между клиентом и подсистемой и отделить иерархию системы. Хотя он потенциально может нарушить принцип «открыто-закрыто», в большинстве случаев его преимущества намного перевешивают недостатки, что делает проектирование системы более понятным и простым в обслуживании.