设计模式学习之策略模式
定义
定义了算法族,分别封装起来,让它们可以相互替换,此模式让算法的变化独立于使用算法的用户。
策略模式的使用场景
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
2、一个系统需要动态地在几种算法中选择一种。
使用的原则:
找出应用中可能需要变化的地方,把他们独立出来,不要和那些需要变化的代码混合在一起。
针对接口编程,而不是针对实现编程,实际上是针对超类型编程,变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要具体实现此超类型的类所产生的对象,都可以指定给这个变量;这也意味着声明类时,不用理会以后执行时的真正对象类型。
策略模式的小例子
GameCharacter(角色)是抽象类,让具体的角色继承之。具体的角色
包括:国王(King)、骑士(Knight)。而Weapon(武器)是接口,让具体的武器继承之。所有实际的角色和武器都是具体类。
任何角色如果想换武器,可以调用setWeapon() 方法,此方法定义
在GameCharacter超类中。在打斗(kill)过程中,会调用到目前武
器的useWeapon() 方法,攻击其他角色。
抽象类的GameCharacter(角色)
public abstract class GameCharacter {
public String name;
private Weapon weapon;
//用于设置使用哪种兵器
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
//每种角色都会有走路的方法
public abstract void run();
//消灭敌人的方法
public void useWeapon(){
weapon.kill();
}
//角色的其他方法。。。略
}
具体的角色(骑士)类
public class Knight extends GameCharacter{
public Knight(){
super.name ="骑士";
}
@Override
public void run() {
System.out.println("奔跑");
}
}
具体的角色(国王)类
public class King extends GameCharacter{
public King(){
super.name ="国王";
}
@Override
public void run() {
System.out.println("奔跑");
}
}
武器接口
public interface Weapon {
void kill();
}
具体的武器类(斧子)
public class AxeBehavior implements Weapon{
@Override
public void kill() {
System.out.println("挥舞我的大斧头消灭敌人!");
}
}
具体武器类(弓箭)
public class BowandarrowBehavior implements Weapon{
@Override
public void kill() {
System.out.println("用弓箭射杀敌人!");
}
}
public class User {
public static void main(String[] args){
GameCharacter knight = new Knight();
//设置骑士消灭敌人的武器,用弓箭射杀
knight.setWeapon(new BowandarrowBehavior());
knight.run();
knight.useWeapon();
GameCharacter king = new King();
//设置角色国王消灭敌人的武器,斧头砍杀
king.setWeapon(new AxeBehavior());
king.run();
king.useWeapon();
}
}
参考HeadFirst设计模式。