// 기존 클래스의 인터페이스를 변경하여 클라이언트가 요구하는 새로운 클래스를 만드는 디자인 기법
// 라이브러리를 설계할 때 사용자가 쉽게 사용할 수 있게하고, 잘못된 사용은 어렵게 해라.
// 포함 > 상속
// - 쉽게 내부구현를 바꿀 수 있다.
// -- 사용자는 성능향상만을 느낄 수 있다.
// - 외부로 노출되는 인터페이스 API를 제어가능하다.
// -- 일반적으로 상속 이용 시 부모의 public 인터페이스를 노출해야하지만 포함은 쉽게 제어 가능하다.
// -- 잘못된 사용을 할 확률이 낮아진다.
- /**
- * Vector class를 상속을 기반으로 한 설계
- * 단점 - Vector의 인터페이스가 노출되어 의도치 않은 동작을 할 수 있다.
- * @author YM,Jung
- *
- * @param <E>
- */
- class Stack<E> extends Vector<E> {
- // java 1.0 까지의 Stack은 이런방식으로 구현되어 있다.
- // 상속을 통한 재사용을 지양하자. 컴포지션(포함)으로 사용하자.
- private static final long serialVersionUID = -7937875509563141466L;
- public Stack() {
- }
- public boolean empty() {
- return isEmpty();
- }
- public E push(E object) {
- addElement(object);
- return object;
- }
- @SuppressWarnings("unchecked")
- public E pop() {
- if (elementCount == 0) {
- throw new EmptyStackException();
- }
- final int index = --elementCount;
- final E obj = (E) elementData[index];
- elementData[index] = null; // GC대상이 될 수 있게 null을 대입. 메모리 릭을 예방
- return obj;
- }
- }
- /**
- * 포함을 기반으로 한 설계
- *
- * @author YM,Jung
- *
- * @param <E>
- */
- class Stack2<E> {
- private List<E> data = new ArrayList<>();
- public Stack2() {}
- public E push(E obj) {
- data.add(obj);
- return obj;
- }
- public E pop() {
- if(data.size() == 0) {
- throw new EmptyStackException();
- }
- final int index = data.size() - 1;
- final E obj = data.get(index);
- data.remove(index);
- return obj;
- }
- public boolean empty() {
- return data.isEmpty();
- }
- }
- public class Ex1 {
- public static void main(String[] args) {
- Stack2<String> s = new Stack2<>();
- s.push("111");
- s.push("222");
- s.push("333");
- s.push("444");
- s.push("555");
- while(!s.empty()) {
- System.out.println(s.pop());
- }
- }
- }
'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 |