Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- http
- 스프링 핵심 원리
- 알고리즘
- java
- QueryDSL
- Thymeleaf
- spring
- 백준
- 김영한
- JDBC
- 스프링 핵심 기능
- Proxy
- db
- SpringBoot
- Spring Boot
- 그리디
- AOP
- 스프링
- Greedy
- pointcut
- JPQL
- Servlet
- 자바
- springdatajpa
- jpa
- transaction
- 인프런
- kotlin
- Android
- Exception
Archives
- Today
- Total
개발자되기 프로젝트
Composite Pattern 본문
1. Composite Pattern
그릇과 내용물을 동일시
2. 의도 (Intent)와 동기(Motivation)
- 부분과 전체에 대한 복합 객체의 트리구조를 나타낼 수 있음
- 클라이언트가 개별 객체와 복합 객체를 동일하게 다룰 수 있는 인터페이스를 제공
- 재귀적인 구조
3. Class diagram
4. 객체 협력 (collaborations)
- Component
- -- 전체와 부분 객체에서 공통으로 사용할 기능 선언
- -- 전체 클래스가 부분요소들을 관리하기 위해 필요한 인터페이스 선언
- -- 전체와 부분 객체에서 공통적으로 사용할 인터페이스 선언
- Leaf:
- -- 집합 관계에서 다른 객체를 포함할 수는 없고 포함되기만 하는 객체로 가장 기본이 되는 기능을 구현
- Composite:
- -- 포함한 여러 객체를 저장하고 관리하는 기능을 구현
- -- 여러 객체를 포함하는 복합 객체에 대한 기능 구현
- Client:
- -- Component에 선언된 인터페이스를 통하여 부분과 전체를 동일하게 처리
5. 중요한 결론 (consequence)
- 기본 객체는 복합 객체에 포함이 되고, 복합 객체 역시 또 다른 복합 객체에 포함될 수 있다.
- 클라이언트 코드는 기본객체와 복합객체에 대한 일관된 프로그래밍을 할 수 있다.
- 기본 객체화 복합 객체를 같은 타입으로 핸들링 함.
- 기본 객체가 증가하여도 전체 객체의 코드에 영향을 주지 않는다.
- 새로운 요소의 추가가 편리하고 범용성 있는 설계가 가능하다.
6. 예제
제품의 카테고리와 제품의 계층구조를 Composite Pattern 으로 구현
Category 밑에 Cagegory밑에 Categoryㅋㅋㅋ
public class Category extends ProductCategory{
ArrayList<ProductCategory> list;
public Category(int id, String name, int price) {
super(id, name, price);
list = new ArrayList<>();
}
@Override
public void addProductCategory(ProductCategory productCategory) {
list.add(productCategory);
}
@Override
public void removeProductCategory(ProductCategory productCategory) {
for (ProductCategory temp : list) {
if (temp.getId() == productCategory.getId()){
list.remove(temp.id);
return;
}
System.out.println("상품이 없음");
}
}
@Override
public int getProductCount() {
int count = 0;
for (ProductCategory temp : list) {
count += temp.getProductCount();
}
return count;
}
@Override
public int getProductPrice() {
int price = 0;
for (ProductCategory temp : list) {
price += temp.getProductPrice();
}
return price;
}
@Override
public String getName() {
return name;
}
@Override
public int getId() {
return id;
}
}
public class Product extends ProductCategory{
public Product(int id, String name, int price) {
super(id, name, price);
}
@Override
public void addProductCategory(ProductCategory productCategory) {
//Product가 사용 안함
}
@Override
public void removeProductCategory(ProductCategory productCategory) {
//Product가 사용 안함
}
@Override
public int getCount() {
return 1;
}
@Override
public int getPrice() {
return price;
}
@Override
public String getName() {
return name;
}
@Override
public int getId() {
return id;
}
}
public class CompositeTest {
public static void main(String[] args) {
ProductCategory womanCategory = new Category(1234, "woman", 0);
ProductCategory manCategory = new Category(5678, "man", 0);
ProductCategory clothesCategoryW = new Category(2345, "clothes", 0);
ProductCategory bagCategoryW = new Category(3456, "bag", 0);
ProductCategory shoesCategoryW = new Category(9876, "shoes", 0);
womanCategory.addProductCategory(clothesCategoryW);
womanCategory.addProductCategory(bagCategoryW);
womanCategory.addProductCategory(shoesCategoryW);
ProductCategory clothesCategoryM = new Category(23450, "clothes", 0);
ProductCategory bagCategoryM = new Category(34560, "bag", 0);
ProductCategory shoesCategoryM = new Category(98760, "shoes", 0);
manCategory.addProductCategory(clothesCategoryM);
manCategory.addProductCategory(bagCategoryM);
manCategory.addProductCategory(shoesCategoryM);
ProductCategory shoes1 = new Product(121, "nike", 10000);
ProductCategory shoes2 = new Product(122, "adidas", 20000);
ProductCategory shoes3 = new Product(123, "gucci", 30000);
ProductCategory shoes4 = new Product(124, "balenciaga", 40000);
ProductCategory shoes5 = new Product(125, "prada", 50000);
ProductCategory shoes6 = new Product(126, "bally", 60000);
shoesCategoryW.addProductCategory(shoes1);
shoesCategoryW.addProductCategory(shoes2);
shoesCategoryW.addProductCategory(shoes3);
shoesCategoryM.addProductCategory(shoes4);
shoesCategoryM.addProductCategory(shoes5);
shoesCategoryM.addProductCategory(shoes6);
ProductCategory bag1 = new Product(121, "HERMES", 500000);
ProductCategory bag2 = new Product(122, "LOUISVUITTON", 500000);
ProductCategory bag3 = new Product(123, "GUCCI", 500000);
ProductCategory bag4 = new Product(124, "BALENCIA", 500000);
ProductCategory bag5 = new Product(125, "PRADA", 500000);
ProductCategory bag6 = new Product(126, "MULBERRY", 500000);
bagCategoryW.addProductCategory(bag1);
bagCategoryW.addProductCategory(bag2);
bagCategoryW.addProductCategory(bag3);
bagCategoryM.addProductCategory(bag4);
bagCategoryM.addProductCategory(bag5);
bagCategoryM.addProductCategory(bag6);
System.out.println(womanCategory.getProductCount());
System.out.println(womanCategory.getProductPrice());
System.out.println(manCategory.getProductCount());
System.out.println(manCategory.getProductPrice());
}
}
7. GitHub : 211109 Composite Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
조건에 따른 상태를 클래스로 표현하여 관리 - State (0) | 2021.11.10 |
---|---|
Adapter Pattern (0) | 2021.11.09 |
Decorator (0) | 2021.11.09 |
기능의 선언과 구현을 분리 - Bridge (1) | 2021.11.08 |
기능의 선언과 구현을 분리 - Strategy Pattern (0) | 2021.11.08 |
Comments