서번트(디자인 패턴)
Servant (design pattern)![]() |
소프트웨어 엔지니어링에서, 하인 패턴은 각 클래스들의 기능성을 정의하지 않고 클래스 그룹에 어떤 기능성을 제공하는 데 사용되는 객체를 정의한다.하인은 하인이 무언가를 하는 대상(또는 그와 함께)이 매개변수로 취해지는 반면, 원하는 서비스를 관리하는 방법을 제공하는 예(또는 심지어 정의 클래스)를 말한다.
설명 및 간단한 예
하인은 계급 집단에게 어떤 행동을 제공하는 데 사용된다.각 클래스에서 또는 공통 부모 클래스에서 이러한 동작을 배제할 수 없을 때 그러한 동작을 정의하는 대신, 그것은 하인에 한 번 정의된다.
예를 들어, 기하학적 객체(직각, 타원, 삼각형)를 나타내는 몇 가지 클래스가 있다.우리는 캔버스에 이 물건들을 그릴 수 있다.이러한 개체에 대해 "이동" 방법을 제공해야 할 때 우리는 각 클래스에서 이 방법을 구현하거나, 그들이 구현하는 인터페이스를 정의한 후 하인에서 "이동" 기능을 제공할 수 있다.인터페이스는 서비스 클래스에 하인이 원하는 행동을 제공하는 데 필요한 방법이 있는지 확인하기 위해 정의된다.만약 우리가 우리의 예에서 계속한다면, 우리는 이 인터페이스를 구현하는 모든 클래스가 "getPosition"과 "Setup" 방법을 구현할 필요가 있다는 것을 명시하는 인터페이스 "Movable"을 정의한다.첫 번째 방법은 캔버스에 있는 물체의 위치를 얻고, 두 번째 방법은 물체의 위치를 설정하여 캔버스에 그린다.그런 다음 "MoveTo(Movable movedObject, Position where)"와 moveBy(Movable movedObject, intdx, int dy) 두 가지 방법을 가진 하인 클래스 "MoveServant"를 정의한다.서번트 클래스는 이제 이동 가능을 구현하는 모든 물체를 이동하는데 사용될 수 있다.따라서 "이동" 코드는 "걱정의 분리" 규칙을 존중하는 한 클래스에만 나타난다.
두 가지 구현 방법
이 디자인 패턴을 구현하는 두 가지 방법이 있다.
- 사용자는 하인을 알고 있으며(이 경우 서비스 클래스를 알 필요가 없음) 그의 요청이 포함된 메시지를 하인 인스턴스(instance)에 전송하여 서비스된 객체를 매개 변수로 전달한다.
- 서비스 클래스(우리 예에서 나온 지오메트리 객체)는 하인에 대해 알지 못하지만, "ISERViseed" 인터페이스를 구현한다.사용자 클래스는 단지 하인의 방법을 호출하고 서비스된 객체를 매개 변수로 전달한다.이 상황은 그림 1에 나타나 있다.
- 서비스된 인스턴스(instance)는 하인을 알고 사용자가 하인의 요청과 함께 메시지를 보낸다(이 경우 하인을 알 필요가 없음).그런 다음 서비스된 인스턴스는 서비스를 요청하는 메시지를 하인의 인스턴스에 보낸다.
- 그림 2는 사용자가 서번트 클래스와 직접 서비스 클래스에 대해 모르는 정반대의 상황을 보여준다.서비스형 수업은 하인 스스로에게 원하는 기능을 달성하도록 요청한다.
서번트 구현 방법
- 하인이 어떤 행동을 해야 하는지 분석한다.하인이 어떤 방법을 정의하고 이러한 방법이 서비스 매개변수로부터 필요한지 명시한다.즉, 서비스된 인스턴스(instance)가 제공해야 하는 것으로서, 하인 방법이 목표를 달성할 수 있다.
- 서비스형 수업은 어떤 능력이 있어야 제대로 서비스될 수 있는지 분석한다.
- 우리는 선언된 방법의 실행을 강제할 인터페이스를 정의한다.
- 서비스된 개체의 요청된 동작을 지정하는 인터페이스를 정의하십시오.만약 어떤 사례가 하인에 의해 서비스되길 원한다면, 그것은 반드시 이 인터페이스를 구현해야 한다.
- 특정 하인(또는 어떻게든)을 정의(또는 획득)하라.
- 서비스 클래스를 사용하여 정의된 인터페이스를 구현하십시오.
예
이 간단한 자바 예는 위에서 설명한 상황을 보여준다.이 예는 예시일 뿐이며 기하학적 객체의 실제 도면이나 그 외관상의 사양을 제시하지는 않을 것이다.
// 서번트 클래스, 구현 클래스에 기능 제공 // 이동 가능한 인터페이스 공중의 계급 무브서번트 { // 이동 가능한 구현 클래스를 다음 위치에 배치하는 방법 공중의 공허하게 하다 로 옮기다(가동성 서비스된, 포지션 어디에) { // 부드럽고 멋지게 움직일 수 있도록 다른 일을 하라, 이것은 // 기능을 제공하는 장소 서비스된.설정위치(어디에); } // Dx 및 dy로 이동 가능한 구현 클래스를 이동하는 방법 공중의 공허하게 하다 이동별(가동성 서비스된, 인트로 dx, 인트로 dy) { // 기능을 제공하는 장소 dx += 서비스된.getPosition().xPosition; dy += 서비스된.getPosition().이포지션; 서비스된.설정위치(새로운 포지션(dx, dy)); } } // 서비스 클래스가 구현해야 할 사항을 지정하는 인터페이스 // 하인이 서비스한다. 공중의 접점 가동성 { 공중의 공허하게 하다 설정위치(포지션 p); 공중의 포지션 getPosition(); } // 기하급수 중 하나 공중의 계급 삼각형 기구들 가동성 { // 일부 캔버스에 기하학적 물체의 위치 사유의 포지션 p; // 기하학적 객체의 위치를 설정하는 방법 공중의 공허하게 하다 설정위치(포지션 p) { 이.p = p; } // 기하학적 객체의 위치를 반환하는 방법 공중의 포지션 getPosition() { 돌아오다 이.p; } } // 기하급수 중 하나 공중의 계급 타원체 기구들 가동성 { // 일부 캔버스에 기하학적 물체의 위치 사유의 포지션 p; // 기하학적 객체의 위치를 설정하는 방법 공중의 공허하게 하다 설정위치(포지션 p) { 이.p = p; } // 기하학적 객체의 위치를 반환하는 방법 공중의 포지션 getPosition() { 돌아오다 이.p; } } // 기하급수 중 하나 공중의 계급 직사각형 기구들 가동성 { // 일부 캔버스에 기하학적 물체의 위치 사유의 포지션 p; // 기하학적 객체의 위치를 설정하는 방법 공중의 공허하게 하다 설정위치(포지션 p) { 이.p = p; } // 기하학적 객체의 위치를 반환하는 방법 공중의 포지션 getPosition() { 돌아오다 이.p; } } // 포지션에 대한 매우 간단한 용기 클래스. 공중의 계급 포지션 { 공중의 인트로 xPosition; 공중의 인트로 이포지션; 공중의 포지션(인트로 dx, 인트로 dy) { xPosition = dx; 이포지션 = dy; } }
유사한 설계 패턴: 명령어
설계 패턴 명령어와 하인은 매우 유사하며 구현이 사실상 동일한 경우가 많다.그들 사이의 차이점은 그 문제에 대한 접근법이다.
- 서번트 패턴의 경우 몇 가지 기능을 제공하고자 하는 객체가 있다.우리는 해당 기능을 제공하고 서비스 객체가 구현해야 하는 인터페이스를 정의하는 클래스를 만든다.그런 다음 서비스된 인스턴스는 하인에게 매개 변수로 전달된다.
- 명령 패턴의 경우 일부 기능을 사용하여 수정하려는 개체가 있다.그래서 우리는 원하는 기능성을 구현해야 하는 명령을 내리는 인터페이스를 정의한다.그런 명령의 인스턴스는 그 방법의 매개변수로 원래 객체에 전달된다.
비록 디자인 패턴이 비슷하다고 해서 항상 그런 것은 아니다.설계 패턴 커맨드의 사용이 설계 패턴 서번트와 관련이 없는 여러 상황이 있다.이러한 상황에서 우리는 보통 다른 방법을 참조하는 것으로만 불리는 방법들로 넘어가야 하는데, 그것은 목표를 달성하는데 필요할 것이다.여러 언어로 된 방법에 대한 참조를 전달할 수 없기 때문에, 우리는 전달된 방법의 서명을 선언하는 인터페이스를 구현하는 객체를 통과해야 한다.
참고 항목
자원.
Pecinovský, Rudolf; Jarmila Pavlíčková; Luboš Pavlíček (June 2006). Let's Modify the Objects First Approach into Design Patterns First (PDF). Eleventh Annual Conference on Innovation and Technology in Computer Science Education, University of Bologna.