// 기존 클래스의 인터페이스를 변경하여 클라이언트가 요구하는 새로운 클래스를 만드는 디자인 기법

// 라이브러리를 설계할 때 사용자가 쉽게 사용할 수 있게하고, 잘못된 사용은 어렵게 해라.

// 포함 > 상속

// - 쉽게 내부구현를 바꿀 수 있다. 

// -- 사용자는 성능향상만을 느낄 수 있다.

// - 외부로 노출되는 인터페이스 API를 제어가능하다.

// -- 일반적으로 상속 이용 시 부모의 public 인터페이스를 노출해야하지만 포함은 쉽게 제어 가능하다.

// -- 잘못된 사용을 할 확률이 낮아진다.


  1. /**
  2.  * Vector class를 상속을 기반으로 한 설계
  3.  * 단점 - Vector의 인터페이스가 노출되어 의도치 않은 동작을 할 수 있다.
  4.  * @author YM,Jung
  5.  *
  6.  * @param <E>
  7.  */
  8. class Stack<E> extends Vector<E> {
  9.         // java 1.0 까지의 Stack은 이런방식으로 구현되어 있다.
  10.         // 상속을 통한 재사용을 지양하자. 컴포지션(포함)으로 사용하자.
  11.         private static final long serialVersionUID = -7937875509563141466L;
  12.  
  13.         public Stack() {
  14.         }
  15.  
  16.         public boolean empty() {
  17.                 return isEmpty();
  18.         }
  19.  
  20.         public E push(E object) {
  21.                 addElement(object);
  22.                 return object;
  23.         }
  24.  
  25.         @SuppressWarnings("unchecked")
  26.         public E pop() {
  27.                 if (elementCount == 0) {
  28.                         throw new EmptyStackException();
  29.                 }
  30.                 final int index = --elementCount;
  31.                 final E obj = (E) elementData[index];
  32.                 elementData[index] = null; // GC대상이 될 수 있게 null을 대입. 메모리 릭을 예방
  33.                 return obj;
  34.         }
  35. }
  36.  
  37. /**
  38.  * 포함을 기반으로 한 설계
  39.  *
  40.  * @author YM,Jung
  41.  *
  42.  * @param <E>
  43.  */
  44. class Stack2<E> {
  45.         private List<E> data = new ArrayList<>();
  46.        
  47.         public Stack2() {}
  48.         public E push(E obj) {
  49.                 data.add(obj);
  50.                 return obj;
  51.         }
  52.         public E pop() {
  53.                 if(data.size() == 0) {
  54.                         throw new EmptyStackException();
  55.                 }
  56.                 final int index = data.size() - 1;
  57.                 final E obj = data.get(index);
  58.                
  59.                 data.remove(index);
  60.                 return obj;
  61.         }
  62.         public boolean empty() {
  63.                 return data.isEmpty();
  64.         }
  65. }
  66. public class Ex1 {
  67.  
  68.         public static void main(String[] args) {
  69.                 Stack2<String> s = new Stack2<>();
  70.                 s.push("111");
  71.                 s.push("222");
  72.                 s.push("333");
  73.                 s.push("444");
  74.                 s.push("555");
  75.                
  76.                 while(!s.empty()) {
  77.                         System.out.println(s.pop());
  78.                 }
  79.         }
  80. }


'java > design_pattern' 카테고리의 다른 글

Strategy Pattern  (0) 2014.06.27
Template Method Pattern  (0) 2014.06.27
Java Singleton 선언하는법  (0) 2014.06.18
Design Pattern 기본 원칙  (0) 2014.06.18
Builder Pattern  (0) 2014.06.17

+ Recent posts