1) 의미
일정 기능을 담당하는 구조체에 특정 기능을 추가하는
하나의 방법입니다.
이를 좀더 확장하기 용이하게 하기 위해서 구현부분과
추상부분을 분리합니다. 이후 이 두부분을
이용해서 독립적으로 발전시킬 수 있습니다.
2. 소스
1) 무언가 작업을 하는데 adapter 의 방법을 좀 인용한것
같습니다. display 와 이를 상속하여 추가 구현할
클래스 CountDisplay 을 작성합니다.
display에서 에러나는 부분은 차후 작업합니다.
display와 countdisplay는 기존 작업 내용을 포함하여
새로운 기능을 추가합니다.
public class Display {
private DisplayImpl impl;
public Display(DisplayImpl impl){
this.impl = impl;
}
public void open(){
impl.rawOpen();
}
public void print(){
impl.rawPrint();
}
public void close(){
impl.rawClose();
}
public final void display(){
open();
print();
close();
}
}
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times){
open();
for(int i=0; i<times;i++){
print();
}
close();
}
}
2) displayimpl 을 작업하는 이 클래스는 추상클래스 입니다.
기존 구현부를 담당하며 메소드를 규정합니다.
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times){
open();
for(int i=0; i<times;i++){
print();
}
close();
}
}
3) impl을 상속받아 실제 구현부를 작성합니다.
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string){
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for(int i=0; i<width; i++){
System.out.print("-");
}
System.out.println("+");
}
@Override
public void rawPrint() {
System.out.println("|"+string+"|");
}
@Override
public void rawOpen() {
printLine();
}
}
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string){
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for(int i=0; i<width; i++){
System.out.print("-");
}
System.out.println("+");
}
@Override
public void rawPrint() {
System.out.println("|"+string+"|");
}
@Override
public void rawOpen() {
printLine();
}
}
4) 이를 테스트할 코드를 작성합니다.
그냥 작성한 인스턴스를 불러서 생성할 수 있지만
왜 이렇게 돌려서 작성하냐면 상속을 피하고
인터페이스를 활용한 느슨한 연결을
하고 싶어서 입니다.
그냥 작성한 인스턴스를 불러서 생성할 수 있지만
왜 이렇게 돌려서 작성하냐면 상속을 피하고
인터페이스를 활용한 느슨한 연결을
하고 싶어서 입니다.
public class MainTest {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea"));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World"));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe"));
d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
}
}
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea"));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World"));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe"));
d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
}
}
결과 :
+------------+
|Hello, Korea|
+------------+
+------------+
|Hello, World|
+------------+
+---------------+
|Hello, Universe|
+---------------+
+---------------+
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
+---------------+
+------------+
|Hello, Korea|
+------------+
+------------+
|Hello, World|
+------------+
+---------------+
|Hello, Universe|
+---------------+
+---------------+
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
+---------------+
3. 다이어그램
https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A6%AC%EC%A7%80_%ED%8C%A8%ED%84%B44. 관련패턴
1) Template Method 패턴
2) Abstract Factory
3) Adapter 패턴
댓글 없음:
댓글 쓰기