기술나눔

디자인 패턴 활용 시나리오 구현 예시 및 장단점(구조 패턴 - 프록시 패턴, 외형 패턴)

2024-07-12

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

구조적 패턴

프록시 패턴

프록시 패턴은 프록시 객체를 도입하여 다른 객체에 대한 액세스를 제어하는 ​​구조적 디자인 패턴입니다. 이 프록시 객체는 프록시 객체에 액세스 제어, 지연 초기화, 로깅 또는 네트워크 액세스와 같은 추가 기능을 제공할 수 있습니다.

적용 가능한 장면

  1. 원격 에이전트

    • 다양한 주소 공간에 있는 개체의 로컬 표현을 제공합니다.
  2. 가상 에이전트

    • 필요에 따라 비용이 많이 드는 개체를 만듭니다.
  3. 보호제

    • 원본 객체에 대한 액세스를 제어합니다.
  4. 스마트한 안내

    • 개체에 액세스할 때 계산 작업이나 참조 감지와 같은 몇 가지 추가 작업을 수행합니다.

구현예(자바)

다음은 프록시 객체를 통해 실제 객체에 대한 액세스를 제어하는 ​​방법을 보여주는 간단한 프록시 패턴 구현 예입니다.

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. 프록시 클래스 정의(Proxy)
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

요약하다

프록시 패턴은 객체에 대한 액세스를 제어하고 관리하는 효율적인 방법을 제공합니다. 프록시를 사용하면 비즈니스 개체의 책임을 명확하게 유지하면서 다양한 기능을 추가할 수 있습니다. 이 모드는 비즈니스 개체에 대한 액세스 제어 및 기타 전처리 작업이 필요한 시나리오에 특히 적합합니다.

외관 패턴

Facade 패턴은 하위 시스템의 인터페이스 그룹에 액세스하기 위한 통합 인터페이스를 제공하여 복잡한 하위 시스템을 보다 쉽게 ​​사용할 수 있도록 하는 구조적 디자인 패턴입니다. 파사드 패턴은 이 하위 시스템을 더 쉽게 사용할 수 있도록 하는 상위 수준 인터페이스를 정의합니다.

적용 가능한 장면

  1. 복잡한 시스템에 대한 인터페이스 단순화

    • 복잡한 하위 시스템에 대한 간단한 인터페이스를 제공하여 하위 시스템과의 외부 상호 작용의 복잡성을 줄입니다.
  2. 계층

    • 다층 시스템 구조에서는 외관 패턴을 사용하여 각 층의 입구를 정의하고 층 간 종속성을 단순화할 수 있습니다.
  3. 분리된 시스템

    • 모양 패턴을 도입함으로써 하위 시스템과 클라이언트 간의 결합이 줄어듭니다.

구현예(자바)

다음은 Facade 패턴의 간단한 구현 예이며, Facade 클래스를 통해 하위 시스템의 사용을 단순화하는 방법을 보여줍니다.

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. 성능 문제가 발생할 수 있음

    • 어떤 경우에는 Facade 패턴을 사용하면 모든 요청이 Facade 클래스를 거쳐야 하므로 시스템 성능이 저하될 수 있습니다.

클래스 다이어그램

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

요약하다

Facade 패턴은 단순화된 인터페이스를 제공하여 복잡한 하위 시스템 작업을 더 쉽게 만듭니다. 이는 하위 시스템 인터페이스를 단순화하고, 클라이언트와 하위 시스템 간의 직접적인 상호 작용을 줄이고, 시스템 계층 구조를 분리해야 하는 시나리오에 적합합니다. 개방-폐쇄 원칙을 위반할 가능성이 있지만 대부분의 경우 장점이 단점보다 훨씬 커서 시스템 설계를 더 명확하고 유지 관리하기 쉽게 만듭니다.