2009-08-07 5 views
0

디자인 패턴을 연구하지는 않았지만 할 일이 하나 있다고 생각합니다. 몇 가지 나무를 통해 다른 알고리즘 세트를 실행 중입니다. 갑자기 나는 이제 위의 각 알고리즘을 하나의 두 가지 버전이 필요하고, 두 번째는 전처리 최초의 나무가 변형입니다, 그러나디자인 패턴을 찾고

public interface DistanceMetric { 
    public double distance(AbstractTree<String> t1, AbstractTree<String> t2); 
} 

public class concreteDistanceAlgorithmV1 implements DistanceMetric{ 

    public double distance(AbstractTree<String> t1, AbstractTree<String> t2){ 
     // algorithm methods 
     return distance; 
    } 
} 

:

public interface DistanceMetricType2 { 
    public double distance(AbstractTree<String> t); 
} 

public class concreteDistanceAlgorithmV2 implements DistanceMetricType2{ 

    private Object transformation1; 

    public concreteDistanceAlgorithmV2(AbstractTree<String> t1){ 
     transformation1 = process(t1); 
    } 

    public double distance(AbstractTree<String> t2){ 

     Object transformation2 = process(t2); 
     //algorithm involving both transformations 
     return distance; 
    } 
} 

이 있어야합니다을 그들은 모두 인터페이스를 구현 모든 알고리즘에 대해 두 클래스를 만드는 것보다 나은 방법은 무엇입니까? 이것은 전략 패턴 또는 이와 유사한 용도로 사용됩니까? 어떻게하면 좋은 디자인 원칙을 더 잘 활용할 수 있을까요?

+0

사이드 노트 : 메소드는 추상 클래스 (AbstractTree) 대신 인터페이스를 사용해야합니다. –

+0

반드시 필요한 것은 아니지만, 좋은 생각 일 수 있습니다. 그의 모든 나무가 AbstractTree에서 물려 받으면 효과가있을 수 있습니다. –

답변

3

런타임에 알고리즘을 선택해야하는 경우 strategy pattern을 확인하십시오. 전략 패턴은 모든 알고리즘이 구현하는 인터페이스를 제공합니다. 그런 다음 적절한 알고리즘을 인스턴스화하고 execute() 메소드를 호출 할 수 있습니다.

알고리즘의 일부를 변경해야하는 경우 template method pattern을 확인하십시오. 템플릿 방법에서 알고리즘을 수정하면 동일한 방법을 사용하여 동일한 목표를 달성 할 수 있습니다. 이것은 일반적으로 상속 된 추상 클래스를 가짐으로써 수행됩니다.

0

나는 네가 옳다고 생각하는데, 이것은 전략 패턴을 사용하기에 좋은 시간이다.

관련 문제