This is an old revision of the document!
2종류의 확장이 혼재하는 프로그램을 기능 계층과 구현 계층으로 분리하고, 그 사이를 위임으로 연결
package func;
import impl.DisplayImpl;
public class Display {
private DisplayImpl impl; // 위임(떠넘기기). Loose Coupling.
public Display(DisplayImpl impl) {
super();
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();
}
}
package func;
import java.util.stream.IntStream;
import impl.DisplayImpl;
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times) {
open();
IntStream.range(0, times).forEach(i -> print());
close();
}
}
package impl;
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
package impl;
import java.util.stream.IntStream;
public class StringDisplayImpl extends DisplayImpl {
private String str;
private int width;
public StringDisplayImpl(String str) {
this.str = str;
this.width = str.getBytes().length;
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.println("|" + str + "|");
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
IntStream.range(0, width).forEach(i -> System.out.print("-"));
System.out.println("+");
}
}
import func.CountDisplay;
import func.Display;
import impl.StringDisplayImpl;
import func.CountDisplay;
import func.Display;
import impl.StringDisplayImpl;
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea."));
CountDisplay d2 = new CountDisplay(new StringDisplayImpl("Hello, World"));
d1.display();
System.out.println();
d2.display();
d2.multiDisplay(3);
}
}
/*
+-------------+
|Hello, Korea.|
+-------------+
+------------+
|Hello, World|
+------------+
+------------+
|Hello, World|
|Hello, World|
|Hello, World|
+------------+
*/