4
나는 여러 비디오를 받고, 특정 페이지에 표시해야하는 응용 프로그램과 함께 일하고 있어요

, 현재이 동영상은, 때문에 다른 공급자를 허용하지 않는 구현, YouTube에서 할 수 있습니다 미리보기 이미지와 같은 비디오 데이터는 비디오를 표시하는보기 도우미에 직접 배치되었습니다.전략 패턴의 좋은 활용 사례입니까? 코드가를 얻을 수 있기 때문에

Vimeo와 같은 새 공급자를 쉽게 추가 할 수 있도록이 구조를 변경하고 싶습니다. 전략 패턴이 이상적이라고 생각합니다. 내보기 도우미의 메서드 setVideoUrl(string $url)에이 메서드가 호출됩니다. class VideoProviderFactory에서 방법 getProviderStrategy(string $url)은,이 팩토리 클래스는 다음 경우 사용할 수, 반환, 비디오 URL의 공급자의 interface VideoProvider를 구현하는 전략 클래스.

당신은 어떻게 생각하십니까? 이게 맞습니까? 나는 뭔가를 바꿀 필요가 있니?

세부 사항 : 처음에는 전략을 직접보기 도우미로 선택하는 것에 대해 생각했지만이 질문을 읽은 후 : Strategy Pattern with no 'switch' statements? 나는 내가 틀렸다는 것을 알았고 class VideoProviderFactory이 나타났습니다. 책임의 적절한 분리와 함께, 아주 좋은 디자인과 같은

답변

5

.

생각해 볼 음식을 더 제공하려면 만드는 방법을 결정하는 것이 좋습니다. 나중에 다른 전략을 추가하려면 무엇을 변경해야합니까? 첫째, 새 VideoProvider을 만들 것입니다, 당신은 (당신이 설명한대로) 공장 switch 문을 변경해야 할이 새로운 전략의 선택 로직을 포함 할 것입니다. 이제는 대부분의 경우 완벽하게 괜찮습니다. 그러나 공장을 변경하지 않고 새로운 전략을 추가하고 싶다면 어떻게해야할까요?

한 가지 방법은 특정 VideoProvider을 작성해야하는 경우 URL에 따라 것을 결정한다 방법과 공장 같은 인터페이스를 가지고있다; 이제 VideoProviderMatcher (의사 코드)를 호출하자 : 그것은 URL도 어떻게에 관한 VideoProvider을 만드는 방법을 이해하면

interface VideoProviderMatcher { 
    bool understands(url) 
    VideoProvider create() 
} 

자,이 인터페이스는 알고있다. 새로운 전략을 만들어야하는 경우 VideoProvider과 관련하여 VideoProviderMatcher을 구현합니다. 공장에 관해서는, 책임 (의사 코드)의 체인을 사용해, 지정된 URL을 이해하는 첫 번째에 VideoProviderMatcher들과 대리자의 목록을 캡슐화 변경 : 이제 유일한 코드를

class VideoProviderFactory { 
    List[VideoProviderMatcher] matchers 
    void registerMatcher(VideoProviderMatcher matcher) { 
    matchers.add(matcher) 
    } 
    VideoProvider getVideoProviderFor(url) { 
    foreach (matcher in matchers) { 
     if (matcher.understands(url)) return matcher.create() 
    } 
    } 
} 

을 그 변경해야하는 것은 처음부터 공장을 만드는 코드입니다. 이상적으로 팩토리를 채우는 데 사용하는 VideoProviderMatcher의 목록이 있으며 목록에 다른 항목을 추가하면됩니다.

이제

,이 가치가있다? 나는 그것이 매칭 논리의 복잡성, 비디오 제공자와 함께 일치하는 URL을 캡슐화하려는 의지, 새로운 전략이 추가 될 때 공장을 안정적으로 유지하고자하는 의지 및 새로운 전략이 추가되는 속도에 달려 있다고 말한다. 해결책.

+0

좋습니다. 이해할 수없는 유일한 이유는 중간 VideoProviderMatcher 인터페이스가 필요한 이유입니다. 해당 기능을 VideoProvider 클래스의 일부로 구현할 수 없습니까? – hennes

+0

@hennes IMO, VideoProviderMatcher는 더 추상적 인 URL을 이해합니다.matcher는 기본적으로 url/도메인의 도메인/부분과 같은 다양한 조건에서 URL을 필터링하도록 구현을 허용 할 수 있습니다. – Nrj

+0

좋습니다. 명확히 해 주셔서 감사합니다. – hennes

관련 문제