分类: java 设计模式2015-03-06 12:46 119人阅读 评论(0) 收藏 举报
1.策略模式:
将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。
并使他们可以相互替换,
从而导致客户端程序独立于算法的改变。
2.使用策略模式的思想是——多用组合,少用继承
什么是组合?
—在类中增加一个私有域,引用另一个已有的类的实例,通过调用引用的实例的方法,,从而获得新的功能,这种设计被称作composition(组合、复合)。
3.策略模式的优点
(1)、策略模式因为使用了组合,使得架构更加灵活
(2)、富有弹性,可以较好的应对变化(开闭原则)
(3)、更好的代码复用性(相对于继承)
(4)、消除大量的条件语句 (比如 if  ,else)
4.
4.策略模式的使用场景
(1)许多相关的类仅仅是行为差异
(2)运行时选取不同的算法变体
(3)通过条件语句在多个分支中选取之一
案例:
假设现在有一个鸭子抽象类Duck , 它们都会飞,但是飞的方式不一样(有的用翅膀,有的用火箭,有的不会飞) 。使用策略模式让设计更灵活
首先,我们定义一个飞行的接口
[java] view plaincopy
/* 
 * 策略接口,实现鸭子的飞行行为 
 */  
public interface FlyingStragety {  
  
    void performFly();  
}  
接下来,定义一个鸭子抽象类, 在该类中,需要有一个私有的飞行接口的应用,使鸭子能够使用这个接口来实现飞行 。
[java] view plaincopy
/* 
 * 超类,所有的鸭子都要继承此类 
 * 抽象了鸭子的行为:显示和鸣叫 
 */  
public abstract class Duck {  
    
    /* 
     * 鸭子发出叫声 
     * 通用行为,由超类实现 
     */  
    public void quack(){  
        System.out.println("嘎嘎嘎");  
    }  
      
    /* 
     * 显示鸭子的外观 
     * 鸭子的外观各不相同,声明为abstract, 由子类实现 
     */  
    public abstract void display();  
      
      
    private FlyingStragety flyingStragety;  
  
  
    public void setFlyingStragety(FlyingStragety flyingStragety) {  
        this.flyingStragety = flyingStragety;  
    }  
      
    public void fly(){  
        flyingStragety.performFly();  
    }  
    
}  
]
接下来的问题就变成创建一个实现飞行接口的实例,给鸭子。
定义一个用用翅膀飞的飞行接口实现类
[java] view plaincopy
public class FlyWithWin implements FlyingStragety {  
  
    public void performFly() {  
        System.out.println("用翅膀飞");  
    }  
  
}  
创建一个用翅膀飞的鸭子的类,继承自抽象鸭子类 Duck
[java] view plaincopy
public class MallardDuck extends Duck {  
  
      
    public MallardDuck(){  
        super();  
        super.setFlyingStragety(new FlyWithWin());  
    }  
      
    @Override  
    public void display() {  
        System.out.println("我的脖子是绿色的");  
    }  
  
}  
测试
[java] view plaincopy
public class DuckTest {  
  
    public static void main(String[] args){  
        Duck duck =null;  
        duck = new MallardDuck();  
        duck.display();  
        duck.quack();  
        duck.fly();  
        System.out.println("测试完毕");  
    }  
  
}  
输出结果
[html] view plaincopy
我的脖子是绿色的  
嘎嘎嘎  
用翅膀飞  
测试完毕  
如果是用火箭飞,只需创建一个新的 实现飞行接口的类,然后在鸭子的构造器中使用 
super.setFlyingStragety()传入即可