策略模式

概念

定义算法族,封装算法,让算法之间可以相互替换;算法的变化不会影响使用算法的客户。

设计原则

UML图

策略模式的uml

实例

我们在玩游戏的时候有武器weapon,我们要在武器之间相互转换,一会用枪,一会用刀,一会用炸弹,我们不管使用何种武器,最终目的都是一样-消灭敌人。

策略模式的uml

代码

Weapon:

package com.sosop.strategy;

public interface Weapon {
	void action();
}

Gun:

package com.sosop.strategy;

public class Gun implements Weapon {

	@Override
	public void action() {
		System.out.println("使用枪射击");
	}
}

Knife:

package com.sosop.strategy;

public class knife implements Weapon {

	@Override
	public void action() {
		System.out.println("使用刀攻击");
	}
}

Bomb:

package com.sosop.strategy;

public class Bomb implements Weapon {

	@Override
	public void action() {
		System.out.println("使炸弹攻击");
	}

}

Soldier:

package com.sosop.strategy;

public abstract class Soldier {
	private Weapon weapon;

	public void setWeapon(Weapon weapon) {
		this.weapon = weapon;
	}

	protected void fight() {
		weapon.action();
	}
}

Enemy:

package com.sosop.strategy;

public class Enemy extends Soldier {

}

Test:

package com.sosop.strategy;

public class TestStrategy {
	public static void main(String[] args) {
		Soldier soldier = new Enemy();
		Weapon weapon = new Gun();
		soldier.setWeapon(weapon);
		soldier.fight();
	
		weapon = new knife();
		soldier.setWeapon(weapon);
		soldier.fight();
	}
}

模式分析

  1. 什么时候需要用策略模式
    接口不能解决代码的复用,继承不能体现全部行为的时候

  2. 模式解析
    策略模式定义路一系列算法,算法完成的工作都是相同的,只是每种算法的实现不同,正如上面例子,武器完成的工作都是消灭敌人,但是用刀用枪由用户决定。
    用户可以动态的切换算法,就如把枪换成炸弹。
    每个算法是一个单独的类,使单元测试更加方便

sosop hou 26 February 2015
blog comments powered by Disqus