…
好记性不如烂笔头,记录一下策略模式
什么是策略模式?
实际上策略模式属于对象的行为模式,针对一组可以相互替换的行为又不影响到最终结果而发生改变的情况。
使用
如图所示,将一组需要切换的行为定义成抽象的放入Context类中,通过构造器或者Setter的方式来切换行为。
举例
应用: 继承角色类的国王王后等角色可以随时切换并使用武器
public class Strategy {
public static void main(String[] args) {
Character c1 = new King();
c1.useWeapon();
Character c2 = new Knight();
c2.useWeapon();
Character c3 = new Queen();
c3.useWeapon();
Character c4 = new Troll();
c4.useWeapon();
c1.setWeapon(new NoWeaponBehavior());
c1.useWeapon();
}
}
interface WeaponBehavior{
void useWeapon();
}
abstract class Character{
WeaponBehavior weapon = new NoWeaponBehavior();
void useWeapon() {
System.out.print(this.getClass().getSimpleName() + " : ");
this.weapon.useWeapon();
}
void setWeapon(WeaponBehavior weapon) {
System.out.print("switch weapon ... ");
this.weapon = weapon;
}
}
class King extends Character {
public King() {
weapon = new SwordWeaponBehavior();
}
}
class Queen extends Character {
public Queen() {
weapon = new BowAndArrowWeaponBehavior();
}
}
class Troll extends Character {
public Troll() {
weapon = new DaggerWeapon();
}
}
class Knight extends Character {
public Knight() {
weapon = new ShieldWeapon();
}
}
class NoWeaponBehavior implements WeaponBehavior{
@Override
public void useWeapon() {
System.out.println("use bare hand...");
}
}
class DaggerWeapon implements WeaponBehavior{
@Override
public void useWeapon() {
System.out.println("use dagger...");
}
}
class ShieldWeapon implements WeaponBehavior{
@Override
public void useWeapon() {
System.out.println("use shield...");
}
}
class BowAndArrowWeaponBehavior implements WeaponBehavior{
@Override
public void useWeapon() {
System.out.println("use bow and arrow...");
}
}
class SwordWeaponBehavior implements WeaponBehavior{
@Override
public void useWeapon() {
System.out.println("use sword...");
}
}
class AxeWeaponBehavior implements WeaponBehavior{
@Override
public void useWeapon() {
System.out.println("use axe...");
}
}
结果如下:
King : use sword...
Knight : use shield...
Queen : use bow and arrow...
Troll : use dagger...
King : use bare hand...
Process finished with exit code 0
总结
策略模式的优点在于灵活,可扩展性强,具有更好的维护性;但是缺点也很明显,使用者必须知道所有的策略类,并自行决定使用哪一个策略类。同时如上面优点所说,由于策略模式可扩展性强(有一个行为就扩展一个类),因此对象的数目十分可观。