728x90
1. Adapter 패턴
- 재사용성 향상
- 종류
- 상속 사용 : class에 의한 패턴
- 포함관계 사용 : 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이다.