07 브릿지 패턴 (Bridge Pattern)
브릿지 패턴 (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
'JAVA > Design Patterns' 카테고리의 다른 글
11 컴포지트 패턴 (Composite Pattern) (0) | 2021.12.13 |
---|---|
10 역할 사슬 패턴 (Chain Of Responsibility) (0) | 2021.12.13 |
09 퍼사드 패턴 (Facade Pattern) (0) | 2021.12.13 |
08 반복자 패턴 (Iterator Pattern) (0) | 2021.12.13 |
06 프록시 패턴 (Proxy Pattern) (0) | 2021.12.13 |
05 어댑터 패턴 (Adapter Pattern) (0) | 2021.12.10 |
04 Builder 패턴 (0) | 2021.12.10 |
03 Template Method 패턴 (0) | 2021.12.10 |