[자바 디자인 패턴] 구조패턴 - 데코레이터 패턴

2021. 3. 17. 17:32 JAVA/Design Patterns

구조패턴 목록

 

xzio.tistory.com/889"

같은 계층에 있는 객체들 중에서 몇가지만 다른 로직을 적용하고 싶은 경우에 사용하면 유용할 것 같다.

 

장점

- 정적 상속보다 유연성이 뛰어납니다.

- 새 클래스를 코딩하여 변경하기 때문에 오브젝트의 확장성을 향상시킵니다..

- 모든 동작을 객체로 코딩하는 대신 대상 클래스에서 일련의 기능을 개발할 수 있도록하여 코딩을 단순화합니다.

 

사용시기

- 다른 객체에 영향을 미치지 않고 객체에 투명하고 동적으로 책임을 추가하려는 경우

- 나중에 변경하려는 객체에 책임을 추가하려는 경우

- 서브 클래싱으로 기능을 확장하는 것은 더 이상 실용적이지 않습니다.

 

UML

 

Interface Class : Food

public interface Food {  
    public String prepareFood();  
    public double foodPrice();  
}

 

Model Class : VegFood, NonVegFood, ChineeseFood

public class VegFood implements Food {  
    public String prepareFood(){  
         return "Veg Food";  
    }  
  
    public double foodPrice(){  
        return 50.0;  
    }  
}
public class NonVegFood extends FoodDecorator{    
    public NonVegFood(Food newFood) {  
        super(newFood);  
    }  
    
    public String prepareFood(){  
        return super.prepareFood() +" With Roasted Chiken and Chiken Curry  ";   
    }  
    
    public double foodPrice()   {  
        return super.foodPrice()+150.0;
    }
}
public class ChineeseFood extends FoodDecorator{  
    public ChineeseFood(Food newFood) {
        super(newFood);  
    }
    
    public String prepareFood(){  
        return super.prepareFood() +" With Fried Rice and Manchurian  ";   
    }
    
    public double foodPrice(){
        return super.foodPrice()+65.0;
    }  
}

 

Decorator Class : FoodDecorator

public abstract class FoodDecorator implements Food{  
    private Food newFood;  
    
    public FoodDecorator(Food newFood)  {  
        this.newFood=newFood;  
    }  
    
    @Override  
    public String prepareFood(){  
        return newFood.prepareFood();   
    }  
    
    public double foodPrice(){  
        return newFood.foodPrice();  
    }  
}

 

Operation Class : DecoratorPatternCustomer

public class DecoratorPatternCustomer {
    public static void main(String args[]) throws NumberFormatException, IOException {
        VegFood vf=new VegFood();
        System.out.println(vf.prepareFood());  
        System.out.println(vf.foodPrice());  
        
        Food f1=new NonVegFood((Food) new VegFood());  
        System.out.println(f1.prepareFood());  
        System.out.println(f1.foodPrice());  

        Food f2=new ChineeseFood((Food) new VegFood());  
        System.out.println(f2.prepareFood());  
        System.out.println(f2.foodPrice());
    }
}

 

 

출처 : https://www.javatpoint.com/

know-one-by-one.tistory.com/42