策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
设计原则:
1、封装变化
2、多用组合没,少用继承
3、针对接口编程,不针对实现编程
书中例子:“鸭子模拟器”
1、客户:使用封装好的飞信和呱呱叫算法族
public abstract class Duck { /** * @param args */ FlyBehavior flyBehavior; QuackBehavior quackBehavior; //引用为鸭子封装的两个行为 public abstract void display(); //鸭子的模样由子类实现 public void performFly() { flyBehavior.fly(); } public void performQuack() { quackBehavior.quack(); } //不同鸭子有不同行为,委托给行为类 public void swim() { System.out.println("所有鸭子都可以游泳。"); } }
子类
public class MallardDuck extends Duck { public MallardDuck() { // TODO Auto-generated constructor stub quackBehavior = new Quack(); //绿头鸭是呱呱叫的 flyBehavior = new FlyWithWings(); //绿头鸭会飞 } @Override public void display() { // TODO Auto-generated method stub System.out.println("我是一只绿头鸭."); } }
2、封装飞行行为
public interface FlyBehavior { public void fly(); }
public class FlyWithWings implements FlyBehavior { @Override public void fly() { // TODO Auto-generated method stub System.out.println("我正在飞!"); } }
public class FlyNoway implements FlyBehavior { @Override public void fly() { // TODO Auto-generated method stub System.out.println("我不会飞!"); } }
3、封装呱呱叫行为
public interface QuackBehavior { public void quack(); }
public class Quack implements QuackBehavior { @Override public void quack() { // TODO Auto-generated method stub System.out.println("呱呱"); } }
public class MuteQuack implements QuackBehavior { @Override public void quack() { // TODO Auto-generated method stub System.out.println("<<不会叫>>"); } }
4、测试类
public class MiniDuckSimulator { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Duck mallard = new MallardDuck(); mallard.display(); mallard.swim(); mallard.performFly(); mallard.performQuack(); } }
输出结果:
我是一只绿头鸭.
所有鸭子都可以游泳。
我正在飞!
呱呱
5、动态设定行为
我们还可以在运行时为鸭子“变身”。
在Duck类中加入两个新方法:
public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; }
在运行时使用:
mallard.setFlyBehavior(new FlyNoway()); mallard.performFly();
输出结果:
我是一只绿头鸭.
所有鸭子都可以游泳。
我正在飞!
呱呱
我不会飞!
实战演练:动作冒险游戏,每个角色只能使用一种武器,在游戏过程中可以换武器。
1、客户
public abstract class Character { int LV; String name; String skill; WeaponBehavior weapon; public abstract void fight(); public void setWeapon(WeaponBehavior w) { this.weapon = w; } public void display() { System.out.println("大家好!我叫" + name); System.out.println("我的攻击方式是:"); weapon.useWeapon(); System.out.println("我的绝招是" + skill); } }
2、封装武器
public interface WeaponBehavior { public void useWeapon(); }
public class Knife implements WeaponBehavior { @Override public void useWeapon() { // TODO Auto-generated method stub System.out.println("用匕首刺杀。"); } }
public class Sword implements WeaponBehavior { @Override public void useWeapon() { // TODO Auto-generated method stub System.out.println("用宝剑斩击。"); } }
3、测试
public class AttackSimulator { public static void main(String[] args) { // TODO Auto-generated method stub Character king = new King(); Character knight = new Knight(); king.display(); System.out.println(); knight.display(); System.out.println(); System.out.println("骑士击杀国王,获得武器匕首!"); knight.setWeapon(king.weapon); knight.display(); } }
输出结果:
大家好!我叫国王
我的攻击方式是:
用匕首刺杀。
我的绝招是祈祷
大家好!我叫骑士
我的攻击方式是:
用宝剑斩击。
我的绝招是幻影剑舞
骑士击杀国王,获得武器匕首!
大家好!我叫骑士
我的攻击方式是:
用匕首刺杀。
我的绝招是幻影剑舞