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 |
'자바' 카테고리의 다른 글
[프로그래머스, 실무역량과제] API 서버 개발 (7) | 2023.04.12 |
---|---|
자주 쓰는 디자인 패턴 (행위 패턴) (0) | 2023.03.23 |
자주쓰는 디자인 패턴 총정리 (생성 패턴 편) (1) | 2023.03.21 |
정규표현식(REGEX) 문법 정리 (1) | 2022.12.24 |
JDK 11 vs JDK17 무엇이 업그레이드 되었을까? (0) | 2022.09.03 |