
디자인패턴 시작하기를 보고 정리하기
기능 계층과 구현 계층을 분리하여 시스템의 확장/유지보수성을 높이는 패턴.
기능 추가해도 기능 계층을 통해 기존 코드의 변경이 최소화됨.

public interface Display {
void title(Draft draft);
void author(Draft draft);
void content(Draft draft);
}
public class SimpleDisplay implements Display{
@Override
public void title(Draft draft){
System.out.println(draft.getTitle());
}
@Override
public void author(Draft draft) {
System.out.println(draft.getAuthor());
}
@Override
public void content(Draft draft) {
var content = draft.getContent();
for (String s : content) {
System.out.println(s);
}
}
}
public class CaptionDisplay implements Display{
@Override
public void title(Draft draft) {
System.out.println("제목 : "+draft.getTitle());
}
@Override
public void author(Draft draft) {
System.out.println("저자 : "+draft.getAuthor());
}
@Override
public void content(Draft draft) {
System.out.println("내용");
var content = draft.getContent();
for (String s : content) {
System.out.println(" " + s);
}
}
}
public class Draft {
private String title;
private String author;
private String[] content;
public String getTitle(){return title;}
public String getAuthor(){return author;}
public String[] getContent(){return content;}
public Draft(String title, String author, String[] content){
this.title=title;
this.author=author;
this.content=content;
}
public void print(Display display){
// 출력의 구체적 구현은 Display 객체가 담당한다.
display.title(this);
display.author(this);
display.content(this);
}
}
/// Draft에 정보를 추가해야 하는 상황
/// Draft는 수정할 수 없음
/// => Draft 를 상속받는 Publication를 생성하여 추가 정보를 처리한다.
/// 예시) Draft에서 출판사 이름과 가격 정보가 추가됨
public class Publication extends Draft{
private String publisher;
private int cost;
public Publication(String title, String author, String[] content, String publisher, int cost) {
super(title, author, content);
this.publisher = publisher;
this.cost = cost;
}
private void printPublicationInfo() {
System.out.println("# "+publisher + " $ "+cost);
}
public void print(Display display){
super.print(display);
printPublicationInfo();
}
}
public class MainEntry {
public static void main(String[] args){
var title = "복원된 지구";
var author = "Mr. Kim";
String[] contents = {
"플라스틱 사용의 감소",
"바다 생물 어획량 감소",
"지구를 복원하자",
};
Draft draft = new Draft(title, author, contents);
Display display1 = new SimpleDisplay();
draft.print(display1);
Display display2 = new CaptionDisplay();
draft.print(display2);
var publisher = "출판사 이름";
var cost = 19;
Publication publication = new Publication(title,author, contents, publisher,cost);
publication.print(display1);// Display를 그대로 사용 가능
publication.print(display2);
}
}