Decorator pattern vs Subclassing

0_0_yoon·2022년 11월 2일
0
post-thumbnail

새로운 기능을 추가할 경우 사용할 수 있는 디자인 패턴이다.
subclassing(상속) 을 사용하는 경우보다 더 효율적일 가능성이 있다.

Subclassing 을 하는 경우

  1. 기존의 클래스를 상속하는 경우 상위 클래스가 변경되면 하위 클래스가 영향을 받을수 있다.
public class SpaceEditor implements Editor {
	
    private final String content;
    
    public SpaceEditor(final String content){
    	this.content = content;
    }
    
    @override
    String edit() {
    	return content.trim();
    }
}

public class LowerCaseSpaceEditor extends SpaceEditor {
	
	public LowerCaseSpaceEditor(final String content){
    	super(content);
   	}

    @override
    String edit(){
    	return super.edit()
        	.toLowerCase();
    }
}

// SpaceEditor 의 생성자 인자 타입을 변경할 경우
public class SpaceEditor implements Editor {
	
    private final Content content;
    
    public SpaceEditor(final Content content){
    	this.content = content;
    }
    
    @override
    String edit() {
    	return content.removeSpace();
    }
}

// 하위 클래스에서도 변경이 발생한다
public class LowerCaseSpaceEditor extends SpaceEditor {
	
	public LowerCaseSpaceEditor(final Content content){
    	super(content);
   	}

    @override
    String edit(){
    	return super.edit()
        	.toLowerCase();
    }
}
  1. 추가할 기능 개수 만큼 상속 클래스가 늘어난다.
// 소문자 변환, 문자열 자르기, 소문자 변환과 문자열 자르기 기능이 필요한 경우 3개의 클래스를 추가한다

public class LowerCaseSpaceEditor extends SpaceEditor {
	
	public LowerCaseSpaceEditor(final String content){
    	super(content);
   	}

    @override
    String edit() {
    	return super.edit()
        	.toLowerCase();
    }
}

public class SubStringSpaceEditor extends SpaceEditor {
	
	public SubStringSpaceEditor(final String content){
    	super(content);
   	}

    @override
    String edit() {
    	return super.edit()
        	.subString(0);
    }
}

public class SubStringLowerCaseSpaceEditor extends SpaceEditor {
	
	public SubStringLowerCaseSpaceEditor(final String content){
    	super(content);
   	}

    @override
    String edit() {
    	return super.edit()
        	.toLowerCase()
        	.subString(0);
    }
}

Decorator pattern 을 적용한 경우
1. Base class 가 변경되어도 추가 기능을 구현한 클래스에는 영향이 없다.

public class SpaceEditor implements Editor {
	
    private final String content;
    
    public SpaceEditor(final String content){
    	this.content = content;
    }
    
    @override
    String edit() {
    	return content.trim();
    }
}

public class LowerCaseEditor extends EditorDecorator {
	
    public LowerCaseEditor(final Editor editor) {
    	super(editor);
    }
    
    @override
    String edit(){
    	return super.edit()
        	.toLowerCase();
    }
}

// SpaceEditor 의 생성자 인자 타입을 변경할 경우
public class SpaceEditor implements Editor {
	
    private final Content content;
    
    public SpaceEditor(final Content content){
    	this.content = content;
    }
    
    @override
    String edit() {
    	return content.removeSpace();
    }
}

// 변경이 발생하지 않는다
public class LowerCaseEditor extends EditorDecorator {
	
    public LowerCaseEditor(final Editor editor) {
    	super(editor);
    }
    
    @override
    String edit(){
    	return super.edit()
        	.toLowerCase();
    }
}
  1. 각 기능들을 조합해서 사용할 수 있다.
// 소문자 변환, 문자열 자르기, 소문자 변환과 문자열 자르기 기능이 필요한 경우 2 개의 클래스를 추가한다
public class SpaceEditor implements Editor {
	
    private final String content;
    
    public SpaceEditor(final String content){
    	this.content = content;
    }
    
    @override
    String edit() {
    	return content.trim();
    }
}

public class LowerCaseEditor extends EditorDecorator {
	
    public LowerCaseEditor(final Editor editor) {
    	super(editor);
    }
    
    @override
    String edit(){
    	return super.edit()
        	.toLowerCase();
    }
}

public class SubStringEditor extends EditorDecorator {
	
    public SubStringEditor(final Editor editor) {
    	super(editor);
    }
    
    @override
    String edit(){
    	return super.edit()
        	.subString(0);
    }
}

// 소문자 변환과 문자열 자르기 기능은 아래와 같이 구현할 수 있다
final Editor editor = new SubStringEditor(
	new LowerCaseEditor(new SpaceEditor("content"))
);
editor.edit();

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

profile
꾸준하게 쌓아가자

0개의 댓글