[Design Pattern] 브릿지 패턴(Bridge Pattern)

시나브로·2021년 6월 29일
0

디자인 패턴

목록 보기
10/24
post-thumbnail

브릿지 패턴(Bridge Pattern)


  • 구조(Structural) 패턴
  • 구현부에서 추상층을 분리하여 각자 독립적으로 변형 및 확장이 가능하도록 만드는 패턴
  • 기능과 구현에 대해 두 개의 별도 클래스로 구현한다



구조


  • Abstraction : 기능 계층의 최상위 클래스로 추상 인터페이스
  • RefindAbstraction : 기능 계층에서 새로운 부분을 확장한 클래스
  • Implementor : Abstraction의 기능을 구현하기 위한 인터페이스 정의
  • ConcreteImplementor : 실제 기능을 구현하는 클래스



구현


사냥법 출력하기


Hunting_Handler.class

public interface Hunting_Handler {
    void Find_Quarry();
    void Detected_Quarry();
    void attack();
}
  • 사냥법 Method에 대한 인터페이스를 정의한다



Hunting_Method1.class

public class Hunting_Method1 implements Hunting_Handler {
    public void Find_Quarry()
    {
        System.out.println("물 위에서 찾는다");
    }
    public void Detected_Quarry()
    {
        System.out.println("물고기 발견!");
    }
    public void attack()
    {
        System.out.println("낚아챈다.");
    }
}

Hunting_Method2.class

public class Hunting_Method2 implements Hunting_Handler {
    public void Find_Quarry()
    {
        System.out.println("지상에서 찾는다");
    }
    public void Detected_Quarry()
    {
        System.out.println("노루 발견");
    }
    public void attack()
    {
        System.out.println("물어뜯는다.");
    }
}

  • 사냥법에 대한 실제 출력 기능들을 정의한다



Animal.class

public class Animal {

    private Hunting_Handler hunting;

    public Animal(Hunting_Handler hunting)
    {
        this.hunting=hunting;
    }
    public void Find_Quarry()
    {
        hunting.Find_Quarry();
    }
    public void Detected_Quarry()
    {
        hunting.Detected_Quarry();
    }
    public void attack()
    {
        hunting.attack();
    }
    public void hunt()
    {
        Find_Quarry();
        Detected_Quarry();
        attack();
    }
}
  • 객체 생성과 기능에 대한 Method를 정의한다



Bird.class

public class Bird extends Animal
{
    public Bird(Hunting_Handler hunting)
    {
        super(hunting);
    }
    public void hunt()
    {
        System.out.println("새의 사냥방식");
        Find_Quarry();
        Detected_Quarry();
        attack();
    }
}

Tiger.class

public class Tiger extends Animal
{
    public Tiger(Hunting_Handler hunting)
    {
        super(hunting);
    }
    public void hunt()
    {
        System.out.println("호랑이의 사냥방식");
        Find_Quarry();
        Detected_Quarry();
        attack();
    }
}

  • 각 기능들을 조합하여 구현한다



Main.class

      public static void main(String argsp[])
    {
        Animal tiger = new Tiger(new Hunting_Method2());
        Animal bird = new Bird(new Hunting_Method1());

        tiger.hunt();
        System.out.println("--------------");
        bird.hunt();
    }

호랑이의 사냥방식
지상에서 찾는다
노루 발견
물어뜯는다.
--------------
새의 사냥방식
물 위에서 찾는다
물고기 발견!
낚아챈다.

  • 두 개의 클래스 계층을 분리해 두면 각각의 클래스 계층을 독립적으로 확장할 수 있다




장단점


  • 장점
    • 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있다.
    • 구현을 인터페이스에 완전히 결합시키지 않았기 때문에 구현과 추상화된 부분을 분리시킬 수 있다
    • 추상화된 부분을 구현한 구상 클래스를 바꿔도 클라이언트 쪽에는 영향을 끼치지 않는다.
  • 단점
    • 디자인이 복잡해진다






참조:

profile
Be More!

0개의 댓글