2017-12-19 9 views
-1

Transformer 및 TransformerB의 기본 구현을 포함하는 타사 라이브러리가 있다고 가정합니다. 제 3 자 라이브러리와 관련된 변압기의 설계 패턴

public TransformerNew[] process(Transformer[] transformers) { 
} 

을 내가 instanceof를 또는 명시 적 형식없이이를 수있는 방법 :

가 나는 기능을 다음과 작성해야 TransformerNew

public class TransformerAConverter { 
    public TransformerNew convert(TransformerA transformerA) { 
    // conversion logic 
    } 
} 

public class TransformerBConverter { 
    public TransformerNew convert(TransformerB transformerB) { 
    // conversion logic 
    } 
} 

말 TransformerA 및 TransformerB 클래스를 출력하기위한 병렬 클래스를 작성해야 주조. 방문자 패턴을 사용해 보았지만 표현할 수는 없었습니다.

+0

'instanceof'의 문제점은 무엇입니까? – dur

+0

_conversion logic_은 정확히 무엇을 의미합니까? [This] (https://stackoverflow.com/questions/350404/how-do-the-proxy-decorator-adapter-and-bridge-patterns-differ/350471#350471) 도움이 될 수 있습니다. –

+0

@dur : 10-15 개의 변압기가있을 수 있으므로 많은 instanceof를 사용하고 싶지 않습니다. –

답변

0

여기에 Strategy 패턴을 사용하시기 바랍니다. 2 개의 변압기는 변압기 strategy입니다. 이렇게 코드를 구성 할 수 있습니다. Visitor은 탐색 논리를 아래의 데이터 구조 또는 표현과 분리하는 데 사용되므로 여기에 적합하지 않습니다.

public class TransformerConverter { 
    private final Transformer transformerStrategy, 

    public TransformerConverter(Transformer strategy) { 
     this.transformerStrategy = strategy; 
    } 

    public TransformerNew convert() { 
     // use the strategy to achieve the conversion. 
    } 
} 
0

의견에서 - 외관 패턴과 같은 소리가 유용 할 수 있습니다. 다만 제 3 자 유형을 포장하고, -

public class TransformerNewA implements TransformerNew { 
    private final TransformerA a; 

    public TransformerNewA(TransformerA a) { 
     this.a = a; 
    } 

    public int getInterestingValue() { 
     return a.getSomeValue() + a.getSomeOtherValue(); 
    } 

} 

public class TransformerNewB implements TransformerNew { 
    private final TransformerB b; 

    public TransformerNewB(TransformerB b) { 
     this.b = b; 
    } 

    public int getInterestingValue() { 
     return b.getFirstPart() + b.getSecondPart(); 
    } 

} 

그래서 어떤 변환이 정말로 여기가 없습니다 :

public interface TransformerNew { 
    public int getInterestingValue(); 
} 

그런 다음 몇 가지 구현을 가지고 예를 들어,이 인터페이스를 제공 다운 스트림 사용을위한 공통의 인터페이스를 제공합니다.