策略模式(Strategy)

1. 定义:策略模式是针对一组算法或者行为特性,将它们抽象到具有共同接口函数的独立抽象类或接口中,从而使得它们可以相互替换。

         这样就使得某一个特定的接口行为可以在不影响客户端的情况下发生变化。

 

基本实现示意图:

2. 策略模式主要分为以下三个角色:

  • 环境角色(Context):持有一个策略类引用
  • 抽象策略(Strategy):定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。一般的,我们使用接口或抽象类实现。
  • 具体策略(ConcreteStrategy):实现抽象策略类中的相关的算法或操作。

3. 策略模式的好处:

  • 提供了管理一组算法族的方法——通过接口和多个算法实现之间的契约接口来完成业务场景;
  • 提供了可以替换通过继承进行对象行为扩展的方法——使用公共抽象接口的不同实现类而并非一个抽象类的继承链完成行为的扩展;
  • 提供了将算法的调用责任与算法逻辑进行解耦的方法——通过角色转移,将调用环境角色(Context)与算法抽象(Strategy)之间分开,形成引用关系。
  • 使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

4. 策略模式的缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
  • 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

5.示例代码:

 1 /** 
 2  * 抽象策略 
 3  * @author zhanche 
 4  * 
 5  */  
 6 public abstract class AbstractStrategy {  
 7     /** 
 8      * 某个希望有不同策略实现的算法 
 9      */  
10     public abstract void algorithm();  
11 } 

 

/** 
 * 对算法的第一种具体实现策略 
 * @author zhanche 
 * 
 */  
public class ConcreteStrategy1 extends AbstractStrategy {  
  
    @Override  
    public void algorithm() {  
        System.out.println("----------------我是策略一算法----------------");  
    }  
  
} 

 

/** 
 * 对算法的第二种具体实现策略 
 * @author zhanche 
 * 
 */  
public class ConcreteStrategy2 extends AbstractStrategy {  
  
    @Override  
    public void algorithm() {  
        System.out.println("----------------我是策略二算法----------------");  
    }  
  
} 
/** 
 * 环境角色,主要完成对特定策略的调用 
 * @author zhanche 
 * 
 */  
public class Context {  
    private AbstractStrategy strategy;  
      
    public Context(AbstractStrategy strategy) {  
        this.strategy = strategy;  
    }  
    public void algorithm() {  
        this.strategy.algorithm();  
    }  
} 
/** 
 * 策略模式测试类 
 * 
 */  
public class Client {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        Context context = new Context(new ConcreteStrategy1());  
        context.algorithm();  
          
        context = new Context(new ConcreteStrategy2());  
        context.algorithm();  
    }  
  
} 

输出结果如下:
----------------我是策略一算法----------------
----------------我是策略二算法---------------- 

参考:http://zhanche2011.iteye.com/blog/1169948

posted @ 2014-04-03 17:04  sky钦  阅读(133)  评论(0)    收藏  举报