JAVA-SOLID

[OOP] 디자인 패턴(Adapter, Proxy, Decorator Pattern)

EJUN 2023. 6. 8. 02:53

디자인 패턴
디자인 패턴은 다른 말로 설계패턴이라고도 한다.
또한 디자인패턴은 상속, 인터페이스, 객체를 속성으로 사용하여 이용하는 방식이다.
디자인 패턴은 설계라고 하면 SOLID원칙은 설계원칙이기 때문에 디자인 패턴은 SOLID원칙을 기반으로 한다.

 

Adapter Pattern(어댑터 패턴)

어댑터는 변환기라는 의미를 가지고 있다.

여기서 변환기는 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것을 의미한다.

어댑터 패턴을 사용하는 것은 대표적으로 JDBC가 있다.

JDBC를 인터페이스를 이용하여 사용하는 DB를 바꾸어도 사용자는 신경쓰지 않아도 되기 때문이다.

JDBC를 보니 뭔가 떠오른게 있는가?

 

바로 Adapter Pattern은 OCP(개방 폐쇄 원칙)과 DIP(의존 역전 원칙)을 이용한 패턴이다.

2023.06.08 - [JAVA-SOLID] - OOP_객체지향설계 5원칙_SOLID원칙 

기억이 나지 않는다면 위의 글을 보고 오는 것을 추천한다.

AdapterPattern이 적용되지 않은 코드

위는 OCP원칙을 지키지 않은 것으로 만약 ServiceA클래스가 변하게 되면 최상위클래스인 AdapterPattern클래스에 

영향이 있기 때문이다.

AdapterPattern을 적용한 코드

위의 코드를 보면 AdapterServiceA, AdapterServiceB가 ServiceA, ServiceB객체를 생성하여서 runService()메소드를 통해

하위 클래스의 객체를 이용하여 하위클래스의 메소드를 실행하고 있다.

따라서 ServiceA, ServiceB가 변하여도 최상위클래스인 AdapterPattern는 변하지 않기 때문에 OCP원칙을 지켰다.

 

Proxy Pattern(프록시 패턴)

프록시는 대리자, 대변인 이라는 의미를 두고 있다.

대리자를 듣는 순간 딱 떠오르는 설계원칙은 바로 OCP, DIP이다.

<<ProxyPattern예시

위의 코드를 보면 IService인터페이스를 이용하여 실제 서비스 객체인 Service클래스의 메소드와 같은 이름의 메소드를 이용하는데 이러한 것을 ProxyPattern이라고 한다.

IService인터페이스를 살펴보면 실제 서비스를 하는 Service클래스가 가지고 있는 runSomething()메소드를 가진 것을 볼 수 있다. 

그럼 다음 대리자 역할을 하는 Proxy클래스를 이용하여 IService의 역할을 iservice를 생성하고 Service()객체를 주입했다.

이 때문에 Proxy클래스에서 runSomething메소드를 오버라이딩해서 Service클래스의 runSomething메소드를 간접적으로 

호출하는 것을 확인할 수 있다.

 

그럼 여기서 Adapter Pattern과 ProxyPattern의 차이가 있는지 궁금할수도 있다.

< Adapter Pattern vs Proxy Pattern >
Proxy Pattern은 서비스 객체의 메소드랑 인터페이스에서 구현한 메소드명이 다 같아야 하지만
Adapter Pattern은 굳이 안그렇게 하고 서로 약간씩 달라도 된다.

Proxy Pattern의 특징

  • 대리자는 실제 서비스와 같은 이름이 메소드를 구현해야 한다. 이때는 interface를 이용함
  • 대리자는 실제 서비스에 대한 참조변수를 갖음
  • 대리자는 실제 서비스의 같은 이름을 가진 메소드를 호출하고 그 값을 클라이언트에게 반환함
  • 대리자는 실제 서비스의 메소드 호출 전 후에 별도의 추가 로직을 수행가능

ProxyPattern에 대해 정의를 하자면

'제어 흐름을 조정하기 위한 목적으로 중간에 대리자는 두는 패턴' 이다.

 

Decorator Pattern(데코레이터 패턴)

Decorator Pattern은 프록시 패턴과 형식은 다 똑같고 대리자 역할을 하는 클래스가 클라이언트에게 

값을 반환할 때 반환값에 Proxy Pattern과 달리 장식을 해서 반환을 하는 것을 의미한다.

Decorator Pattern 예시

위처럼 Decorator클래스에서 값을 반환할 때 반환값에 추가로 값을 더해서 반환하는 것을 

Decorator Pattern이라고 한다.

Decorator Pattern 또한 SOLID원칙 중에서 OCP(개방 폐쇄 원칙)과 DIP(의존 역전 원칙)이 적용된

설계패턴이다.

Proxy Pattern vs Decorator Pattern
Proxy Pattern 클라이언트가 받는 반환값을 특별한 경우가 아니면 변경하지 않음
Decorator Pattern 클라이언트가 받는 반환값에 장식을 더해서 반환함