策略模式官方定义为,一个类的行为或其算法可以在运行时更改,读起来意思很模糊,也很难理解。下面我们就一步一步写代码来实现策略模式。
首先我们来写一个简单的算法吧,这里就写了一个冒泡排序,相信大家都能看懂,不做赘述,然后注意这里的sort方法参数是一个int类型的数组,那我们调用这个方法进行排序时,参数就只能传一个int类型的数组,如果我们想传一个long类型的数组呢?double类型的呢?无疑就需要再写一个参数相应类型的方法。那如果我们想要对比一个类嗯,比如猫类,狗类。
这里我是写了一个compareTo的方法去对某个属性做了比较,那么我们sort方法的参数就需要用这个类做参数。那我不同的类,sort方法都要重新去写一遍吗?当然不需要,
我们想要sort方法不管什么类型的参数都能去接收,我们写一个接口类comparable,里面定义一个方法compareTo,参数为T,泛型不需要多做解释吧。然后猫狗类实现comparable,然后实现compareTo方法。
这样sort方法参数类型写comparable就可以了,不需要再改了。是不是觉得世界变美好了。
当然上面的这些并不是策略模式,这只是顺带讲一下comparable,哈哈,下面的comparator的实现才是策略模式。接着上面的来讲,如果我想猫的比较大小的策略可以灵活的指定,就是说我想通过身高来比较猫的大小,不通过体重了。有人会说重新写一遍compareTo里面的判断,这肯定不符合我们的风格,开闭原则大家都还记得吧,对修改关闭,对拓展开放。尽量不去修改原来的代码,那我们怎么来拓展呢?很简单,sort方法传两个参数,一个数组,一个策略,这样不就可以了。
这里我是直接给他sortor类加了泛型,然后我们来新建一个comparator接口,里面定义一个compare方法。
我们给dog类写一个策略类,实现comparator接口,然后实现compare方法,那么猫的策略类同理
这样拓展性就有了,这就是一个简单的策略模式的demo,我上面定义的类和方法其实都是jdk中的,当然我只是写了其中就简单的方法,想深入了解的可以自己去看看学习一下。