브리지 패턴이란?
구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 합니다. 즉 기능과 구현에 대해서 두 개를 별도의 클래스로 구현을 합니다.
추상 계층에 있는 모든 클래스의 연산 실행은 구현 계층을 통해 이루어 진다.
브리지 패턴 사용 방법
구현 계층
- Implementor : 구현 클래스에 대한 인터페이스를 제공
- ConcreateImplementor: Implementor 인터페이스를 구현. 실제적은 구현 내용을 담음
추상 계층
- Abstraction : 추상적 개념에 대한 인터페이스를 제공하고, 객체 구현부 인터페이스와 집합 관계를 형성
- RefinedAbstraction : 추상적 개념에 정의된 인터페이스를 확장
//추상 부분
public interface Implementor{
void implMethodX();
void implMethodY();
}
public class ConcreteImplementor implements Implementor{
@Override
public void implMethodX(){
//구현
}
@Override
public void implMethodY(){
//구현
}
}
//추상부분
public abstract class Abstraction {
protected Implementor impl;
protected Abstraction(Implementor impl){
this.impl=impl;
}
public abstract void method1();
public abstract void method2();
}
public class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementor impl){
super(impl);
}
@Override
public void method1(){
impl.implMethodX;
}
@Override
public void method2(){
impl.implMethodY;
}
}
// 클라이언트 코드
public class Client {
public static void main(String[] args) {
Abstraction abstraction=new RefinedAbstraction(new ConcreteImplemtor());
abstraction.method1;
}
}
상속 관계
- 실행 시 구현 객체 하나만 존재
- 추상 클래스와 구현 클래스가 컴파일시에 고정
Aggregation 관계
- 실행 시 추상부분 객체와 구현 부분 객체 두 개가 따로 존재
- 실행 시 추상 부분 객체와 구현부분 객체의 연결이 바뀔 수 있다.
- 상속관계보다 더 유연하다.
패턴 사용 시기
- 추상적 개념과 이에 대한 구현 사이의 지속적인 종속 관계를 피하고 싶을 때
- 추상적 개념과 구현 모두가 독립적으로 서브클래싱을 통해 확장되어야 할 때
- 추상적 개념에 대한 구현 내용을 변경하는 것이 다른 관련 프로그램에 아무런 영향을 주지 않아야 할 때
- 클래스 계통에서 클래스 수가 급증하는것을 방지하고자 할 때
패턴 장점
- 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다.
- 추상적인 코드와 구체적인 코드를 분리할 수 있다.
- 구조적인 틀을 작성해놓고, 자유롭게 구현 코드를 주입할 수 있다.
패턴 단점
- 계층 구조가 늘어나 복잡도가 증가할 수 있다.
- 단 하나의 클래스만 만들고 추후에 확장 가능성이 아예 존재하지 않는다면, 오히려 번거로운 작업이 될 수 있다.
'CS > Design Pattern' 카테고리의 다른 글
옵서버 패턴 (Observer Pattern) (0) | 2024.04.18 |
---|---|
싱글톤 패턴 (Singleton Pattern) (0) | 2024.04.18 |
컴포지트 패턴 (Composite Pattern) (0) | 2024.04.17 |
퍼싸드 패턴 (Facade Pattern) (0) | 2024.04.17 |
어댑터 패턴 (Adaptor Pattern) (0) | 2024.04.03 |