策略模式
定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
问题:有一个鸭子类定义了鸭子的种种行为,包括swim(),quack(),fly(),但是,并不是所有的鸭子都会飞行(fly)或者叫(quack),在这里,我们认为所有的鸭子都会浮在水面上(swim)。如何实现各种不同的鸭子的不同的表现。
解决方法:第一个想到的会使继承,在鸭子父类中定义好所有的方法,在实现鸭子子类的过程中,对不满足于具体的鸭子的行为进行覆盖,但是在这种方法中,首先的问题是代码需要在子类中重复的编写,而且运行时的行为不容易被改变等等。
第二种方法会是接口,把fly()和quack()从鸭子类中提取出来。写成一个接口,能实现的鸭子实现接口,反之,则不实现接口,但是,这种方法会导致代码无法重复的利用。
第三 策略模式,把鸭子类中可变的行为分别抽取出来,分别封装起来。
见图:

代码实现:
Duck类:
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void display();
public void swim(){
System.out.print(" swim ");
}
public void performFly() {
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior fb){
this.flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
this.quackBehavior = qb;
}
}
fly接口及实现:
public interface FlyBehavior {
public void fly();
}
public class FlyWithWings implements FlyBehavior {
public void fly(){
System.out.print(" fly with wings ");
}
}
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.print(" cant‘t fly ");
}
}
quack接口及实现:
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior{
public void quack(){
System.out.print(" quack");
}
}
public class BadQuack implements QuackBehavior{
public void quack(){
System.out.print(" cant‘t quack ");
}
}
测试:
public class GreenDuck extends Duck{
public GreenDuck(){
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
public void display() {
System.out.print(" real duck ");
}
}
public class test {
public static void main(String []args){
Duck greenDuck = new GreenDuck();
greenDuck.performFly();
greenDuck.performQuack();
greenDuck.setFlyBehavior(new FlyNoWay());//动态改变鸭子的行为
System.out.println();
greenDuck.performFly();
}
}
结果:

总结与分析(摘自http://blog.csdn.net/hguisu/article/details/7558249)
原文:http://www.cnblogs.com/zyqBlog/p/5287105.html