// Template Method Pattern
// - 변하지 않는 공통의 알고리즘은 부모가 public 으로 제공하고
// - 변하지 않은 코드 내부의 변해야 하는 정책만 자식이 재정의 하도록 하자.
- // 추상클래스 기반의 약한 결합
- abstract class Shape {
- public final void draw() { //재정의 금지 final
- drawImpl();
- }
- protected abstract void drawImpl();
- protected abstract Shape clone();
- }
- class Rect extends Shape {
- @Override
- public void drawImpl() {
- System.out.println("Draw Rect.");
- }
- public Rect clone() {
- return new Rect();
- }
- }
- class Circle extends Shape {
- @Override
- public void drawImpl() {
- System.out.println("Draw Circle.");
- }
- @Override
- public Circle clone() {
- return new Circle();
- }
- }
- public class Ex1 {
- private static Scanner scan;
- public static void main(String...args) {
- List<Shape> list = new ArrayList<>();
- // 강한결합 : 하나의 클래스가 다른 클래스를 사용 할 때 클래스의 이름을 바로 사용
- // - 교체 불가능한 경직된 디자인
- scan = new Scanner(System.in);
- while (true) {
- System.out.println("Choice : ");
- int cmd = scan.nextInt();
- if(cmd == 0) {
- break;
- }
- switch (cmd) {
- case 1:
- list.add(new Rect());
- break;
- case 2:
- list.add(new Circle());
- break;
- case 8:
- System.out.println("copy : ");
- int idx = scan.nextInt();
- list.add(list.get(idx).clone());
- break;
- // switch(list.get(idx).type) {
- // case 1:
- // list.add(new Rect());
- // break;
- // case 2:
- // list.add(new Circle());
- // break;
- // }
- case 9:
- for(Shape s : list) {
- s.draw();
- }
- break;
- }
- }
- }
- }
'java > design_pattern' 카테고리의 다른 글
Composite Pattern (0) | 2014.06.27 |
---|---|
Strategy Pattern (0) | 2014.06.27 |
Adapter 패턴 (0) | 2014.06.27 |
Java Singleton 선언하는법 (0) | 2014.06.18 |
Design Pattern 기본 원칙 (0) | 2014.06.18 |