개발 - 고급/Design Pattern

2. Adapter : 사이에 끼워 재사용

wooweee 2023. 10. 28. 13:37
728x90

1. Adapter 패턴

  • 재사용성 향상
  • 종류
    1. 상속 사용 : class에 의한 패턴
    2. 포함관계 사용 : instance에 의한 패턴
      - 이게 더 유연, 많이 사용. 데코레이터 패턴과 같이 사용 가능해짐
  • java는 다중 상속이 안되기 때문에 포함 관계를 이용해서 해결한다.
  • Wrapper 패턴이라고도 불린다.

2. 구현 코드

 

3. 장점

  • 왜 그냥 프로그래밍하면 되지 adapter 패턴 같은 걸 생각해야하냐?
  • 이미 존재하는 class를 이용하는 경우 (재사용하고 싶을 때) 해당 패턴 사용시 빠르게 필요 메서드 사용이 가능해짐
  • 그리고 이미 존재하는 것이라 검증되 됨
  • 주의
    • 보통 우리는 기존 클래스 소스를 만져서 수정을 한다. 하지만 그렇게 하면 동작 테스트가 이미 끝난 기존 클래스에 손을 댔으니 수정한 후에 다시 테스트 해야함
    • adapter 패턴은 기존 클래스를 전혀 수정하지 않고 목적한 인터페이스에 맞추려는 것.

 

  • 등장 인물
    • target: 대상
    • client: 의뢰자
    • adaptee: 적응 대상자
    • adapter: 적응자

 

  • 관련 패턴 
    • bridge 패턴
    • decorator 패턴

 

 

 

 

 

4. Template Method 패턴

  • 상속의 나쁜 점을 해결한 상속 패턴, 그래도 가능하면 포함관계를 이용해라
  • 조상에서 다 만들어 놓은 것을 사용.
  • 상속과의 차이는 상속은 자식에 뭐가 너무 많다. 이 때 부모가 변경시, 자손에 영향이 너무 크다. 이런 영향력을 최소화 하기 위해서 template 패턴을 사용 → 안바뀔 부분만 template pattern에 넣는다. 자손은 조금만 넣는다. overriding 같은 것을 사용 안함 ex) inputStream 경우
  • template, strategy 보통 strategy 쓰다가 공통 많아지면 template 사용하셈
// template pattern
abstract class MyThread extends Thread { // 좋은 상속(부모 field 전혀 사용 안함), 부모가 바뀌어도 자손이 영향을 받지 않는다.
	@Override
	pubhlic void run() {
		// 코드 작성
	}
}

// Strategy pattern
class MyThread implements Runnable { // 밖에서 직접 줌
	@Override
	pubhlic void run() { // Thread(Runnable r) // 주입
		// 코드 작성
	}
}
  • 하위 클래스를 상위 클래스와 동일시한다. = lsp(리스코프 치환 법칙)
  • 결론 : 상속은 좋지 않다. * 위임 == 포함 → 구현을 상속할 경우에는 LSP를 엄격하게 지키기가 불가능하다. 부모 대신 자식을 사용하기가 어렵다.
  • 인터페이스와 추상클래스의 차이점을 잘 알아야한다. → 공통부분인 구현부분이 존재시, 추상클래스 아니면 인터페이스

5. factory method

  • 하위 클래스에서 인스턴스를 만든다.
  • template method 패턴을 인스턴스 생성 장면에 적용한 것
  • static factory method pattern과 헷갈리면 안됨
Singleton s = Singleton.getInstance();

class Singleton {
	private static Signleton s = new Singleton();

	// static factory method - 객체를 생성해서 변환하는 메서드 * factory method pattern과 다름
	public static Singleton sgetInstance() {
		if(s == null) s = new Singleton();
		return s;
	}
}
  • 89p spring framework 가 이런 형태. 이런게 framework이다.