+2 امتیاز
قبل در برنامه نویسی توسط (130 امتیاز)
ویرایش شده قبل توسط

چگونه میتوان الگوی طراحی استراتژی (Strategy) رو در اپلیکیشنی که از beanهای  Spring استفاده میکنه، پیاده سازی کرد؟

1 پاسخ

+2 امتیاز
قبل توسط (1.4هزار امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

مشکل اینجاست که در الگوهایی مانند استراتژی و حالت (State) شما باید بر اساس نیازِ کاربر (هر بار) از یکی از پیاده سازی های یک واسط (interface) استفاده کنید؛ بنابراین در config های spring نمی توانید از همان ابتدا مشخص کنید که چه پیاده سازیی مدنظر است.

باید دو کار انجام دهید:

  1. دسترسی به bean های تعریف شده با استفاده از  واسط BeanFactoryAware (که کلاس Context تان باید آن را پیاده سازی (implements) کند) و  کلاس BeanFactory (به عنوان فیلد در داخل کلاس Context تان باید تعریف شود). دقت شود که با پیاده سازی واسط BeanFactoryAware، به طور خودکار، BeanFactory نیز در کلاس Context تان inject می شود.
  2. یک Enum برای قرار دادن نوع های مختلف پیاده سازی تعریف کنید که فیلدی به نام beanName (نام bean متناظر با آن پیاده سازی) داشته باشد. 

مثال (مرتب سازی آرایه با الگوریتم های مختلف):

تعریف bean های spring ای:

<bean id="sortContext" class="x.y.z.SortContext">
</bean>
	
<bean id="bubbleSort" class="x.y.z.BubbleSort">
</bean>

<bean id="insertionSort" class="x.y.z.InsertionSort">
</bean>

<bean id="quickSort" class="x.y.z.QuickSort">
</bean>

واسط و کلاس های پیاده سازی کننده آن:

interface SortStrategy
{
	void sort(Double[] array, boolean reverse);
}

class BubbleSort implements SortStrategy
{
	@Override
	public void sort(Double[] array, boolean reverse)
	{
		// TODO bubble-sort implementation
	}
}

class InsertionSort implements SortStrategy
{
	@Override
	public void sort(Double[] array, boolean reverse)
	{
		// TODO insertion-sort implementation
	}
}

class QuickSort implements SortStrategy
{
	@Override
	public void sort(Double[] array, boolean reverse)
	{
		// TODO quick-sort implementation
	}
}

تعریف Enum برای bean ها:

enum SortType
{
	BUBBLE_SORT("bubbleSort"),
	INSERTION_SORT("insertionSort"),
	QUICK_SORT("quickSort");
	
	private String beanName;
	
	private SortType(String beanName)
	{
		this.beanName = beanName;
	}

	public String getBeanName()
	{
		return beanName;
	}
}

تعریف کلاس Context:

public class SortContext implements BeanFactoryAware
{
	private BeanFactory beanFactory;
	
	public void sort(Double[] array, boolean reverse, SortType sortType)
	{
		SortStrategy sortStrategy = beanFactory.getBean(sortType.getBeanName(),SortStrategy.class);
		sortStrategy.sort(array,reverse);
	}
	
	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException
	{
		this.beanFactory = beanFactory;
	}
}

 

سوالات مشابه

+1 امتیاز
1 پاسخ 519 بازدید
0 امتیاز
1 پاسخ 482 بازدید
+1 امتیاز
1 پاسخ 1.5هزار بازدید
+1 امتیاز
1 پاسخ 659 بازدید
+1 امتیاز
1 پاسخ 532 بازدید
+2 امتیاز
2 پاسخ 805 بازدید
0 امتیاز
0 پاسخ 304 بازدید
...