[置顶] 设计模式------策略模式

1.策略模式定义:

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

2.定义场景:

        一个动作冒险游戏,里面有多个角色,每个角色每次只能使用一种武器,但是游戏中武器是可以更换的,例如你刷出了一把魔剑拥有它可以横扫全服,此时是不是很想把他装备到自己来体验屠戮的快感呢。

[置顶] 设计模式------策略模式_第1张图片

游戏里面有各种角色,在这个尚武的王国里,人人都好战。所以每一个人物都有fight行为。打斗是需要武器的。但是武器又是多种的。尚武的王国里人人都会使用各种武器。打斗的过程中也可以更换武器。所以武器行为是多变的,例如时代变了要跟换武器系统了。要适应这种变化,提高程序的扩展性。所以我们将变化的提取出来,作为接口的方式组合到client中,通过面向接口编程的方式来适应这种变化。所以我们把这组行为(算法簇)定义为,他们独立与client的。他们之间是可以相互替换的,这就叫做策略模式。

 下面我们模拟一个骑士的战斗场景:

   1.武器系统接口定义:WeaponBehavior.java

public interface WeaponBehavior {
	public void useWeapon();
}
   2.定义武器:

   

public class BowAndAnowBehavior implements WeaponBehavior {

	public BowAndAnowBehavior() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void useWeapon() {
		// TODO Auto-generated method stub
		System.out.println("我使用弓箭攻击!!");
	}

}
public class KnifeBehavior implements WeaponBehavior {

	public KnifeBehavior() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void useWeapon() {
		// TODO Auto-generated method stub
		System.out.println("我用小刀攻击!!!");
	}

}
public class SwordBehavior implements WeaponBehavior {

	public SwordBehavior() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void useWeapon() {
		// TODO Auto-generated method stub
		System.out.println("我用宝剑攻击!!!");
	}

}

public class AxeBehavior implements WeaponBehavior {

	public AxeBehavior() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void useWeapon() {
		// TODO Auto-generated method stub
		System.out.println("我用斧子攻击!!!");
	}

}


     3接着定义人物超类:Character.java 
 

public class Character {
	//注入武器系统
	public WeaponBehavior weaponBehavior;
	public Character() {
		// TODO Auto-generated constructor stub
	}
	/**
	 * 攻击方法
	 */
	public void fight(){
		weaponBehavior.useWeapon();
	}
	/**
	 * 注入相应的武器
	 * @param weaponBehavior
	 */
	public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
		this.weaponBehavior = weaponBehavior;
	}

}

4.定义我们的骑士:Knight.java

public class Knight extends Character {
 public Knight(){
	 System.out.println("我是英勇的骑士!!!");
 }
}

5.定义我们的测试类;KnightTest.java

public class KnightTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Knight knight=new Knight();
		System.out.println("我是王国的骑士:詹姆斯");
		System.out.println("开始战斗吧!!");
		knight.setWeaponBehavior(new SwordBehavior());
		knight.fight();
		System.out.println("等等我要求跟换武器!!!");
		knight.setWeaponBehavior(new AxeBehavior());
		knight.fight();
	}

}

好了所有的准备工作都已经完成。让我们的骑士开始战斗吧。输出结果:

我是英勇的骑士!!!
我是王国的骑士:詹姆斯
开始战斗吧!!
我用宝剑攻击!!!
等等我要求跟换武器!!!
我用斧子攻击!!!





         

你可能感兴趣的:([置顶] 设计模式------策略模式)