策略模式

来源:互联网 发布:php 源码 owncloud 编辑:程序博客网 时间:2024/04/30 13:59

什么叫策略模式?

策略模式定义了算法族,分别封装起来,让他们之间互相替换,此模式让算法的变化独立于使用算法的客户。

策略模式原则:

1.找出应用可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2.针对接口编程,而不是针对实现编程。
3.多用组合,少用继承。


例如:第一个一个小游戏,游戏角色:国王、巫师、刺客、卫兵,游戏兵器:刀,剑,匕首,法杖,弓箭,每个角色只能使用一种武器,但是战斗过程中可以切换其它武器。


策略模式定义中的算法族就是我们游戏中使用的兵器,我们现在需要做的就是将所有的兵器封装起来,兵器(算法)的使用者即游戏的角色(客户)


如何封装算法族?


根据设计模式:定一个一个兵器(WeaponsBehavivor)接口,所有的兵器实现兵器接口,并且兵器有一个方法useWeapons;


public interface WeaponBehavivor {
/**
* 使用兵器
*/
public void userWeapons();
}

然后所有的武器实现兵器接口

/**
 *剑
 */
public class SwordBehavivor implements WeaponBehavivor {


@Override
public void userWeapons() {
System.out.println("宝剑砍他");
}


}

/**
 *匕首
 */
public class KnifeWeaponimplements WeaponBehavivor {


@Override
public void userWeapons() {
System.out.println("匕首刺他");
}


}

....其它的武器实现省略

这样我们就实现好了我们的兵器(算法族)


接下来封装好给我们的客户使用


定一个一个超类Person,这是一个抽象类,Person类有一个方法,打架方法fight。为什么是抽象类呢,因为人是一个比较抽象的,并没有具体指定是那个人,可以是男人、女人、人妖...

public abstract class Person{

WeaponBehavivor weaponBehavivor;

//封装兵器,把算法封装给客户,具体如何使用,客户自己选择
public void setWeaponBehavivor(WeaponBehavivor weaponBehavivor) {
this.weaponBehavivor = weaponBehavivor;
}

/**
* 打架的方法
*/
public void fight(){

//调用兵器
weaponBehavivor.userWeapon();
}
}


接下来我们写个小小的demo来运行一下我们的策略模式:


public class Test{
public static void main(String[] args) {
Person king = new King();

king.setWeaponBehavivor(newSwordBehavivor());//选择宝剑做武器

    king.fight();//打架

    //宝剑打不过,我要换武器了

    king.setWeaponBehavivor(new KnifeWeapon());

    //...其它的省略了

}
}













0 0
原创粉丝点击