07 브릿지 패턴 (Bridge Pattern)

2021. 12. 13. 12:59 JAVA/Design Patterns

브릿지 패턴 (Bridge Pattern)

 

구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 합니다. 즉 기능과 구현에 대해서 두 개를 별도의 클래스로 구현을 합니다.

 

 

 브릿지 패턴의 구조

 

 

● Abstraction : 기능 계층의 최상위 클래스. 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출합니다.

 

● RefindAbstraction : 기능 계층에서 새로운 부분을 확장한 클래스

 

● Implementor : Abstraction의 기능을 구현하기 위한 인터페이스 정의

 

● ConcreteImplementor : 실제 기능을 구현합니다.

 

 

 브릿지 패턴 예제

 

각 '동물'이라는 클래스와 이 동물 클래스가 가질 수 있는 '사냥방법'을 Bridge 패턴을 적용하여 각각 분리하여 설계를 해보겠습니다.

 

 

먼저 기능부에 해당하는 최상위 클래스 Animal이 존재하고 그 하위클래스로 Bird와 Tiger 클래스가 존재합니다. '동물'이라는 추상 객체의 기능 구현 부분을 Hunting_Handler와 분리하여 구조를 설계 하였습니다.

 

한 클래스씩 살펴보겠습니다.

 

 

Hunting_Handler.interface

public interface Hunting_Handler {
    public void Find_Quarry();
    public void Detected_Quarry();
    public void attack();
}

 

 

동물이 가질 수 있는 '사냥 방식'들이 가져야 할 공통 인터페이스를 정의하고 있습니다.

 

 

Huntig_Method1.java , Hunting_Method2.java

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("낚아챈다.");
    }
}

 

 
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("물어뜯는다.");
    }
}

 

 

 

Hunting_Handler 인터페이스를 상속받아 실제 기능에 해당하는 부분을 구현합니다.

 

 

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();
    }
}


기능 부분에 해당되는 최상위 클래스입니다. Hunting_Handler의 인스턴스를 가지고 각각의 Hunting_Handler를 상속받아 구현하고 있는 메서드들을 호출하고 있습니다.

 

 

Tiger.java , Bird.java

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

Animal를 확장한 클래스입니다. 패턴을 보여주기 위해 억지적인 면은 있지만 실제로 확장의 의미로 Tiger 와 Bird만의 추가적인 기능을 가질 수도 있습니다.

(예제에서 확장의 의미로는 어느 동물의 사냥방식인지 화면에 출력해주는 정도..)

 

Main.java

public class Main {
    
    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();
    }
}
 

 

실제 메인에서 동물 클래스를 생성하고 각각 다른 사냥 방식을 채택하는 모습입니다.

 

 

출처 : https://lktprogrammer.tistory.com/35?category=672216