티스토리 뷰

반응형

브릿지 패턴 (Bridge Pattern)

 

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

 

 

브릿지 패턴의 구조

 

 

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

 

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

 

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

 

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

 

 

브릿지 패턴 예제

 

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

 

 

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

 

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

 

 

Hunting_Handler.interface

 

1
2
3
4
5
public interface Hunting_Handler {
    public void Find_Quarry();
    public void Detected_Quarry();
    public void attack();
}

 

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

 

 

Huntig_Method1.java , Hunting_Method2.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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("낚아챈다.");
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Tiger extends Animal
{
    public Tiger(Hunting_Handler hunting)
    {
        super(hunting);
    }
    public void hunt()
    {
        System.out.println("호랑이의 사냥방식");
        Find_Quarry();
        Detected_Quarry();
        attack();
    }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
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();
    }
}
 

 

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

 

 

반응형

'Study > 디자인 패턴' 카테고리의 다른 글

09 퍼사드 패턴 (Facade Pattern)  (0) 2017.09.26
08 반복자 패턴 (Iterator Pattern)  (0) 2017.09.24
06 프록시 패턴 (Proxy Pattern)  (0) 2017.09.21
05 어댑터 패턴 (Adapter Pattern)  (0) 2017.09.16
04 Builder 패턴  (0) 2017.09.14