// Template Method Pattern

// - 변하지 않는 공통의 알고리즘은 부모가 public 으로 제공하고

// - 변하지 않은 코드 내부의 변해야 하는 정책만 자식이 재정의 하도록 하자.


  1. // 추상클래스 기반의 약한 결합
  2. abstract class Shape {
  3.         public final void draw() { //재정의 금지 final
  4.                 drawImpl();
  5.         }
  6.         protected abstract void drawImpl();
  7.         protected abstract Shape clone();
  8.        
  9. }
  10. class Rect extends Shape {
  11.         @Override
  12.         public void drawImpl() {
  13.                 System.out.println("Draw Rect.");
  14.         }
  15.         public Rect clone() {
  16.                 return new Rect();
  17.         }
  18.        
  19. }
  20. class Circle extends Shape {
  21.         @Override
  22.         public void drawImpl() {
  23.                 System.out.println("Draw Circle.");
  24.         }
  25.         @Override
  26.         public Circle clone() {
  27.                 return new Circle();
  28.         }
  29.        
  30. }
  31. public class Ex1 {
  32.         private static Scanner scan;
  33.  
  34.         public static void main(String...args) {
  35.                 List<Shape> list = new ArrayList<>();
  36.                 // 강한결합 : 하나의 클래스가 다른 클래스를 사용 할 때 클래스의 이름을 바로 사용
  37.                 // - 교체 불가능한 경직된 디자인
  38.                
  39.                 scan = new Scanner(System.in);
  40.                 while (true) {
  41.                         System.out.println("Choice : ");
  42.                         int cmd = scan.nextInt();
  43.                         if(cmd == 0) {
  44.                                 break;
  45.                         }
  46.                         switch (cmd) {
  47.                         case 1:
  48.                                 list.add(new Rect());
  49.                                 break;
  50.                         case 2:
  51.                                 list.add(new Circle());
  52.                                 break;
  53.                         case 8:
  54.                                 System.out.println("copy : ");
  55.                                 int idx = scan.nextInt();
  56.                                 list.add(list.get(idx).clone());
  57.                                 break;
  58. //                              switch(list.get(idx).type) {
  59. //                              case 1:
  60. //                                      list.add(new Rect());
  61. //                                      break;
  62. //                              case 2:
  63. //                                      list.add(new Circle());
  64. //                                      break;
  65. //                              }
  66.                                
  67.                         case 9:
  68.                                 for(Shape s : list) {
  69.                                         s.draw();
  70.                                 }
  71.                                 break;
  72.                         }
  73.                 }
  74.         }
  75. }


'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

+ Recent posts