2013-07-13 45 views
12

Nói rằng tôi đang sử dụng lò xo, tôi có các chiến lược sau ...mô hình chiến lược với đậu mùa xuân

Interface

public interface MealStrategy { 
    cook(Meat meat); 
} 

chiến lược đầu tiên

@Component 
public class BurgerStrategy implements 
MealStrategy { 
    @Autowired CookerDao cookeryDao; 

    @Override 
    public void cook(Meat meat) { 
     cookeryDao.getBurger(meat); 
    } 
} 

chiến lược Tiếp ...

@Component 
public class SausageStrategy implements 
MealStrategy { 
    @Autowired CookerDao cookeryDao; 

    @Override 
    public cook(Meat meat) { 
     return cookeryDao.getSausage(meat); 
    } 
} 

Cont ext ...

@Component 
@Scope("prototype") 
public class MealContext { 
    private MealStrategy mealStrategy; 

    public void setMealStrategy(MealStrategy strategy) { 
     this.strategy = strategy; 
    } 

    public void cookMeal(Meat meat) { 
     mealStrategy.cook; 
    } 
} 

Bây giờ nói bối cảnh này đã được truy cập thông qua một bộ điều khiển MVC, giống như ...

@Autowired 
private MealContext mealContext; 

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Something makeMeal(Meat meat) { 
    mealContext.setMealStrategy(new BurgerStrategy()) 
    mealContext.cookMeal(meat); 
} 

bối cảnh có nên là một thành phần? Khi tôi nhận được một lỗi nói loadOnStartup có một nonUniqueBean rằng chiến lược có thể được, như bạn mong đợi. Tất cả các hạt cà phê có cần phải là các thành phần như trên hoặc là chú thích của tôi không chính xác?

Truy vấn lớn nhất của tôi thực sự là bạn có thể sử dụng ngữ cảnh như vậy trong ứng dụng Spring MVC không? Vấn đề tôi có với việc sử dụng @Scope (nguyên mẫu) quá là nó có nghĩa là cookeryDao cuộc gọi trong các chiến lược trả về một con trỏ null như của Dao không nhận được tiêm.

Tôi làm cách nào để triển khai mẫu trên bằng cách sử dụng lò xo và cũng là sợi chỉ an toàn? Là những gì tôi đang cố gắng thậm chí có thể?

+0

Vấn đề chính xác của bạn là gì? tất cả điều này làm việc cho tôi – morgano

+0

Tôi muốn biết nếu đó là thread an toàn để có một bối cảnh như tôi đã làm – david99world

+0

cũng ở trên sẽ không làm việc vì như tôi đã thực hiện 'mới' này là bên ngoài bối cảnh mùa xuân? – david99world

Trả lời

16

Tôi sẽ sử dụng Injection Dependency đơn giản.

@Component("burger") 
public class BurgerStrategy implements MealStrategy { ... } 

@Component("sausage") 
public class SausageStrategy implements MealStrategy { ... } 

khiển

Lựa chọn A:

@Resource(name = "burger") 
MealStrategy burger; 

@Resource(name = "sausage") 
MealStrategy sausage; 

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Something makeMeal(Meat meat) { 
    burger.cookMeal(meat); 
} 

Lựa chọn B:

@Autowired 
BeanFactory bf; 

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Something makeMeal(Meat meat) { 
    bf.getBean("burger", MealStrategy.class).cookMeal(meat); 
} 

Bạn có thể chọn để tạo ra JSR-330 vòng thay vì tên văn bản để bắt lỗi chính tả trong biên dịch thời gian.

Xem thêm:

How to efficiently implement a strategy pattern with spring?

@Resource vs @Autowired

20

Từ một chiến lược cụ thể là rất thường được xác định tại thời gian chạy dựa trên các thông số được cung cấp hoặc lâu hơn, tôi sẽ đề nghị một cái gì đó như sau.

@Component 
public class BurgerStrategy implements MealStrategy { ... } 

@Component 
public class SausageStrategy implements MealStrategy { ... } 

Sau đó, hãy tiêm tất cả các chiến lược đó vào bản đồ và chọn chiến lược tương ứng theo yêu cầu.

@Autowired 
Map<String, MealStrategy> mealStrategies = new HashMap<>; 

@RequestMapping(method=RequestMethod.POST) 
public @ResponseBody Something makeMeal(@RequestParam(value="mealStrategyId") String mealStrategyId, Meat meat) { 
    mealStrategies.get(mealStrategyId).cook(meat); 

    ... 
} 
+1

Câu trả lời này cho phép thực hiện đúng hơn mô hình chiến lược – Cuga

Các vấn đề liên quan