[코드 참조 velog]
https://velog.io/@ha0kim/Design-Pattern-%EA%B5%AC%EC%A1%B0-%ED%8C%A8%ED%84%B4Structural-Patterns
[ 구조 패턴 : 7개 ]
📌 개념
인터페이스가 호환되지 않는 클래스들을 함께 이용할 수 있도록, 타 클래스의 인터페이스를 기존 인터페이스에 덧씌운다.
클라이언트에서 어댑터를 사용하는 방법
1. 클라이언트에서 타겟 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청을 한다.
2. 어댑터에서는 어댑티 인터페이스를 사용하여 그 요청을 어댑티에 대한 하나 이상의 메소드 호출로 변환한다.
3. 클라이언트에서는 호출 결과를 받긴 하지만 중간에 어댑터가 껴 있는지는 알지 못한다.
📌 장점
📌 단점
📌 개념
구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다.
추상적 개념(추상클래스, extends)과 구체적 구현(인터페이스, implements)을 서로 다른 두개의 인터페이스로 구현하는 디자인 패턴!
브릿지 패턴은 캡슐화(encapsulation),집합(aggregation)을 사용하고 다른 클래스들로 책임을 분리시키기 위해 상속(inheritance)를 사용한다.
📌 장점
📌 단점
📌 활용 상황
📌 개념
객체들의 관계를 트리 구조로 구성하여 전체-부분 계층을 표현하는 패턴으로 여러 개의 객체들로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별없이(같은 타입으로!) 다루게 한다.
또한, 복합 객체(전체)와 단일 객체(leaf)를 같은 타입으로 취급하기 위한 인터페이스로 Component를 선언하는데, left 클래스와 전체에 해당하는 Composite 클래스에 공통 인터페이스를 정의한다.
📌 장점
📌 단점
📌 활용 상황
📌 개념
객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴
객체에 추가적인 요건을 동적으로 첨가하며 기능 확장이 필요할 때 서브 클래스 대신 쓸 수 있는 유일한 대안이 될 수 있다.
즉, 기본 기능(ConcreteComponent)에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 추상 클래스로 정의한 후 필요한 Decorator 객체(ConcreteDecorator)를 조합함으로써 추가 기능의 조합을 설계 하는 방식이다.
합성패턴과 같이 ConcreteComponent와 Decorator 두 객체를 동등하게 다루기 위한 인터페이스인 Component가 상위에 존재한다.
📌 장점
📌 단점
📌 활용 상황
객체가 상황에 따라 다양한 기능이 추가되거나 삭제되어야 할 때
public class ChristmasTreeMain {
public static void main(String[] args) {
// Christmas tree
ChristmasTree tree = new DefaultChristmasTree();
System.out.println(tree.decorate());
// Christmas tree + Lights
ChristmasTree treeWithLights = new Lights(
new DefaultChristmasTree()
);
System.out.println(treeWithLights.decorate());
// Christmas tree + Lights + Flowers
ChristmasTree treeWithLightsAndFlowers = new Flowers(
new Lights(
new DefaultChristmasTree()
)
);
System.out.println(treeWithLightsAndFlowers.decorate());
}
}
🙄 기본 객체인 new DefaultChristmasTree() 에 기능 추가를 new Lights(new DefaultChristmasTree()); 와 같이 동적인 방식으로 하고 있다. 이게 가능한 이유는?
A. Decorator 객체의 생성자로 Component를 받음으로써 Decorator를 이어 붙일 수가 있고 super를 통해 넘어오는 Component 의 operation(decorate()) 을 먼저 수행하기 때문이다.
(이건 크리스마스 트리 관련 코드 볼 것)
📌 개념
실제 기능을 수행하는 객체(Real Object) 대신 가상의 객체(Proxy Object)를 사용해 로직의 흐름을 제어하는 디자인 패턴이다.
구체적인 업무를 담당하고 있는 클래스에 접근하기 전에, 간단한 사전 작업(전처리, 캐싱) 처리하는 클래스(Proxy)를 두는 구조를 프록시 패턴이라고 한다.
이 패턴은 주요 기능이 요청을 받아 수행하기 전에, 이 요청에 대한 부가적인 전처리들을 수행하는 로직을 세우고 싶을 때 사용한다.
📌 장점
📌 단점
📌 활용 상황
📌 개념
Facade (외관)는 "건물의 정면"을 의미하는 단어로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미한다.
서브 시스템에 있는 인터페이스들에 대한 통합 인터페이스를 제공하여 서브 시스템을 더 쉽게 사용할 수 있도록 만드는 더 높은 수준의 인터페이스.
📌 장점
📌 단점
플라이웨이트,,안해욥!