java中的策略设计模式
在本教程中,我们将看到Java中的战略设计模式。
策略设计模式允许我们在运行时更改算法实现.Strategy设计模式提供多个算法和客户端可以根据其组合的帮助选择算法。
策略设计模式示例
让我们在简单的例子的帮助下了解这一点。
假设我们想要实现多个排序算法。
我们需要根据输入排序类型对列表进行排序(合并排序和快速排序)。
请注意,应提供将来添加新的排序类型。
创建一个名为"sortingtype.java"的枚举,如下所示。
package org.igi.theitroad.designpattern;
public enum SortingType {
MERGE_SORT,QUICK_SORT;
}
创建名为sortingManager的服务类如下所示:
package org.igi.theitroad.designpattern;
import java.util.List;
public class SortingManager {
List list;
public SortingManager(List list) {
super();
this.list = list;
}
public void sortListBasedOnType(SortingType sortingType)
{
System.out.println("===================================");
System.out.println("Sorting List based on Type");
System.out.println("===================================");
if("MERGE_SORT".equalsIgnoreCase(sortingType.toString()))
{
sortListUsingMergeSort();
}
else if("QUICK_SORT".equalsIgnoreCase(sortingType.toString()))
{
sortListUsingQuickSort();
}
}
private void sortListUsingMergeSort()
{
System.out.println("Sorting List using merge sort");
}
private void sortListUsingQuickSort()
{
System.out.println("Sorting List using quick sort");
}
}
创建一个名为"sortingmain.java"的主类,该类将调用sortingManager进行排序列表。
package org.igi.theitroad.designpattern;
import java.util.Arrays;
import java.util.List;
public class SortingMain {
public static void main(String[] args) {
List list = Arrays.asList(new Integer[]{44,5,3,5,5,64,3});
SortingManager sm=new SortingManager(list);
//Sorting using merge sort
sm.sortListBasedOnType(SortingType.MERGE_SORT);
System.out.println();
//Sorting using quick sort
sm.sortListBasedOnType(SortingType.QUICK_SORT);
}
}
输出:
=================================== Sorting List based on Type =================================== Sorting List using merge sort=================================== Sorting List based on Type =================================== Sorting List using quick sort
正如我们所看到的,这是一个简单的代码,它正常工作。
我们已经测试了代码,并发现我们能够根据排序类型排序列表。
现在,我们需要创建一个更多的排序类型:eacp sort.if我们注意到,我们需要更改如下:1)我们需要在枚举排序类型中进行更改。
package org.igi.theitroad.designpattern;
public enum SortingType {
MERGE_SORT,QUICK_SORT,HEAP_SORT;
}
2)我们需要在我们已经测试的SortingManager类中进行更改。
package org.igi.theitroad.designpattern;
import java.util.List;
public class SortingManager {
List list;
public SortingManager(List list) {
super();
this.list = list;
}
public void sortListBasedOnType(SortingType sortingType)
{
System.out.println("===================================");
System.out.println("Sorting List based on Type");
System.out.println("===================================");
if("MERGE_SORT".equalsIgnoreCase(sortingType.toString()))
{
sortListUsingMergeSort();
}
else if("QUICK_SORT".equalsIgnoreCase(sortingType.toString()))
{
sortListUsingQuickSort();
}
else if("HEAP_SORT".equalsIgnoreCase(sortingType.toString()))
{
sortListUsingHeapSort();
}
}
private void sortListUsingMergeSort()
{
System.out.println("Sorting List using merge sort");
}
private void sortListUsingQuickSort()
{
System.out.println("Sorting List using quick sort");
}
private void sortListUsingHeapSort()
{
System.out.println("Sorting List using heap sort");
}
}
现在,我们可以使用如下堆栈的列表排序列表。
package org.igi.theitroad.designpattern;
import java.util.Arrays;
import java.util.List;
public class SortingMain {
public static void main(String[] args) {
List list = Arrays.asList(new Integer[]{44,5,3,5,5,64,3});
SortingManager sm=new SortingManager(list);
//Sorting using merge sort
sm.sortListBasedOnType(SortingType.MERGE_SORT);
System.out.println();
//Sorting using quick sort
sm.sortListBasedOnType(SortingType.QUICK_SORT);
System.out.println();
//Sorting using heap sort
sm.sortListBasedOnType(SortingType.HEAP_SORT);
}
}
输出:
=================================== Sorting List based on Type =================================== Sorting List using merge sort=================================== Sorting List based on Type =================================== Sorting List using quick sort=================================== Sorting List based on Type =================================== Sorting List using heap sort
正如我们所看到的,我们必须在许多我们已经测试的地方修改,我们需要再次重新测试所有功能。
策略模式示例
让我们看看策略模式如何能够解决问题。
创建sortingmanager.java如下。
package org.igi.theitroad.strategy;
import java.util.List;
public class SortingManager {
SortingStrategy sortingStrategy;
List<Integer> list;
public SortingManager(List<Integer> list,SortingStrategy sortingStrategy) {
super();
this.list = list;
this.sortingStrategy=sortingStrategy;
}
public void sortList()
{
System.out.println("===================================");
System.out.println("Sorting List based on Type");
System.out.println("===================================");
sortingStrategy.sort(list);
}
public SortingStrategy getSortingStrategy() {
return sortingStrategy;
}
public void setSortingStrategy(SortingStrategy sortingStrategy) {
this.sortingStrategy = sortingStrategy;
}
public List<Integer> getList() {
return list;
}
public void setList(List<Integer> list) {
this.list = list;
}
}
创建一个名为sortingstrategy的接口,如下所示。
package org.igi.theitroad.strategy;
import java.util.List;
public interface SortingStrategy {
void sort(List<Integer> list);
}
创建名为"Mergestrategy.java"的类,用于使用Merge排序进行排序。
package org.igi.theitroad.strategy;
import java.util.List;
public class MergeSortStrategy implements SortingStrategy {
@Override
public void sort(List list)
{
System.out.println("Sorting List using merge sort");
}
}
创建名为"Quicksort Strategy.java"的类,用于使用快速排序进行排序。
package org.igi.theitroad.strategy;
import java.util.List;
public class QuickSortStrategy implements SortingStrategy {
@Override
public void sort(List list) {
System.out.println("Sorting List using quick sort");
}
}
现在让我们创建一个主类SortingMain.java。
package org.igi.theitroad.strategy;
import java.util.Arrays;
import java.util.List;
public class SortingMain {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(new Integer[]{44,5,3,5,5,64,3});
MergeSortStrategy mergeSortStrategy=new MergeSortStrategy();
SortingManager sm=new SortingManager(list,mergeSortStrategy);
sm.sortList();
System.out.println();
QuickSortStrategy quickSort=new QuickSortStrategy();
sm.setSortingStrategy(quickSort);
sm.sortList();
}
}
输出:
=================================== Sorting List based on Type =================================== Sorting List using merge sort=================================== Sorting List based on Type =================================== Sorting List using quick sort
假设我们想要使用堆排序排序。
我们需要在下面创建以下更改:创建另一个名为"heapoportstrategy.java"的类。
package org.igi.theitroad.strategy;
import java.util.List;
public class HeapSortStrategy implements SortingStrategy {
@Override
public void sort(List list) {
System.out.println("Sorting using heap sort");
}
}
更改SortingMain.java以添加调用代码。
package org.igi.theitroad.strategy;
import java.util.Arrays;
import java.util.List;
public class SortingMain {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(new Integer[]{44,5,3,5,5,64,3});
MergeSortStrategy mergeSortStrategy=new MergeSortStrategy();
SortingManager sm=new SortingManager(list,mergeSortStrategy);
sm.sortList();
System.out.println();
QuickSortStrategy quickSort=new QuickSortStrategy();
sm.setSortingStrategy(quickSort);
sm.sortList();
System.out.println();
HeapSortStrategy heapSort=new HeapSortStrategy();
sm.setSortingStrategy(heapSort);
sm.sortList();
}
}
输出:
=================================== Sorting List based on Type =================================== Sorting List using merge sort=================================== Sorting List based on Type =================================== Sorting List using quick sort=================================== Sorting List based on Type =================================== Sorting using heap sort
正如我们所看到的,我们没有制作任何已测试的SortingManager。
我们只是添加了新的"Heaporort Strategy",它使我们能够使用堆排序。

