HeadFirst设计模式学习笔记((JAVA版)鸭子与策略(Strategy)模式


HeadFirst设计模式学习笔记((JAVA版)鸭子与策略(Strategy)模式

原文转自:http://www.cnblogs.com/nokiaguy/archive/2009/02/11/1388168.html

策略模式的设计原则如下:

    1.  将应用中需要经常变化的代码独立出来,应和那些不需要经常变化的代码分开。

    2.  应针对接口,而不是类进行编程。

    3.  在类中应多用组合,少用继承。

    例子:

    我们要实现一个鸭子模拟器,这个鸭子模拟器由Duck类描述,而Duck类有如下4个行为:

    1.  display

    2.  swim

    3.  fly(飞)

    4.  quack(叫)

    其中swim是所有鸭子都具有的特性,而且所有鸭子的这些特性都相同,因此,这个方法可以直接在Duck类中实现。display方法也是所有鸭子具有的特性,但随着鸭子的种类不同,display也有所不同,因此,display方法应为Duck类的抽象方法。fly和quack并不是所有鸭子的特性,如橡皮鸭子即不会飞,也不会叫。因此,可以将这两个方法看作是两个行为,可将每一个行为设计成一个接口。这样可以和Duck类完全脱离。因为,fly和quack与Duck一点关系都没有(别的东西也可能fly和quack),然后不同的fly和quack分别用实现相应接口的类表示。

    下面是关于Duck的完整代码:

fly行为
  //  飞行接口
    public interface FlyBehavior {
	public void fly();
}
    //  飞
    public class FlyWithWings implements FlyBehavior {
	public void fly() {
		System.out.println("正在用翅膀飞行");
	}
}
    //  不飞
    public class FlyNoWay implements FlyBehavior {
	public void fly() {
		System.out.println("不会飞");
	}
}
//坐火箭飞
public class FlyRocketPowered implements FlyBehavior {
	public void fly() {
		System.out.println("坐火箭飞");
	}
}



quack行为
    //  叫接口
    public interface QuackBehavior {
	public void quack();
}
    // 嘎嘎叫
    public class Quack implements QuackBehavior {
	public void quack() {
		System.out.println("嘎嘎叫");
	}
}
    //  吱吱叫
    public class Squeak implements QuackBehavior {
	public void quack() {
		System.out.println("吱吱叫");
	}
}
    //  不叫
    public class MuteQuack implements QuackBehavior {
	public void quack() {
		System.out.println("不会叫");
	}
}


实现Duck类
//  鸭子超类
    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("正在游泳~~");
	}
}



建立不同的鸭子类

 //  野鸭
    public class MallardDuck extends Duck {
 
	public MallardDuck() {
 
		quackBehavior = new Quack();
                flyBehavior = new FlyWithWings();
 

	}
 
	public void display() {
		System.out.println("绿头鸭");
	}
}
    //  红头鸭
    public class RedHeadDuck extends Duck {
 
	public RedHeadDuck() {
		flyBehavior = new FlyWithWings();
		quackBehavior = new Quack();
	}
 
	public void display() {
		System.out.println("红头鸭");
	}
}
    //  橡皮鸭
   public class RubberDuck extends Duck {
 
	public RubberDuck() {
		flyBehavior = new FlyNoWay();
		quackBehavior = new Squeak();
	}
 
	public void display() {
		System.out.println("橡皮鸭");
	}
}
    //模型鸭
public class ModelDuck extends Duck {
	public ModelDuck() {
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}

	public void display() {
		System.out.println("模型鸭");
	}
}





调用代码如下:
public class MiniDuckSimulator {
 
	public static void main(String[] args) {
 
		MallardDuck	mallard = new MallardDuck();
		RubberDuck	rubberDuckie = new RubberDuck();
		RedHeadDuck	redHeadDuck = new RedHeadDuck();
 
		ModelDuck	model = new ModelDuck();

		mallard.performQuack();
		rubberDuckie.performQuack();
		redHeadDuck.performQuack();
   
		model.performFly();	
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
	}
}

你可能感兴趣的:(java,设计模式,编程)