전략 패턴의 컨텍스트 클래스


10

나는 전략 패턴 을 이해하려고 노력 하고 있습니다. 컨텍스트 클래스는 패턴의 목적을 훼손하지 않고 제거해야합니까?

다른 유형의 파일을 읽기 위해 일종의 스위치가 필요하다는 인상을 받았지만 무언가를 해킹하고 나중에 리팩토링을 처리하고 싶지는 않았습니다 (물론 항상 코드를 리팩터링 할 수는 있지만 아이디어는 다음과 같습니다. 사전에 디자인에서 가능한 한 똑똑해야합니다 ...) :

여기에 이미지 설명을 입력하십시오

wikimedia 에서 가져온 이미지

클라이언트가 Strategy 인터페이스에 직접 위임 할 수 있습니까? 아니면 컨텍스트 클래스에 대해 이해하지 못한 것이 있습니까?

interface Reader {
    // read information from file and fill data list field of Client
    readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}

class Client{
    // strategic choice
    Reader r;

    // data list field
    List<Data> data;

    // Client Constructor
    public Client(){
        if(<file ends in .xls>)
            r = new ExcelReader();
        else
            r = new PdfReader();
        r.readFile();
    }
}

따라서 위에서 설명한 컨텍스트 클래스가 없습니다. 코드가 전략 패턴을 준수합니까?


1
흥미롭고 중요한 또 다른 요점으로, 기능 언어로 된 유형 클래스의 개념은 en.wikipedia.org/wiki/Kind_(type_theory) 종류의 전략 패턴과 "간단하게"있다는 점에 주목하고 싶습니다 . 둘 다 임시 다형성에 대한 구현 메커니즘 일뿐입니다.
AndreasScheinert

이것이 Java 8 Project Lambda와 관련이 있습니까? Wikipedia 기사는 한 번에 이해하기에는 너무 조밀하지만 Java (또는 일반적으로 프로그래밍)의 향후 기능을 효율적으로 사용하기위한 이론적 배경의 일부인 경우 더 많은 시간을 투자 할 것입니다.
panny

1
아주 멀지 만 나는 타입 클래스가 필요하다고 주장합니다. 더 높은 종류를 지원하는 프로그래밍 언어. 스칼라와 하스켈도 마찬가지입니다. 여기서 요점은 (임시) 다형성이 다르게 구현되었다는 것입니다. 물러 서면 일반적으로 다형성에 대한 통찰력을 얻을 수 있습니다.
AndreasScheinert

답변:


13

예제에서 코드 호출 readFile은 클라이언트 생성자의 일부입니다. 그 방법은 당신이 찾고있는 "문맥"입니다 . 전략 패턴에는 문자 그대로 "컨텍스트 클래스"가 필요하지 않으며 코드의 첫 번째 버전에서 전략 오브젝트 (이 경우 "리더")는 로컬 변수에만있을 수 있습니다. 특히 "전략적 방법"( "readFile")이 하나만 호출 될 때.

그러나 코드베이스가 한 버전에서 다음 버전으로 확장되는 경우 점점 더 "전략적"메소드를 호출 할 가능성이 거의 없으며 적용 할 전략과 "전략적 방법"의 수행시기가 다른 시점에 발생합니다. 코드의 다른 곳에서. 따라서 논리를 한 곳에 유지하기 위해 리팩터링을 시작합니다. 이것은 질문의 다이어그램과 유사한 구현으로 간단하게 이어질 것입니다.


5

확실히. 패턴은 단지 지침 일뿐입니다. 여전히 당면한 문제에 맞게 올바르게 적용하고 적용해야합니다. 개인적으로, 나는 런타임에 전략을 설정하는 것을 거의 허용하지 않는다. 더 자주 그것은 건설에 지정되거나 공장에서 회전합니다.

setStrategy개인용 이라고 주장 할 수도 있지만 주입은 그림과 같이 패턴을 사용하고 있습니다.


패턴을 손상시키지 않고 컨텍스트 클래스를 생략 할 수 있습니까? 또는 다른 방법으로 말하면, 내 클라이언트 클래스 묘사 된 컨텍스트 클래스 일 때 괜찮 습니까?
panny

6
@panny-나는 당신이 대답의 요점을 놓쳤다는 것을 나타 내기 때문에 질문에 대답하기를 주저합니다. 전략 패턴을 사용하면 인터페이스 뒤에 다른 구체적인 구현을 제공하여 동작을 다양화할 수 있습니다. 그것은이다 개념 이 아닌 공식 .
Telastyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.