设计模式之——策略模式

策略模式(Strategy)

定义

策略(Strategy)模式的定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

应用情景

        在我们开发过程中肯定会遇到使用一个算法时可能要引入或返回不同的类型,若使用if...else则会使代码看起来繁琐多余。那么就可以通过将这些算法封装成一个一个的类,使其可以根据需要任意地替换。

只看理论比较难理解,我通过java程序来举例子:

public class Main {
    public static void main(String[] args) {
        int[] a = {5, 7, 3, 1};
        Strategy sorter = new Strategy();
        sorter.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

//排序算法
class Strategy{
    public void sort(int[] a) {
        for (int i = 0; i < a.length-1; i++) {
            int index = i;
            for (int j = i+1; j < a.length; j++) {
                index = a[j] < a[index] ? j : index;
            }
            int temp = a[i];
            a[i] = a[index];
            a[index] = temp;
        }
    }
}

        比如我们通过上面的程序可以对int数组进行排序,若是想让这个程序也能对double类型的数组进行排序,我们就需要在Sorter类中在重写一个sort(double[] a)方法并将参数类型换成double。若想比较其他类型以此类推,使用户可以根据自己的需要来使用。这就是一种简单的策略模式。

使用comparable优化

通过上面的举例可以看出,这样封装一系列的算法会使代码繁杂多余,那么这里就可以用到Comparable类型进行比较,减少代码量。
关于comparable的用法参考javase官方文档。

我们把参数类型改成Comparable类型,判断使用compareTo()方法,对排序代码优化:

class Strategy {
    public void sort(Comparable[] a) {
        for (int i = 0; i < a.length-1; i++) {
            int index = i;
            for (int j = i+1; j < a.length; j++) {
                index = a[j].compareTo(a[index]) == -1 ? j : index;
            }
            Comparable temp = a[i];
            a[i] = a[index];
            a[index] = temp;
        }
    }
}

        因为Comparable只会根据<、=、>返回结果-1、0、1,排序方法只需要根据比较结果来进行判断,所有就不需要根据用户想使用的类型来更改参数。

策略模式结构

策略类型结构如下:

  • 策略类中包含可能用到的不同参数类型的策略方法
  • 程序调用策略方法使用不同的参数
    策略结构

优点:

  1. 代码重复率低,易扩展。
  2. 可以将公共代码写入父类,子类重写策略来提高代码灵活性。
  3. 遵循开闭原则

最近清明放假没更新学习文章,主要是因为生病了要做个小手术,再加上身在外地想回家看看了。大家要多注意身体啊,,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值