자바 디자인패턴 Bridge pattern

1 분 소요

Bridge Pattern

구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고, 확장이 가능하도록하는 패턴

즉, 기능과 구현에 대해 두 개를 별도의 클래스로 구현한다.

  • 브릿지 패턴의 구조

    • Abstraction : 기능 계층의 최상위 클래스. 구현 부분에 해당하는 클래스를 인스턴스를 갖고 해당 인스턴스를 통해 구현 부분의 메서드를 호출
    • RefindAbstraction : 기능 계층에서 새로운 부분을 확장한 클래스
    • Implementor : Abstraction의 기능을 구현하기 위한 인터페이스 정의
    • ConcreteImplementor : 실제 기능을 구현
  • 브릿지 패턴의 예제

    각 동물 이라는 클래스와 이 동물 클래스가 가질 수 있는 ‘사냥방법’을 브릿지 패턴을 적용해서 각가 분리, 설계

    기능부에 해당하는 최상위 클래스 animal 이 존재하고, 그 하위로 bird, tiger 가 존재,

    ‘동물’ 이라는 추상 객체의 기능 구현 부분을 Hunting, Handler와 분리하여 구조 설계

  • 코드

    Animal.java

    public class Animal {
        private Hunting_Handler hunt;
        public Animal(Hunting_Handler hunt){
            this.hunt = hunt;
        }
      
        public void Find_Quarry(){
            hunt.Find_Quarry();
        }
      
        public void Detected_Quarry(){
            hunt.Detected_Quarry();
        }
      
        public void Attack(){
            hunt.attack();
        }
      
        public void hunt(){
            Find_Quarry();
            Detected_Quarry();
            Attack();
        }
    }
    
    • 기능 부분에 해당하는 최상위 클래스.
    • Hunting_Handler 의 인스턴스를 갖고, 각각의 Hunting_Handler 를 상속받아 구현하고 있는 메서드 호출

    Hunting_Handler.interface

    public interface Hunting_Handler {
        public void Find_Quarry();
        public void Detected_Quarry();
        public void attack();
    }
    
    • 동물이 가질 수 있는 ‘사냥’ 방식들이 가져야 할 공통 인터페이스 정의

    Hunting_Method1.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("사냥 시작!");
        }
    }
    

    Hunting_Method2.java

    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 인터페이스를 상속받아 실제 기능에 해당하는 부분을 구현

    Tiger.java

    public class Tiger extends Animal {
        public Tiger(Hunting_Handler hunt) {
            super(hunt);
        }
      
        public void hunt(){
            System.out.println("호랑이가 사냥한다 어흥");
            Find_Quarry();
            Detected_Quarry();
            Attack();
        }
    }
    
    • Animal 을 확장한 클래스

    Bird.java

    public class Bird extends Animal {
        public Bird(Hunting_Handler hunt) {
            super(hunt);
        }
        public void hunt(){
            System.out.println("새가 사냥한다 짹짹");
            Find_Quarry();
            Detected_Quarry();
            Attack();
        }
    }
    

    Main.java

    public class Main {
        public static void main(String[] args) {
            Animal tiger = new Tiger(new Hunting_Method2());
            Animal bird = new Bird(new Hunting_Method1());
      
            tiger.hunt();
            System.out.println("-------------------------");
            bird.hunt();
        }
    }
    

댓글남기기