StrategyPattern

ApplicationContextAwareを使わないStrategyPatternの実装例。
もとねた:http://seasarproject.g.hatena.ne.jp/abhrsh/comment?date=20040822

ストラテジ


public interface Strategy {
public String getMessage();
}

ストラテジの実装クラス


@Component
public class StrategyImpl1 implements Strategy{
public String getMessage() {
return "1";
}
}

ストラテジのファクトリー


@Component
public class StrategyFactory {

@Autowired
//Stragetyを実装したすべてのbeanがmapに登録される
private Map map = new HashMap();

public Strategy get(String key){
return map.get(key);
}
}

ストラテジを使用するサービスクラス


@Component
public class Service {

@Autowired
private StrategyFactory factory;

public void execute(String key){
System.out.println(factory.get(key).getMessage());
}

public static void main(String args[]) throws Exception{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("SpringHelloWorld.xml");
Service service = context.getBean(Service.class);
service.execute("strategyImpl1");
service.execute("strategyImpl2");
service.execute("strategyImpl3");
}
}

うーん。ここまでしてApplicationContextAwareを避けるかなぁ…。ちなみにmapに登録する際に@Qualifierで複数の名前を指定はできなかったですね。ストラテジ使うのにすら悩むと実用できないので、ノウハウメモまで。