시그마 삽질==six 시그마

데코레이터 패턴(Decorator pattern) 본문

프로그래밍/디자인패턴

데코레이터 패턴(Decorator pattern)

Ethan Matthew Hunt 2020. 4. 24. 22:42

 

'Java 객체 지향 디자인 패턴' 책을 구입하시길  추천드립니다.

책 구입을 원하시는분은 요기를 클릭하시면 됩니다.

하단의 내용은 제가 예전에 읽었던 내용을 요약 정리한 것입니다.

 

https://en.wikipedia.org/wiki/Decorator_pattern

데코레이터 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 데코레이터 클래스로 정의 후 필요한 데코레이터 객체를 조합함으로써 추가 기능의 조합을 설계하는 방식임

Decorator 메쏘드의 확장 개념임. 

Reader reader = new BufferedReader(new FileReader("xxx"); 이게 다 데코레이터 패턴임

 

 

Component: 기본기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의한다.

즉 클라이언트는 Component를 통해 실제 객체를 사용함

ConcreteComponent: 기본 기능을 구현한 클래스

Decorator: 많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공한다

ConcreteDecoratorA.B.C... : Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능을 뜻한다

 

 

 

차선을 추가하며 그리는 예제다.

 

public abstract class Component {
	public abstract void draw() ;
}


public class ConcreteComponent extends Component { //기본기능!

	public void draw() {
		System.out.println("기본 도로 표시") ;
	}
}

public class Decorator extends Component {
	private Component component ;

	public Decorator(Component component) {
		this.component = component ;
	}
	public void draw() {
		component.draw() ;
	}
}


public class CrossingDecorator extends Decorator {
	public CrossingDecorator(Component component) {
		super(component);
	}
	public void draw() {
		super.draw();
		drawCrossing() ;
	}
	private void drawCrossing() {
		System.out.println("교차로 표시") ;
	}
}


public class TrafficDecorator extends Decorator {
	public TrafficDecorator(Component component) {
		super(component);
	}
	public void draw() {
		super.draw();
		drawTraffic() ;
	}
	private void drawTraffic() {
		System.out.println("교통량 표시") ;
	}

}


public class LaneDecorator extends Decorator {

	public LaneDecorator(Component component) {
		super(component);
	}

	public void draw() {
		super.draw();
		drawLane() ;
	}
	private void drawLane() {
		System.out.println("차선 표시") ;
	}

}




public class Client {
	public static void main(String[] args) {
		//Component roadWithTraffic = new TrafficDecorator(new ConcreteComponent()) ;
		//roadWithTraffic.draw() ; 

		//Component roadWithLaneAndTraffic = new TrafficDecorator(new LaneDecorator(new ConcreteComponent())) ;
		//roadWithLaneAndTraffic.draw() ;
		
		//Component roadWithCrossingAndTraffic = new TrafficDecorator(new CrossingDecorator(new ConcreteComponent())) ;
		//roadWithCrossingAndTraffic.draw() ;

		Component roadWithCrossingAndTrafficAndLane = new LaneDecorator(new TrafficDecorator(new CrossingDecorator(new ConcreteComponent()))) ;
		roadWithCrossingAndTrafficAndLane.draw() ; 
		//기본도로 표시, 교차로 표시, 교통량 표시, 차선 표시
	}
}

 

super 타고 올라간다

LaneDecorator super.draw() 이동

->Decorator의 component.draw()이동

>TrafficDecorator super.draw()이동

->Decorator의 component.draw()이동

->CrossingDecorator super.draw()이동

->Decorator의 component.draw()이동

ConcreteComponent draw()이동해서  기본 기능 start!!

Comments