Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Composite Pattern 본문

Java/디자인 패턴

Composite Pattern

Seung__ 2021. 11. 9. 22:45

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


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

Comments