Design pattern/구조 패턴

[디자인패턴] 11장 파사드 패턴

미스터로즈 2021. 5. 13. 22:56

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

 

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

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

 

퍼사드 패턴은 프로그래밍 언어에서 관심사를 분리하는 패턴입니다. 파사드의 어원은 프랑스어로 건물의 정면이라는 뜻을 갖고 있습니다. 건물의 외관, 겉모습을 말하며 사전적으로 '표면, 허울'로도 해석됩니다.

 

협업을 위한 분리 작업

파사드는 요즘과 같이 협업과 대형 시스템을 개발하고 배포하는 데 자주 응용되는 패턴입니다.

파사드는 시스템 결합과 사용이 용이하도록 관심사를 분리합니다.

 

하나의 서비스를 여러 개발자와 공동으로 만드는 과정은 쉽지 않습니다. 분리된 기능별 모듈을 하나로 합치는 과정에서도 수많은 난관에 봉착합니다.

 

코드를 결합한 후에도 리팩토링이나 변화가 있을 때를 대비하여 지속적으로 코드를 유지 보수 해야 합니다.

 

파사드 패턴은 강력한 결합 구조를 해결하기 위해 코드의 의존성을 줄이고 느슨한 결합으로 구조를 변경합니다.

파사드로 인해 새로운 계층이 하나 더 추가되면 관리할 클래스가 하나 더 생성된다는 단점이 있지만, 강력한 객체의 결합도를 낮추고 유연한 구조를 가질 수 있다는 장점도 있어 매력적인 패턴 중 하나입니다.

 

파사드는 시스템의 연결성과 종속성을 최소화하는 것을 목적으로 합니다.

규모가 있는 작업을 팀 단위로 분리하여 작업할 때 유용하게 적용할 수 있습니다.

파사드는 서브 스세틈을 호출, 결합할 수 있는 인터페이스를 제공합니다.

파사드를 이용하면 코드를 사용하는 클라이언트 측에서 세부적인 기능을 일일이 알 필요가 없습니다.

 

파사드를 이용한 단순화

파사드 패턴은 연관된 서브 시스템의 메서드 결합이라고 할 수 있습니다. 복잡한 서브 시스템의 동작을 하나로 묶어서 이를 실행할 수 있도록 제공하는 계층입니다.

 

파사드 패턴은 서브 기능을 쉽게 사용할 수 있도록 단순화합니다. 파사드로 제공되는 인터페이스만 알고 있으면 사용할 수 있습니다.

 

파사드 패턴을 구현하기 위해 서브 시스템의 캡슐화 작업을 별도로 진행하지 않습니다. 내부의 복잡한 기능은 숨긴 채 간단히 서브 시스템을 사용할 수 있는 외부 인터페이스만 제공하는 것입니다.

 

파사드는 서브 시스템을 구조화하여 복잡성을 해결하는 데 도움을 줍니다. 복잡성을 해결하기 위해 더 상위의 인터페이스를 제공합니다.

 

최소 지식 원칙

파사드 패턴은 객체지향의 최소 지식 원칙이 적용되는 좋은 예입니다. 최소 지식 원칙은 데메테르의 법칙이라고도 합니다.

 

지식으로 진입 장벽을 만들지 않아야 합니다. 최소 지식만 적용해 객체의 상호 작용을 설정하면 유지 보수가 용이해집니다.

 

최소 지식의 원칙을 적용하기 위한 규칙이 있습니다.

- 자기 자신만의 객체 사용

- 메서드에 전달된 매개변수 사용

- 메서드에서 생성된 객체 사용

- 객체에 속하는 메서드 사용

<?php

class Car {

    // ① 클래스의 구성요소. 
    // 구성요소의 메소드는 호출해도 된다.
    private $engine; 


    public function __construct($eng)
    { 
        $this->engine = $eng;
    }

    public function start($key)
    { 

        // ③ 새로운 객체 생성. 
        // 내부에서 생성된 객체의 메소드는 호출해도 된다.
        $doors = new Doors(); 

        // ② 매개변수로 전달된 객체의 메소드는 호출해도 된다.
        $authorized = $key.turns(); 

        if ( $authorized ) { 

            // ① 객체의 구성요소의 메소드는 호출해도 된다.
            $engine->start(); 

            // ④ 객체 내에 있는 메소드는 호출해도 된다.
            $this->updateDashboardDisplay(); 

            // ③ 직접 생성하거나 인스턴스를 만든 객체의 메소드는 호출해도 된다.
            $doors->lock(); 

        }

    }

    public function updateDashboardDisplay() 
    { 
        // 생략
    }

}

 

패키지라는 클래스 3개 생성 

<?php
/**
 * 기능1 클래스를 선언합니다.
 */
class Package1
{
    public function __construct()
    {
        echo __CLASS__." 객체가 생성이 되었습니다.<br>";
    }

    public function process()
    {
        echo "패키지1 작업을 진행합니다.<br>";
    }
}

나머지 패키지는 코드가 유사하여 git을 참고해 주세요

 

파사드를 생성

<?php
/**
 * 패키지에 대한 파사드 패턴
 */
class Facade
{
    private $_package1;
    private $_package2;
    private $_package3;

    /**
     * 인스턴스를 생성합니다.
     */
    public function __construct()
    {
        $this->_package1 = new Package1;
        $this->_package2 = new Package2;
        $this->_package3 = new Package3;
    }

    /**
     * 패키지 동작 1,2,3 을 한번에 수행해야 되는
     * 복잡한 동작을 파사드 메서드로 생성합니다.
     */
    public function processAll()
    {
        $this->_package1->process();
        $this->_package2->process();
        $this->_package3->process();
    }

}
<?php
require "package1.php";
require "package2.php";
require "package3.php";

require "facade.php";





/*
파사드
*/
$obj = new Facade;
$obj->processAll();

 

파사드 패턴의 효과

파사드를 통해 서브 시스템을 구조화하면 복잡성을 해결하는 데 도움이 됩니다.

 

파사드 패턴을 활용하면 서브 시스템의 구성 요소를 보호할 수 있는데, 서브 시스템의 구성요소를 직접 호출하지 않으므로 잘못된 사용을 방지할 수 있습니다.

 

파사드 형태로 제공하면 보다 쉽게 변경 및 확장할 수 있습니다. 따라서 결합도 또한 낮출 수 있습니다.

 

파사드는 서브 시스템에 간접적으로 접근합니다. 서브 시스템이 계층화된 구조를 갖더라도 파사드는 계층 단계별로 접근하여 행위를 호출할 수 있습니다.

 

인터페이스만 공개하기 때문에 필요한 행위만 노출하고 그 외의 코드를 비공개로 숨길 수 있습니다.