设计模式------策略模式

1.策略模式定义:

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

2.定义场景:

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


游戏里面有各种角色,在这个尚武的王国里,人人都好战。所以每一个人物都有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();
	}

}

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

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





         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值