firtre

小蚂蚁,定语没想好。 精灵古怪,不是我。

Head First 设计模式之策略模式

设计原则:找出应用可能需要变化之处,把它们独立出来,不要和那个不需要变化的代码放在一起.
设计原则:多用组合,少用继承.
设计原则:针对接口编程,而不是针对实现编程.
背景:需要设计一个鸭子类,有飞行和呱呱叫两种行为.可是后来引入了橡皮鸭,导致传统的继承处理无法使用(不能让橡皮鸭也会飞)而且还可能会有既不会飞也不会叫的鸭子,或者需要引入不同种鸭子的具体的飞行运行,叫的声音......
策略模式:把易变的动作部分抽象出来成为单独的类(接口).
定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.

public abstract class Duck {
 FlyBehavior flyBehavior;
 QuackBehavior quackBehavior;
 public Duck(){
 }
 
 public 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 FlyWithWings implements FlyBehavior{

 public void fly() {
  System.out.println("I'm flying!!");
 }
}

public interface QuackBehavior {
 public void quack();
}

public class Quack  implements QuackBehavior{

 public void quack() {
  System.out.println("Quack");
 }
}

public class muteQuack implements QuackBehavior{

 public void quack() {
  System.out.println("<<Silence>>");
 }

}

public class Squeak implements QuackBehavior{

 public void quack() {
  System.out.println("Squeak");
 }
}

public class MallardDuck extends Duck{
 public MallardDuck(){
  quackBehavior = new Quack();
  flyBehavior = new FlyWithWings();
 }
 public void display() {
  System.out.println("I'm a real Mallard duck.");
 }
}
测试类:
public class MiniDuckSimulator {
 public static void main(String[] args){
  Duck mallard = new MallardDuck();
  mallard.performQuack();
  mallard.performFly();
 }
}

posted on 2008-04-07 23:03 笨蛋 阅读(184) 评论(0)  编辑  收藏


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


网站导航: