2017-03-02 1 views
0
플레이의 클래스의

목록
SomeStrategyInterface - 전략 패턴 인터페이스
FooStrategy-SomeStrategyInterface의 구현은 는 BarStrategy
-SomeStrategyInterface의 구현은 는 BazStrategy
-SomeStrategyInterface
StrategyProvider의 구현 - 팩토리 클래스가 제공하는 SomeStrategyInterface MessageDispatcher - 메시지 유형의 작업자 스레드에 메시지를 디스패치하는 클래스
ABTask -> 이제정적 레지스트리 클래스 봄에

public class ABTask implements Runnable{ 

    public ABTask(StrategyProvider provider){ 
     this.provider = provider 
    } 

    public void run(){ 
    //need to use StrategyProvider here 
    } 
} 


public class MessageDispatcher{ 
    private final StrategyProvider provider; 
     public void handleMsg(){ 
     //I don't want to pass provider from here 
     new ABTask(provider) 
    } 
} 

StrategyProvider.get() 내가해야 할 것이다 StrategyProvider에 액세스 할 수 ->new ABTask() - 구체적인 메시지 유형을 처리하고 필요 작업자 클래스의 유형은 StrategyProvider

흐름은
MessageDispatcher입니다 Spring Dependency Injection을 사용하고 있으므로 해당 인스턴스를 MessageDispatcher에서 ABTask으로 전달하십시오. 이 작업을 수행하면 MessageDispatcher 클래스에 노이즈가 추가됩니다.

public void run(){ 
    StrategyProvider.get(args) 
} 

MessageDispatcher 클래스를 변경하는 것이 좋습니다하지 마십시오 : 그래서 궁금해서 다음과 같이 내가 ABTask에서 사용할 수 있도록 정적으로 제공 방법을 정적이 공급자에 액세스, 심지어 노출 할 수있는 방법이있다. 다른 아이디어도 환영합니다. 스프링 접근법 아래 빈이 autowiring을 통해 얻는 또 다른 빈에서의 StrategyProvider 인스턴스

@Component 
public class StrategyFactory { 

    private static StrategyProvider strategyProvider; 

    @Autowired 
    private StrategyProvider provider; 

    @PostConstruct 
    public void init() { 
     StrategyFactory.strategyProvider = provider; 
    } 

    public static StrategyProvider getStrategyProvider() { 
     return strategyProvider; 
    } 
} 

작동 일부 정적 메소드를 제공해야 관리로

+0

hmmm "MessageDispatcher'가'Strategy'에 의존하면'MessageDispatcher' 클래스에 잡음을 추가하고 있습니다. 그렇다면 우리는이 클래스에 주입되어야하는 의존성이 있습니다. 그래서 나는 아무런 잡음도 보지 않습니다. – niceman

+0

@niceman'MessageDispacther'는'Strategy'에 의존하지 않고,'ABTask'는 그것을 필요로합니다. – Sikorski

+0

사실, '전략'을 'ABTask'생성자에 전달할 수 없습니까? 또는'ABTask'가 런타임에'Strategy'를 바꾸길 원합니까? – niceman

답변

0

StrategyProvider 가정. 이상이 정적 메서드는 그러나 잡았다 여기서주의

public void run() { 
    StrategyFactory.getStrategyProvider().get(args) 
} 

아래로 ABTask에서 사용할 수 봄이 심한 NullPointerException가 발생 될 것이다 애플리케이션 컨텍스트 '초기화 완료되기 전에 정적 메소드 StrategyFactory.getStrategyProvider()가 불려 갔을 경우.

+0

나는이 길로 내려가는 것을 피하기를 희망했다. 만들 수있는 봄에 등록기의 어떤 생각이 없습니까? – Sikorski

+0

불행히도 아무도 (* 적어도 나는 *를 알지 못합니다) –

관련 문제