首先让我们看看它的官方定义:定义了算法族,分别封装起来,让他们之间可以相互替换,策略模式让算法的变化独立于使用算法的客户端。
稍微解释一下定义中的一些名词,一组行为被称为一族算法,多组行为就被称为算法族,对于这一组的行为它们之间可以相互替换。
我们因为需要解决一些问题而进行学习所以下面先介绍一下策略模式有什么用?
使用策略模式我们可以在运行期动态的改变对象的行为。这是有用的请想象一下,当你在游戏中切换人物所用的武器的时候其实就是一个典型的策略模式
下面我们通过一段简单的代码来实现一个切换武器的策略模式
武器的接口
public interface Weapon { public void fight(); }
武器接口实现
public class Knife implements Weapon { @Override public void fight() { System.out.println("Fight with Knife"); } }
public class Sword implements Weapon{ @Override public void fight() { System.out.println("Fight with Sword"); } }
人物类
public class Character { private Weapon weapon; public Character(){ weapon = new Knife(); } public void setWeapon(Weapon weapon) { this.weapon = weapon; } public void performFight(){ weapon.fight(); } }
测试类
public class Main { public static void main(String[] args) { Character character = new Character(); character.performFight(); character.setWeapon(new Sword()); character.performFight(); } }
Idea的输出结果
由输出可以看出人物的行为在运行期被改变了,这就是策略模式的用处之一,并且以后如果我们有更多的武器种类也不需要修改Character类,只需要让新的武器种类实现武器接口,再将通过setWeapon(新武器的对象)的方法就能够将新的武器赋予人物了。也就是说人物类将与武器有关的行为委托给了Weapon接口。所以策略模式也是通过面向接口编程实现的。
为了帮助各位理解我将小例子中的各个对象与定义中的名词进行一下对应
Sword类和Knife类就是一族算法,它们之间可以相互替换,客户端对应的就是Character,即使需要使用新的算法(也就是实现了Weapon接口的类)也不需要修改客户端的代码,这样算法的变化就独立于客户端了。
感谢你的观看,有什么建议或者发现我有什么错误或者有什么想说的话,请评论吧