ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구조패턴 : Decorator 패턴
    디자인패턴 2013. 1. 28. 09:30
    반응형

    분류 : 구조패턴(Structural Patterns)


    정의 :

    같은 클래스의 다른 객체에 영향을 미치지 않고 개별 객체에 기능을 추가하는 패턴.

    용도 :

    • Window라는 클래스에 수직, 수평 스크롤바를 추가하려고 하면, 상속을 통해서 하면 ScrollingWindow라는 서브 클래스를 만들면 가능함. 이때는 데코레이터 패턴과 상속간의 차이가 없음. 그런데 이 상태에서 Window클래스에 다른 기능을  추가하려고 하면 문제가 발생함. Border 기능을 추가한다고하면, 상속을 통해서 구현했을때는 BorderScrollingWindow, BorderWindow이렇게 2개를 추가해 주어야함. 그리고 다른 기능을 추가하려고 하면 매번 중복해서 클래스들을 추가해 주어야 함. 그러나 데코레이터를 통해서 한다면 스크롤과 Border를 각각 구현한 다음에 Window에 따로 적용해서, 둘중하나 또는 둘모두의 기능을 추가할 수 있음.
    • 특정 객체의 속성이나 메소드에 접근하는 것을 제한할 때 사용할 수 있음.



    소스

    
    //Window 인터페이스
    public interface Window {
    
    	public void draw(); // Window를 그림
    	
        public String getDescription(); // Window의 설명을 반환함.
    
    }
    
    
    //스크롤바가 없는 간단한 윈도우의 구현
    public class SimpleWindow implements Window {
    
    	@Override
    	public void draw() {
    		// window를 그림.
    	}
    
    	@Override
    	public String getDescription() {
    		return "simple window";
    	}
    
    }
    
    
    //추상 데코레이터 클래스 - Window를 구현하고 있음.
    public class WindowDecorator implements Window {
    
    	//꾸며지는 대상 윈도우
    	protected Window decoratedWindow;
    
    	public WindowDecorator (Window decoratedWindow) {
            this.decoratedWindow = decoratedWindow;
        }
    	
    	@Override
    	public void draw() {
    		//원본 메소드를 구현
    		decoratedWindow.draw();
    	}
    
    	@Override
    	public String getDescription() {
    		//원본 메소드를 구현.
    		return decoratedWindow.getDescription();
    	}
    
    }
    
    //수직 스크롤바 기능을 추가하는 첫번째 실 데코레이터
    public class VerticalScrollBarDecorator extends WindowDecorator {
    
    	public VerticalScrollBarDecorator(Window decoratedWindow) {
    		super(decoratedWindow);
    	}
    
    
    	@Override
        public void draw() {
            decoratedWindow.draw();
            drawVerticalScrollBar();
        }
     
        private void drawVerticalScrollBar() {
            // 수직 스크롤바를 그림.
        }
     
        @Override
        public String getDescription() {
            return decoratedWindow.getDescription() + ", including vertical scrollbars";
        }
    
    }
    
    
    //수평 스크롤바 기능을 추가하는 두번째 실 데코레이터
    public class HorizontalScrollBarDecorator extends WindowDecorator {
    
    	public HorizontalScrollBarDecorator(Window decoratedWindow) {
    		super(decoratedWindow);
    	}
    	
    
    	@Override
        public void draw() {
            decoratedWindow.draw();
            drawHorizontalScrollBar();
        }
     
        private void drawHorizontalScrollBar() {
            // 수평 스크롤바를 그림
        }
     
        @Override
        public String getDescription() {
            return decoratedWindow.getDescription() + ", including horizontal scrollbars";
        }
    
    
    }
    
    public class DecoratedWindowTest {
    	
    	public static void main(String[] args) {
    	// 수평, 수직 스크롤바가 추가된 Window를 생성함.
            Window decoratedWindow = new HorizontalScrollBarDecorator (
                    new VerticalScrollBarDecorator(new SimpleWindow()));
     
            // Window의 설명을 출력함.
            System.out.println(decoratedWindow.getDescription());
    
    	}
    
    }
    
    



    참고자료

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

    반응형

    '디자인패턴' 카테고리의 다른 글

    구조패턴 : Flyweight 패턴  (0) 2013.02.05
    구조패턴 : Facade 패턴  (0) 2013.01.29
    구조패턴 : Composite 패턴  (0) 2013.01.25
    구조패턴 : Bridge 패턴  (0) 2013.01.23
    구조패턴 : Adapter (Wrapper) 패턴  (0) 2013.01.21

    댓글

Designed by Tistory.