새로운 기능을 추가할 경우 사용할 수 있는 디자인 패턴이다.
subclassing(상속) 을 사용하는 경우보다 더 효율적일 가능성이 있다.
Subclassing 을 하는 경우
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();
}
}
// 소문자 변환, 문자열 자르기, 소문자 변환과 문자열 자르기 기능이 필요한 경우 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();
}
}
// 소문자 변환, 문자열 자르기, 소문자 변환과 문자열 자르기 기능이 필요한 경우 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();