关于策略模式(转)

Design Patterns书里的定义:Define a family of algorithms, encapsulate each one, and make them interchangeable. [The] Strategy [pattern] lets the algorithm vary independently from clients that use it .

策略模式(Strategy)属于对象行为型设计模式,主要是定义算法族,分别封装起来,让他们之间可以项目替换,此模式让算法的变化独立于使用算法的客户

 

核心概念:

  Strategy模式主要用了几种面向对象的思想:1.封装性(把每种算法都封装) 2.继承(每个算法都继承一个算法接口) 3.多态. 还有几种基本的设计思想:1.针对接口编程.2.多用组合,少用继承 3.开闭原则OCP(Sofstware  entities should be open for extension,but closed for modification

  Strategy模式的使用场景:有一些类的某些行为会经常发生变化(或者需要在运行时动态变化),这样就可以使用策略模式.

  Strategy模式的主要描述:把类中经常变化的行为提取为一个接口,不同的行为(算法)都继承这个接口.而这个行为的调用类就改为调用这个接口,把行为接口声明为调用者的一个属性(这里用的是组合,而不是继承,后面会讲到这个). 

借用一张图片:

这张图片已经把这个问题策略模式的结构说的非常清楚了.

  下面接着上面那一个疑问,为什么我们不直接直接继承行为接口,而把行为当成属性呢? 举个例子:现在我要做一个功能来处理不同格式的视频文件.如现常见的格式有.avi,.wmv,rm,rmvb等.当然还有其他的格式.我们怎么来设计这个功能呢? 首先,我们应该确定这个功能设计出来应该满足什么要求.1.在有新的格式的视频格式时,不用改变现有的代码.

 

 

 

 

public interface VideoParser{
    
public VideoData parser(byte[] bytes); 
}
算法1:
public class AviParser implements VideoParser{
    
public VideoData parser(byte[] bytes){
         
//Avi的算法
          ...
    }
}
算法2:
public class WmvParser implements VideoParser{
    
public VideoData parser(byte[] bytes){
         
//wmv的算法
          ...
    }
}
算法使用类:
public class VideoHandler{
   
public VideoParser parser;
   
   
public void videoHandler(byte[] videoBytes){
        VideoData data = parser.parser(videoBytes);
        display(data);
   }

   
public void display(VideoData data){
     //播放视频文件    
   }
   public void setVideoParser(VideoParser parser){
         this.parser = parser;
   }
 
//APP
public class App{
    public static void main(String[] args){
        VideoHandler vh = new VideoHandler();
        vh.setVideoParser(new WmvParser());
        byte[] wmvBytes = getVideoBytes();
        vh.handle(wmvBytes);
    }
 
    public static byte[] getVideoBytes(){
         
//得到视频文件的二进制数组
   }
 
}
   

 

 

 

posted on 2010-03-19 15:40  ethanchan  阅读(158)  评论(0编辑  收藏  举报

导航