2021.12.09_컴포짓패턴02.패턴적용하기
본문 바로가기
CS Study/디자인패턴

2021.12.09_컴포짓패턴02.패턴적용하기

by KyeongMin 2021. 12. 9.
728x90
반응형

지난 코드 베이스 컴포짓 적용하기

Component

public interface Component{
  int getPrice();
}
  • 공통된 오퍼레이션이 정의되어야하는것이 핵심

Item

public class Item implements Component{
  private String name;
  private int price;
  public Item(String name, int price){
		this.name = name;
    this.price = price;
  }
  
  @Override
  public int getPrice(){
    return this.price;
  }
}

Bag

  • before
    • 앞에서 말한것 처럼 leaf타입을 참조하면 안되고 compoent를 참조해야함 그래서 아래와 같이해야함
  • public Bag implements Component{
      pirvate List<Item> Item = new ArrayList<>();
      public void add(Item item) { items.add(item);}
      public List<Item> getItems() {return items;}
      
      @Override
      pulic int getPrice(){
    		retutn 0;
      }
    }
  • afterClient
    • before
    public class Client {
      public static void main(String[] args){
    		Item doranBlade = new Item("도란검", 450);
        Item healPotion = new Item("체력 물약", 50);
        
        Bag bag = new Bag();
        bag.add(doranBlade);
        bag.add(healPotion);
        
        Client client = new Client();
        client.printPrice(doranBlade);
        client.printPrice(bag);
      }
      private void printPrice(Item item){
    		System.out.println(item.getPrice());
      }
      
      private void printPrice(Bag bag){
        int sum =	bag.getItems().Stream().mapToInt(Item::getPrice).sum();
      	System.out.println(sum);
      }
    }
    • after
    public class Client {
      public static void main(String[] args){
    		Item doranBlade = new Item("도란검", 450);
        Item healPotion = new Item("체력 물약", 50);
        
        Bag bag = new Bag();
        bag.add(doranBlade);
        bag.add(healPotion);
        
        Client client = new Client();
        client.printPrice(doranBlade);
        client.printPrice(bag);
      }
      private void printPrice(Item item){
    		System.out.println(item.getPrice());
      }
      
      private void printPrice(Compoent compoent){
      	System.out.println(compoent.getPrice());
      }
    }
    • 이렇게 쓸 수 있음
    • 공통된 인터페이스를 사용해서 저렇게 사용가능
    • 가능하면 가장 추상적인 타입으로 쓰면 좋음
    • 가격을 어떻게 할지 컴포짓 객체가 알고 , leaf가 안다.
      • 전체나 부분이나 동일하게 처리할 수있게됨
      • 클라이언트 입장에서는 동일함
  • public Bag implements Component{
      pirvate List<Component> component = new ArrayList<>();
      public void add(Component component) { 
        items.add(component);
      }
      public List<Component> getItems() {
        return Component;
      }
      
      @Override
      pulic int getPrice(){
    		retutn components.stream().mapToInt(Component::getPrice).sum();
      }
    }
728x90
반응형

댓글