장점
- 기능 인터페이스와 구현을 담당하는 추상 클래스로 독립적으로 구성이 된다.
- 각 계층을 독립적으로 확장 및 변경이 가능해진다.
- 객체 간 결합도를 낮출 수 있다.
- 기존 설계에 새로운 요소들을 지속적으로 추가할 때 유용하다.
- 기존 코드 변경 없이 기능을 확장할 수 있다.
단점
- 계층 구조에 새로운 구현체 및 기능 등을 추가하다보면 설계가 복잡해질 수 있다.
설계 구조
필기구를 추상 클래스로 선언하여 색연필, 샤프 등으로 사용하고
작성의 기능을 분리하여 선, 원, 사각형 등의 기능을 정의한다.
예제 코드
필기구 추상 클래스
public abstract class Pencil {
protected Writing writing;
protected Pencil(Writing writing) {
this.writing = writing;
}
public abstract void writeLine();
public abstract void writeCircle();
public abstract void writeRectangle();
}
색연필
public class ColorPencil extends Pencil{
private final String info = "색연필";
public ColorPencil(Writing writing) {
super(writing);
System.out.println("========== "+info+" ==========");
}
@Override
public void writeLine() {
System.out.println(info + writing.line());
}
@Override
public void writeCircle() {
System.out.println(info + writing.circle());
}
@Override
public void writeRectangle() {
System.out.println(info + writing.rectangle());
}
}
샤프
public class MechanicalPencil extends Pencil{
private final String info = "샤프";
public MechanicalPencil(Writing writing) {
super(writing);
System.out.println("========== "+info+" ==========");
}
@Override
public void writeLine() {
System.out.println(info + writing.line());
}
@Override
public void writeCircle() {
System.out.println(info + writing.circle());
}
@Override
public void writeRectangle() {
System.out.println(info + writing.rectangle());
}
}
작성 인터페이스
public interface Writing {
String line();
String circle();
String rectangle();
}
형태
public class WritingShape implements Writing{
@Override
public String line() {
return "로 선을 긋습니다.";
}
@Override
public String circle() {
return "로 원을 긋습니다.";
}
@Override
public String rectangle() {
return "로 사각형을 긋습니다.";
}
}
실행 결과
public class Main {
public static void main(String[] args) {
Pencil colorPencil = new ColorPencil(new WritingShape());
colorPencil.writeLine();
colorPencil.writeCircle();
colorPencil.writeRectangle();
Pencil mechanicalPencil = new MechanicalPencil(new WritingShape());
mechanicalPencil.writeLine();
mechanicalPencil.writeCircle();
mechanicalPencil.writeRectangle();
}
}
'Effective Java > 키워드' 카테고리의 다른 글
팩터리 메서드 패턴 (Factory Method Pattern) (0) | 2023.01.08 |
---|---|
플라이 웨이트 패턴 (Flyweight Pattern) (0) | 2023.01.07 |
오토박싱 오토언박싱 (AutoBoxing AutoUnBoxing) (0) | 2023.01.06 |
정규표현식 (Regular Expression) (0) | 2023.01.06 |
의존 객체 주입 패턴 (Dependency Injection Pattern) (0) | 2023.01.06 |