设计模式

策略模式

2018-08-10  本文已影响5人  低调_0c1d

也许有人觉得我在装B,但是我可以拍着良心说,读某一知识领域的文章,还是英文版更适合我,比如如下的这一篇:
http://dongchuan.github.io/design%20pattern/2015/09/03/Strategy.html
为了review我读懂的内容,我只能把它翻译出来,感觉这是一种病,如果有人知道怎样治,请给我留言,多谢!

策略模式

策略模式允许在运行时进行算法行为的选择。它定义了一组算法,然后将这些算法以对象(或是说是一种测略)的方式实现,并且使它们表现出某种个性的行为。

试想一下当想外出的时候,你可以选择公交或者打车,设置可以选择先公交后骑自行车。策略模式就是适用于运行过程中你选择不同的策略的情况。

事实上,我们可以通过“if...else”来实现它,但是这也会产生如下的问题:

  1. 当你想增加一种新的策略的时候,你需要在客户端修改代码,就会增加一个新的“else”语句
  2. 太多的“if...else”语句导致代码不好维护

因此,策略模式帮你能够添加和选择一种新的策略。

使用策略模式的时机

  1. 如果你的系统中有很多的类,而他们的区别仅仅是他们的行为,那么,使用策略模式将能够允许动态的选择行为。
  2. 如果你的系统需要从一组算法冲动态选择的其中之一。
  3. 如果发现自己的代码中“if...else”过多,那么就需要考虑是否可以使用策略模式了(此条是笔者自己的理解)

策略模式的结构

  1. 策略接口:策略接口用于定义一组具体策略的标准,上下文(Context)通过这个接口来调用具体策略。
  2. 具体策略:具体策略实现了策略接口
  3. 上下文(Context):上下文有策略接口的引用,并且将策略本身与策略使用进行隔离。客户端通过上下文来添加或改变策略,并且客户端可以在不影响上下文的基础上替换具体策略,

更进一步讲,上下文接收客户端的请求并且这些请求委托个具体的策略对象进行处理。通常具体策略是由客户端创建并且传递给上下文。从这一点讲,客户端只与上下文交互。这样,一个新的策略不会对客户端产生太多影响,客户端只需要知道那些策略已经存在了就可以了。

示例

假设你想对一些东西进行排序,那么你可以选择如下的策略

  1. Bubble Sort(冒泡)
  2. Insertion Sort(插入)
  3. Selection Sort(选择)

定义策略接口

public interface Sort{
    public abstract int[] sort(int arr[]);
}

定义具体策略

public class BubbleSort implements Sort{
    public int[] sort(int arr[]){
        // Bubble Sort
        return arr;
    }
}

public class InsertionSort implements Sort {
    public int[] sort(int arr[]) {
        // Insertion Sort
        return arr;
    }
}

public class SelectionSort implements Sort {
    public int[] sort(int arr[]) {
        // Selection Sort
        return arr;
    }
}

定义上下文

public class Handler
{
    private Sort sortObj;

    public int[] sort(int arr[])
    {
        sortObj.sort(arr);
        return arr;
    }

    public void setSortObj(Sort sortObj) {
        this.sortObj = sortObj;
    }
}

测试验证

public class Client {

    public static void main(String args[]) {

        int arr[] = {1,4,6,2,5,3,7,10,9};
        int result[];
        Handler handler = new Handler();

        // Choose strategy selectionSort
        handler.setSortObj(new SelectionSort());
        result=ah.sort(arr);

        for(int i=0;i<result.length;i++) {
            System.out.print(result[i] + ",");
        }

        // Choose strategy insertionSort
        handler.setSortObj(new InsertionSort());
        result=ah.sort(arr);

        for(int i=0;i<result.length;i++) {
            System.out.print(result[i] + ",");
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读