2011-07-27 3 views
3

가정하자 나는이 다음스칼라에서 다음 관계를 어떻게 모델링합니까?

abstract class Strategy { 
    val lib: TestingLibrary = ... 
} 

가 특정 구현이 런타임시

trait LSE extends Market { 
    def getClosingTime = "16:35:00" 
} 

수 있습니다

trait Market { 
    def getClosingTime: String 
} 

에서 제공 getClosingTime을 필요로하기 때문에 전략 및 TestingLibrary 모두 내가 원하는, 추상적이다 특정 전략 및 TestingLibrary가 모두 LSE를 사용하고 있음을 지정할 수 있습니다. 즉, getClosingTime이 둘 중 하나에서 호출되면 둘 다 "16:35:00"을 반환하는 구체적 구현을 ​​가져야합니다. 나는 비슷한 것을 생각하고 있었다.

val lseStrategy = new Strategy with LSE 

가능한 경우 형질을 고수하고 싶지만 LSE와 TestingLibrary를 혼합하는 방법을 알고 싶다. 아마 내 전체의 접근 방식은 수정해야하지만, 주요 비즈니스 규칙은 다음과 같습니다

  • 전략이-A TestingLibrary
  • 전략 및 TestingLibrary 모두 getClosingTime
  • getClosingTime가 같은 구체적인 구현이 있어야 추상적 인 방법에 의존 둘 다 런타임에
  • 전략은 생성자에서 매개 변수를 사용하지 않아야합니다 (추가 확장으로 인해 특성으로 변환되어야 할 수도 있음)
  • Strategy의 사용자는 TestingL 라이브러리

당장 나는 어리둥절하게 여김에있어 다양한 옵션을 찾고 있습니다. 자바에서 나는 다음과 같은

class LSETestingLibrary extends TestingLibrary { 
     String getClosingTime {return "16:35:00"} 
} 

class Strategy { 
    TestingLibrary lib; 
    Strategy(Market market) { 
     if (market == LSE) lib = new LSETestingLibrary(); 
    } 
    String getClosingTime { return lib.getClosingTme();} 
} 

같은 짓을하지만 난 새로운 시장을 추가하기 때문에 일을하는 추한 방법은 전략

답변

4

을 재 컴파일 불필요하게 포함하는 것 "이"당신은 무엇을 찾고하는 것은 Cake Pattern이라고 찾아 . 나는 많은 질문 중 하나만 연결하고 있으며, 그것에 대해 많은 블로그를 쉽게 Google에 올릴 수 있습니다.

관련 문제