1. 定义
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式的变 化独立于算法的使用者。
2. 案例
植物大战僵尸,僵尸类型有很多种,以后还可能会扩展
第一个版本僵尸:

第二个版本僵尸:

未完待续,第N个版本僵尸:
2.1 第一种实现(不推荐)
定义一个普通僵尸,其他僵尸继承它,重写对应方法,但是有的方法可能时公用的,再去继承另外的僵尸并重写方法,会使得类结构图复杂
2.2 第二种实现:策略模式
分别定义僵尸移动、攻击为算法族,封装起来。
封装移动、攻击:
interface Moveable {void move();}interface Attackable {void attack();}
实现一个移动
class StepByStepMove implements Moveable {@Overridepublic void move() {System.out.println("一步一步移动.");}}
实现两个攻击
class BiteAttack implements Attackable {@Overridepublic void attack() {System.out.println("咬.");}}class HitAttack implements Attackable {@Overridepublic void attack() {System.out.println("打.");}}
定义僵尸基类
abstract class Zombie {abstract public void display();Moveable moveable;Attackable attackable;public Zombie(Moveable moveable, Attackable attackable) {this.moveable = moveable;this.attackable = attackable;}abstract void move();abstract void attack();public Moveable getMoveable() {return moveable;}public void setMoveable(Moveable moveable) {this.moveable = moveable;}public Attackable getAttackable() {return attackable;}public void setAttackable(Attackable attackable) {this.attackable = attackable;}}
定义一个普通僵尸:默认移动为StepByStepMove,默认攻击为BiteAttack
class NormalZombie extends Zombie {public NormalZombie() {super(new StepByStepMove(), new BiteAttack());}public NormalZombie(Moveable moveable, Attackable attackable) {super(moveable, attackable);}@Overridepublic void display() {System.out.println("我是普通僵尸.");}@Overridevoid move() {moveable.move();}@Overridevoid attack() {attackable.attack();}}
定义一个棋手僵尸:默认移动为StepByStepMove,默认攻击为BiteAttack
class FlagZombie extends Zombie {public FlagZombie() {super(new StepByStepMove(), new BiteAttack());}public FlagZombie(Moveable moveable, Attackable attackable) {super(moveable, attackable);}@Overridepublic void display() {System.out.println("我是旗手僵尸.");}@Overridevoid move() {moveable.move();}@Overridevoid attack() {attackable.attack();}}
使用:
public class StrategyTest {public static void main(String[] args) {Zombie zombie = new NormalZombie();zombie.display();zombie.attack();zombie.move();//还可以重新设置攻击方式zombie.setAttackable(new BiteAttack());zombie.attack();}}
