반응형
브리지 패턴
구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴
기능과 구현에 대해 두 개의 별도의 클래스로 구현
구현부는 객체에서 동작을 처리하기 위해, 추상부는 확장을 위해 존재한다.
어댑터 패턴이 추가 요구사항을 위해 기능을 추가하는 반면 브리지 패턴은 설계 진행 중에 의도적으로 레이어를 분리시킨다.
- Abstraction: 기능 계층의 추상 인터페이스
- RefindAbstraction: Abstraction을 상속하여 기능을 제공하는 클래스
- Implementor: Abstraction의 기능을 구현하기 위한 클래스의 인터페이스
- ConcreteImplementor: Implementor의 인터페이스인 실제 기능을 구현하는 클래스
interface Implementor{
void implMethod1();
void implMethod2();
}
class ConcreteImplementor implements Implementor{
@Override
public void implMethod1() {
}
@Override
public void implMethod2() {
}
}
abstract class Abstraction{
private Implementor impl;
Abstraction(Implementor impl){
this.impl = impl;
}
public void method1(){
impl.implMethod1();
}
public void method2(){
impl.implMethod2();
}
}
class RefinedAbstraction extends Abstraction{
RefinedAbstraction(Implementor impl){
super(impl);
}
}
클래스 다이어그램을 코드로 변경하면 다음과 같은 클래스들이 나온다.
직접 예제를 만들면서 적용해보자
Implementor
interface MoneyAPI {
int withdraw(int money);
int deposit(int money);
}
돈에 관련된 기능을 구현할 클래스의 인터페이스를 정의한다.
이제 해당 인터페이스를 구현할 클래스를 만들어보자.
ConcreteImplementor
class SavingAccountAPI implements MoneyAPI {
private int withdrawCnt = 5;
private int balance;
@Override
public int withdraw(int money) {
if( withdrawCnt > 0 ){
balance -= money;
}else{
System.out.println("Can't withdraw money");
}
return balance;
}
@Override
public int deposit(int money) {
balance += money;
return balance;
}
}
5번 이상 출금할 수 없는 SavingAccount 클래스를 구현하였다.
이제 이 기능들을 클라이언트에게 제공하기 위한 클래스를 만들자.
Abstraction
abstract class Bank {
private MoneyAPI api;
Bank(MoneyAPI api){
this.api = api;
}
public int withdraw(int money) {
return api.withdraw(money);
}
public int deposit(int money){
return api.deposit(money);
}
}
위에서 만든 기능들을 제공하기 위한 Bank 추상 클래스를 만들었다.
Bank 클래스를 생성할때 MoneyAPI를 초기화 하면서 구현한 기능을 가져올 수 있다.
RefinedAbstraction
class HanaBank extends Bank {
HanaBank(MoneyAPI api){
super(api);
}
public void transferForMonth(){
for( int i=0; i<12; i++ ){
deposit(100);
}
}
}
실제 Bank 클래스를 만들고 HanaBank에서만 제공할 기능들을 추가해준다.
public static void main(String[] args){
HanaBank bank = new HanaBank(new SavingAccountAPI());
bank.deposit(10000);
bank.withdraw(10);
bank.transferForMonth();
}
클라이언트는 클래스 생성 시 HanaBank가 가진 기능인 SavingAccountAPI를 초기화 해준다.
SavingAccount 가 아닌 다른 기능을 대체하고 싶다면 MoneyAPI를 구현한 다른 클래스로 초기화 시켜주면 된다.
또는 다른 기능을 추가하고 싶다면 Bank 클래스에 새로운 API 인터페이스를 추가해주면 된다.
이렇게 기능을 추가하여도 클라이언트의 코드를 변형 시키지 않고 기능을 구현한 클래스만 확장해줄 수 있다.
참고
https://brownbears.tistory.com/498
https://joomn11.tistory.com/59
https://ko.wikipedia.org/wiki/브리지_패턴
반응형
'Clean Code' 카테고리의 다른 글
[Clean Code] 만들면서 배우는 클린 아키텍처 후기 (0) | 2022.06.14 |
---|---|
[Design Pattern] 구조 패턴 - 퍼사드 패턴 (0) | 2022.03.14 |
[Design Pattern] 구조 패턴 - 어댑터 패턴 (0) | 2022.03.08 |
[Design Pattern] 구조 패턴 - 컴포지트 패턴 (0) | 2022.03.06 |
[Design Pattern] 구조 패턴 - 데코레이터 패턴 (0) | 2022.03.03 |