자바

자주 쓰는 디자인 패턴 [구조 패턴]

류창 2023. 3. 22. 16:30
반응형

 

 

1. 어댑터 패턴

 

 

사용처 :  구조는 같은데, 인터페이스가 달라서 못쓰는 경우  사용하게끔 변환해주는 용도

 

 

RGB 

1
2
3
4
5
6
7
8
9
10
11
public class RGB {
    private byte[] images;
 
    public byte[] getImages() {
        return images;
    }
 
    public void setImages(byte[] images) {
        this.images = images;
    }
}
cs

 

HDMI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class HDMI {
    private byte[] images;
 
    public HDMI(byte[] images) {
        this.images = images;
    }
 
    public byte[] getImages() {
        return images;
    }
 
    public void setImages(byte[] images) {
        this.images = images;
    }
}
cs

 

Adapter

1
2
3
4
5
6
public class HDMIConverter  {
    
    public HDMI convertRGBToHDMI(RGB rgb) {
        return new HDMI(rgb.getImages());
    }
}
cs

 

 

즉,  구조는 같은데,  같은 인터페이스에 의존하지 않는경우 

 

서로 변환해가면서 써주고 싶을때 Adapter 패턴을 사용한다.

 

장점

  • 어댑터 패턴은 구조 패턴 중 하나로 기존 클래스를 감싼 새로운 클래스를 생성한다. 그리고 새로운 클래스로 객체의 인터페이스를 재구성한다.
  • 객체를 구성으로 결합하면 느슨한 연결 방식으로 보다 많은 유연성을 확보할 수 있다. 그리고 구성은 프로그램이 실행되는 도중에도 객체를 변경할 수 있다.
  • 어댑터는 복잡한 객체 구조를 깔끔하게 정리하는 데 유용하다.

단점

  • 객체를 구성으로 결합하면 어댑터는 클라이언트에서 사용하는 인터페이스 방식으로 메서드를 새로 생성한다. 어댑터가 새로운 메서드를 재구성할 때 추가 코드가 필요하다.
  • 프로젝트에서 어댑터 패턴을 적용한다고 코드의 성능이 개선되지는 않는다. 오히려 어댑터를 통해야 하므로 속도가 저하된다.

 

2. 브리지 패턴  

 

 

용도 : 기존 Interface를 가져와서 규칙,규격을 설정하는 동시에,  새로운 추상 규칙을 넣고싶을때

 

https://www.baeldung.com/java-bridge-pattern

 

 

 

코드 예시:

 

=>  Color 라는 그룹의 규칙을 유지한채로,  새로운 기능 (규칙)을 넣고싶을때 사용하자

 

 

Bridge패턴을 사용한 추상 Class

=> Color 라는 규칙은 유지한채,    draw()라는 신규 기능을 넣음

 

장점

  • 클래스 계청을 분리할 때 완전한 인터페이스를 결합하지 않는다. 이를 통해 클래스에서 구현과 추상 부분 2개의 계층으로 분리할 수 있고, 분리된 2개의 추상 계층과 구현 계층은 독립적인 확장이 가능하다.
  • 브리지 패턴을 사용하면 런타임 시점에 어떤 방식으로 기능을 구현할지 선택할 수 있다.
  • 기능을 독립적으로 확장할 수 있다면 상세한 기능을 외부로부터 숨길 수 있는 은닉 효과도 얻을 수 있다.

단점

  • 추상화를 통해 코드를 분리할 경우 코드 디자인 설계가 복잡해진다는 단점이 있다.

 

 

3. 파사드 패턴 

 

 

용도 : 복잡한 호출과정을 대신 처리해주는 wrapper 객체를 따로 만드는 것

 

 

 

같은 Shape를 참조받은 3개의 도형

 

 

 

Facade 클래스 생성

 

3개의 도형을 모아둔  마치 공구상자 와 같은 클래스를 선언

 

 

간편하게  ShapeMaker를 사용해 도형을 사용.

 

 

즉, 하위 모듈을 건드리지 않고  쉽게 shapeMaker로 모아서 사용할수있다.

 

 

 

4. 프록시 패턴

 

프록시(Proxy)를 번역하면 대리자, 대변인의 의미를 갖고 있다. 대리자, 대변인은 누군가를 대신해서 그 역할을 수행하는 존재이다.

 

 

=> 실제 프로젝트 코드에선  당장 필요하지는 않은데 객체정의가 필요할때가 있다.

 

그래서 프록시 패턴은  일단  내용물은 없는 텅빈 객체 (껍데기?)를 일단 정의를 시켜둔뒤,

실제 필요하거나 사용할때 그 객체를 채워넣는 형태다.

 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*;
 
interface Image {
    public void displayImage();
}
 
//on System A
class RealImage implements Image {
    private String filename;
    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }
 
    private void loadImageFromDisk() {
        System.out.println("Loading   " + filename);
    }
 
    @Override
    public void displayImage() {
        System.out.println("Displaying " + filename);
    }
}
 
//on System B
class ProxyImage implements Image {
    private String filename;
    private Image image;
 
    public ProxyImage(String filename) {
        this.filename = filename;
    }
 
    @Override
    public void displayImage() {
        if (image == null)
           image = new RealImage(filename);
 
        image.displayImage();
    }
}
 
class ProxyExample {
    public static void main(String[] args) {
        Image image1 = new ProxyImage("HiRes_10MB_Photo1");
        Image image2 = new ProxyImage("HiRes_10MB_Photo2");
 
        image1.displayImage(); // loading necessary
        image2.displayImage(); // loading necessary
    }
}
cs
반응형