ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]객체 지향 디자인 패턴 - Decorator Pattern(장식자 패턴)
    프로그래밍/Java 2022. 3. 24. 19:13
    반응형

    Decorator Pattern이란?

    • 객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴
    • 즉, 사용자가 필요에 따라 기능을 장착하거나, 사용자가 원하는데로 골르려고 할때 사용하기 좋은 패턴이다. 

     

    Decorator Pattern Structure(장식자 패턴 구조)이란?

    • 인터페이스를 하나 만들고 
    • 그 인터페이스를 받는 객체를 2개 생성 한다.
    • 하나는 기본이 되는 것이고 하나는 decorator를 구현하고 싶은 객체이다.
    • 기본이 되는 곳은 인터페이스에서 받은 것을 구현하는 것이 존재하고 
    • decorator는 Super(상위 클래스)를 이용하여 상위 객체의 모든 내용을 구현하고 추가적으로 할 것을 구현하여 decorator같은 역할을 구현한다.
    • 다형성을 이용하여 객체를 생성하게 되면 decorator가 완성 되게 된다.

     

    Decorator Pattern Example 

    • 먼저 Car 자동차를 주문 할 때 옵션을 추가하며 차를 완성한다고 가정해 보자 
    • CarOrder라는 인터페이스를 만들고 K3CarOrder와 CarOrderDecorator에 상속을 받는다.
    • SheetHit(엉뜨), Bluetooth(블루투스), Cruise(크루즈모드), Sports(스포츠카모드) 기능을 추가 할 수 있다고 보면
    • 처음 한대는 Cruise모드 하나만 , 두 번째 자동차는 풀옵션으로 생산한다고 가정 하고 코딩을 짜보자

    Carorder와 K3CarOder 구현부

    public interface CarOrder {
    	public void order();
    }
    
    public class K3CarOrder implements CarOrder{
    
    	@Override
    	public void order() {
    		System.out.println("K3를 구매하였습니다.");
    	}
    }

    CarOrderDecorator 및 Decorator 옵션들 구현부

    //인터페이스 상속을 받고 추상클래스로 만들어 줌
    public abstract class CarOrderDecorator implements CarOrder{ 
    	private CarOrder decoratedCarOrder;
    	public CarOrderDecorator(CarOrder decoratedCarOrder) {
    		this.decoratedCarOrder = decoratedCarOrder;
    	}
    	
    	@Override
    	public void order() {
    		decoratedCarOrder.order();
    	}
    }
    
    //엉뜨 구현
    public class SheetHit extends CarOrderDecorator{
    
    	public SheetHit(CarOrder decoratedCarOrder) {
    		super(decoratedCarOrder); //상위 생성자로 넣기 
    	}
    	
    	@Override
    	public void order() {
    		super.order(); //상위 오더호출
    		System.out.println("엉뜨 기능 추가"); //자신의 구현부 로직 구현
    	}
        //이렇게 작성하게 되면 위에 내용 호출 및 자싱의 구현부 로직을 순환구조로 구현이 가능하다.
    }
    
    //크루즈 모드 
    public class Cruise extends CarOrderDecorator{
    
    	public Cruise(CarOrder decoratedCarOrder) {
    		super(decoratedCarOrder);
    	}
    	
    	@Override
    	public void order() {
    		super.order();
    		System.out.println("크루즈 기능 추가");
    	}
    }
    
    //블루투스 
    public class Bluetooth extends CarOrderDecorator{
    
    	public Bluetooth(CarOrder decoratedCarOrder) {
    		super(decoratedCarOrder);
    	}
    	
    	@Override
    	public void order() {
    		super.order();
    		System.out.println("블루투스 기능 추가");
    	}
    }
    
    //스포츠 모드
    public class Sports extends CarOrderDecorator{
    
    	public Sports(CarOrder decoratedCarOrder) {
    		super(decoratedCarOrder);
    	}
    
    	@Override
    	public void order() {
    		super.order();
    		System.out.println("스포츠카 기능 추가");
    	}
    }

    구동하기 

    public class K3CarTest {
    
    	public static void main(String[] args) {
    		new K3CarOrder().order();
    		//K3를 구매하였습니다.
    		new Cruise(new K3CarOrder()).order();
    		//K3를 구매하였습니다.
    		//크루즈 기능 추가
    		new Sports(new SheetHit(new Bluetooth(new Cruise(new K3CarOrder())))).order();
    		//K3를 구매하였습니다.
    		//크루즈 기능 추가
    		//블루투스 기능 추가
    		//엉뜨 기능 추가
    		//스포츠카 기능 추가
    	}
    }

     

    반응형

    댓글

Designed by Tistory.