Mark's Java Blog
MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA
   策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

    个人理解:策略模式就是把父类中需要根据不同情况而变化的行为想成“一族算法”,并把它抽象出来变成两个接口,在父类中包含这个接口类型的属性,这样就可以利用不同的接口实现类来改变这个行为。并且添加了getter,setter方法后可以在运行时随意改变行为的实现,这样就可以使我们的设计更加富有弹性,可以使我们的设计更加易于维护和扩展。

实例代码:

要求:所有的各类鸭子继承一个超类,并且可以拥有自己的特性,可以因为需求变化而改变某个鸭子或某一类鸭子的某种特性(如可以改变叫声和飞行状态)。

//鸭子超类
public abstract class Duck {
//飞行状态算法族
 FlyBehavior flyBehavior;
//鸣叫状态算法族
 QuackBehavior quackBehavior;
 
 public Duck() {
 }
 //改变算法组状态的方法,可是在运行时改变特性的方法
 public void setFlyBehavior (FlyBehavior fb) {
  flyBehavior = fb;
 }
 
 public void setQuackBehavior(QuackBehavior qb) {
  quackBehavior = qb;
 }
 //由子类继承并实现的鸭子特性(不会改变)
 abstract void display();
 //由子类继承的飞行和鸣叫方法
 public void performFly() {
  flyBehavior.fly();
 }
 
 public void performQuack() {
  quackBehavior.quack();
 }
 
 public void swim() {
  System.out.println("All ducks float, even decoys!");
 }
}

//飞行接口
public interface FlyBehavior {
 public void fly();
}

//飞行状态实现类(不能飞)
public class FlyNoWay implements FlyBehavior {
 public void fly() {
  System.out.println("I can't fly");
 }
}

//火箭助推器
public class FlyRocketPowered implements FlyBehavior {
 public void fly() {
  System.out.println("I'm flying with a rocket");
 }
}
//鸣叫接口
public interface QuackBehavior {
 public void quack();
}

//鸣叫状态实现类(不能叫)
public class MuteQuack implements QuackBehavior {
 public void quack() {
  System.out.println("<< Silence >>");
 }
}

//一个模型鸭的子类,在创建时指定特性
public class DecoyDuck extends Duck {
//在构造器中指定飞行特性和鸣叫特性(不能飞,不能叫)
 public DecoyDuck() {
  setFlyBehavior(new FlyNoWay());
  setQuackBehavior(new MuteQuack());
 }

 public void display() {
  System.out.println("I'm a duck Decoy");
 }
}

//测试程序

public class MiniDuckSimulator {
 
 public static void main(String[] args) {
 
  DecoyDuck decoy = new DecoyDuck();

  decoy.performQuack();
   
  decoy .performFly(); 
//运行时把飞行状态改为火箭助推器飞行
  decoy .setFlyBehavior(new FlyRocketPowered());
  decoy .performFly();
 }
}

posted on 2008-03-17 09:55 Mark 阅读(543) 评论(2)  编辑  收藏 所属分类: 设计模式
Comments
  • # re: 策略模式[未登录]
    aa
    Posted @ 2008-12-03 14:51
    真的看不懂,抽象类有构选函数,有没有搞错?  回复  更多评论   
  • # re: 策略模式
    sy
    Posted @ 2009-10-21 22:52
    @aa
    白痴,为什么不能有  回复  更多评论   

只有注册用户登录后才能发表评论。


网站导航: