Design pattern/구조 패턴

[디자인 패턴]8장 브리지 패턴

미스터로즈 2021. 5. 10. 18:58

공부하기 위해서 요약정리해놓은 것입니다..

 

정확하고 꼼꼼한 자료는 쉽게 배워 바로 써먹는 디자인 패턴을 확인하시고

코드는 github.com/infohojin/patterns 을 참고해 주세요.

 

브리지 패턴은 객체의 확장성을 향상하기 위한 패턴으로, 객체에서 동작을 처리하는 구현부와 확장을 위한 추상부를 분리합니다.

다른 용어로는 핸들패턴 또는 구현부 패턴이라고도 합니다.

 

복잡한 코드

세상에 완벽한 프로그램은 없습니다. 따라서 발견하지 못했던 기능을 추가하거나, 새로운 업무를 추가하는 작업이 필요합니다. 이처럼 추가 요청에 의해 기존에 완성된 코드를 변경 작업하는 것을 유지 보수라고 합니다.

<?php
// 최초 설계 인사말
class Hello
{
    public function greeting()
    {
        return "Hello";
    }
}
<?php

require "hello.php";

// 인사말 출력
$obj = new Hello;
echo $obj->greeting();

한국어 인사말을 추가 => 인자값이 추가

<?php
// 최초 설계 인사말
class Hello
{
    public function greeting($lang)
    {
        if ($lang == "Korean") {
            return "안녕하세요";
        } else {
            return "Hello";
        }
    }
}
<?php

require "hello.php";

// 인사말 출력
$obj = new Hello;
echo $obj->greeting("Korean");

상속

객체지향은 요구되는 행위를 객체화하여 처리합니다. 다양한 행위를 위해 클래스는 다른 클래스를 포함하고 상속을 통해 기능을 확장합니다.

 

Hello 클래스를 상속하면서 추가 메서드를 하나 더 만듭니다. Greeting 클래스는 Hello 클래스의 메서드와 추가로 작성한 메서드를 모두 갖고 있습니다.

 

상속은 객체지향에서 중요한 개념이며 코드를 재사용하고 확장하기에 매우 유용합니다.

 

하지만 상속에는 한가지 문제점이 있습니다. 클래스를 상속하면 구현과 추상 개념이 영구적으로 결합합니다. 즉, 기능을 상속으로 확장하면 최종적인 클래스는 무거워집니다.

패턴 설계 1

 

 

인터페이스를 이용하여 계층화된 클래스를 분리합니다. 

다음은 브리지 패턴의 설계 요소 중 구현 부분입니다. 인터페이스를 적용해 하위 클래스를 설계합니다.

 

또한, 복합 객체인 Language는 구현 클래스의 객체를 프로퍼티에 담고 있으며 프로퍼티를 설정할 수 있는 setter 메서드도 갖고 있습니다.

 

패턴 설계 2

구상 클래스의 연결 부분을 추상 계층으로 변경합니다. 추상화 변경을 실행하는 이유는 각각의 계층이 독립적으로 확장/변경 가능하도록 하기 위해서입니다.

 

브리지 패턴은 기능을 처리하는 클래스와 구현을 담당하는 추상 클래스로 구별합니다. 구현뿐만 아니라 추상화도 독립적 변경이 필요할 때 브리지 패턴을 사용합니다.

 

<?php

interface Hello
{
    public function greeting();
}

 

  
<?php

class English implements Hello
{
    public function greeting()
    {
        return "hello.";
    }
}
<?php

class Korean implements Hello
{
    public function greeting()
    {
        return "안녕하세요.";
    }
}
<?php

abstract class Language
{
    public $language;

    abstract public function greeting();
    
}
<?php

class Message extends Language
{
    public function __construct($lang)
    {
        $this->language = $lang;
    }

    public function greeting()
    {
        return $this->language->greeting();
    }
}
<?php
// 계층
require "hello.php";
require "Korean.php";
require "English.php";

//계층
require "Language.php";
require "Message.php";

if(isset($language) && $language == "Korean") {
    $obj = new Message( new Korean );
} else {
    $obj = new Message( new English );
}

echo $obj->greeting();

선택한 언어에 따라서 인사말이 변경됩니다.

 

브리지 패턴은 2개의 객체는 추상화를 구현에서 분리하여 매우 독립적으로 사용할 수 있어야 합니다.

 

장점

분리된 2개의 추상 계층과 구현 계층은 독립적인 확장이 가능합니다.

클라이언트 코드에서 추상 계층과 연결된 구현 클래스를 변경해도 영향 없이 사용할 수 있습니다.

브리지 패턴은 다중 플랫폼을 지원하는 코드를 개발할 때 매우 유용합니다.

 

단점

브리지 패턴은 하나의 클래가 추상 계층과 구현 계층으로 분리됩니다. 즉, 디자인 설계가 복잡해진다는 단점이 있습니다.