收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


javasscc的笔记
状态: 离线
人气:520617
访问用户量:1159
笔记经验:
总积分:1958
级别:普通会员
搜索本笔记
ta的交流分类
ta的交流主题贴(196)
ta的所有交流贴(200)
ta的全部笔记
全部笔记(98)
未分类笔记(0)
研磨设计模式(94)
课程问题(0)
设计模式综合项目实战(4)
存档
2013-05(4)
2012-08(39)
2012-07(55)

2013-01-04 08:51:07
研磨设计模式之策略模式-6 ——跟着cc学设计系列
浏览(6409)|评论(3)   交流分类:Java|笔记分类: 研磨设计模式

 

 

3.4  策略模式结合模板方法模式

        在实际应用策略模式的过程中,经常会出现这样一种情况,就是发现这一系列算法的实现上存在公共功能,甚至这一系列算法的实现步骤都是一样的,只是在某些局部步骤上有所不同,这个时候,就需要对策略模式进行些许的变化使用了。
        对于一系列算法的实现上存在公共功能的情况,策略模式可以有如下三种实现方式:

  • 一个是在上下文当中实现公共功能,让所有具体的策略算法回调这些方法。
  • 另外一种情况就是把策略的接口改成抽象类,然后在里面实现具体算法的公共功能。
  • 还有一种情况是给所有的策略算法定义一个抽象的父类,让这个父类去实现策略的接口,然后在这个父类里面去实现公共的功能。

        更进一步,如果这个时候发现“一系列算法的实现步骤都是一样的,只是在某些局部步骤上有所不同”的情况,那就可以在这个抽象类里面定义算法实现的骨架,然后让具体的策略算法去实现变化的部分。这样的一个结构自然就变成了策略模式来结合模板方法模式了,那个抽象类就成了模板方法模式的模板类。
        在上一章我们讨论过模板方法模式来结合策略模式的方式,也就是主要的结构是模板方法模式,局部采用策略模式。而这里讨论的是策略模式来结合模板方法模式,也就是主要的结构是策略模式,局部实现上采用模板方法模式。通过这个示例也可以看出来,模式之间的结合是没有定势的,要具体问题具体分析。
        此时策略模式结合模板方法模式的系统结构如下图5所示:


                                    图5  策略模式结合模板方法模式的结构示意图
        还是用实际的例子来说吧,比如上面那个记录日志的例子,如果现在需要在所有的消息前面都添加上日志时间,也就是说现在记录日志的步骤变成了:第一步为日志消息添加日志时间;第二步具体记录日志。
        那么该怎么实现呢?
(1)记录日志的策略接口没有变化,为了看起来方便,还是示例一下,示例代码如下:

 

/**

* 日志记录策略的接口

*/

public interface LogStrategy {

    /**

    * 记录日志

    * @param msg 需记录的日志信息

    */

    public void log(String msg);

}

(2)增加一个实现这个策略接口的抽象类,在里面定义记录日志的算法骨架,相当于模板方法模式的模板,示例代码如下:

 

/**

* 实现日志策略的抽象模板,实现给消息添加时间

*/

public abstract class LogStrategyTemplate implements LogStrategy{

    public final void log(String msg) {

       //第一步:给消息添加记录日志的时间

       DateFormat df = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss SSS");

       msg = df.format(new java.util.Date())+" 内容是:"+ msg;

       //第二步:真正执行日志记录

       doLog(msg);

    }

    /**

    * 真正执行日志记录,让子类去具体实现

    * @param msg 需记录的日志信息

    */                                 

    protected abstract void doLog(String msg);

}

(3)这个时候那两个具体的日志算法实现也需要做些改变,不再直接实现策略接口了,而是继承模板,实现模板方法了。这个时候记录日志到数据库的类,示例代码如下:

 

/**

* 把日志记录到数据库

*/

public class DbLog extends LogStrategyTemplate{

//除了定义上发生了改变外,具体的实现没变

    public void doLog(String msg) {   

       //制造错误

       if(msg!=null && msg.trim().length()>5){

           int a = 5/0;

       }

       System.out.println("现在把 '"+msg+"' 记录到数据库中");

    }

}

同理实现记录日志到文件的类如下:

 

/**

* 把日志记录到数据库

*/

public class FileLog extends LogStrategyTemplate{

    public void doLog(String msg) {

       System.out.println("现在把 '"+msg+"' 记录到文件中");

    }

}

(4)算法实现的改变不影响使用算法的上下文,上下文跟前面一样,示例代码如下:

 

/**

* 日志记录的上下文

*/

public class LogContext {

    /**

    * 记录日志的方法,提供给客户端使用

    * @param msg 需记录的日志信息

    */

    public void log(String msg){

       //在上下文里面,自行实现对具体策略的选择

       //优先选用策略:记录到数据库

       LogStrategy strategy = new DbLog();

       try{

           strategy.log(msg);

       }catch(Exception err){

           //出错了,那就记录到文件中

           strategy = new FileLog();

           strategy.log(msg);

       }

    }  

}

(5)客户端跟以前也一样,示例代码如下:

 

public class Client {

    public static void main(String[] args) {

       LogContext log = new LogContext();

       log.log("记录日志");

       log.log("再次记录日志");

    }

}

        运行一下客户端再次测试看看,体会一下,看看结果是否带上了时间。
        通过这个示例,好好体会一下策略模式和模板方法模式的组合使用,在实用开发中是很常见的方式。

3.5  策略模式的优缺点

  • 定义一系列算法
        策略模式的功能就是定义一系列算法,实现让这些算法可以相互替换。所以会为这一系列算法定义公共的接口,以约束一系列算法要实现的功能。如果这一系列算法具有公共功能,可以把策略接口实现成为抽象类,把这些公共功能实现到父类里面,对于这个问题,前面讲了三种处理方法,这里就不罗嗦了。

避免多重条件语句
    根据前面的示例会发现,策略模式的一系列策略算法是平等的,可以互换的,写在一起就是通过if-else结构来组织,如果此时具体的算法实现里面又有条件语句,就构成了多重条件语句,使用策略模式能避免这样的多重条件语句。
    如下示例来演示了不使用策略模式的多重条件语句,示例代码如下:

 

 

public class OneClass {

    /**

    * 示范多重条件语句

    * @param type 某个用于判断的类型

    */

    public void oneMethod(int type){      

//使用策略模式的时候,这些算法的处理代码就被拿出去,

//放到单独的算法实现类去了,这里就不再是多重条件了

 

       if(type==1){                  

           //算法一示范

           //从某个地方获取这个s的值

           String s = "";

           //然后判断进行相应处理

           if(s.indexOf("a") > 0){

              //处理

           }else{

              //处理

           }

       }else if(type==2){

           //算法二示范

           //从某个地方获取这个a的值

           int a = 3;

           //然后判断进行相应处理

           if(a > 10){

              //处理

           }else{

              //处理

           }

       }

    }

}

  • 更好的扩展性
        在策略模式中扩展新的策略实现非常容易,只要增加新的策略实现类,然后在选择使用策略的地方选择使用这个新的策略实现就好了。
  • 客户必须了解每种策略的不同
        策略模式也有缺点,比如让客户端来选择具体使用哪一个策略,这就可能会让客户需要了解所有的策略,还要了解各种策略的功能和不同,这样才能做出正确的选择,而且这样也暴露了策略的具体实现。
  • 增加了对象数目
        由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
  • 只适合扁平的算法结构
        策略模式的一系列算法地位是平等的,是可以相互替换的,事实上构成了一个扁平的算法结构,也就是在一个策略接口下,有多个平等的策略算法,就相当于兄弟算法。而且在运行时刻只有一个算法被使用,这就限制了算法使用的层级,使用的时候不能嵌套使用。
        对于出现需要嵌套使用多个算法的情况,比如折上折、折后返卷等业务的实现,需要组合或者是嵌套使用多个算法的情况,可以考虑使用装饰模式、或是变形的职责链、或是AOP等方式来实现。

3.6  思考策略模式

1:策略模式的本质
        策略模式的本质:分离算法,选择实现
        仔细思考策略模式的结构和实现的功能,会发现,如果没有上下文,策略模式就回到了最基本的接口和实现了,只要是面向接口编程的,那么就能够享受到接口的封装隔离带来的好处。也就是通过一个统一的策略接口来封装和隔离具体的策略算法,面向接口编程的话,自然不需要关心具体的策略实现,也可以通过使用不同的实现类来实例化接口,从而实现切换具体的策略。
        看起来好像没有上下文什么事情,但是如果没有上下文,那么就需要客户端来直接与具体的策略交互,尤其是当需要提供一些公共功能,或者是相关状态存储的时候,会大大增加客户端使用的难度。因此,引入上下文还是很必要的,有了上下文,这些工作就由上下文来完成了,客户端只需要与上下文交互就可以了,这样会让整个设计模式更独立、更有整体性,也让客户端更简单。
        但纵观整个策略模式实现的功能和设计,它的本质还是“分离算法,选择实现”,因为分离并封装了算法,才能够很容易的修改和添加算法;也能很容易的动态切换使用不同的算法,也就是动态选择一个算法来实现需要的功能了。

2:对设计原则的体现
        从设计原则上来看,策略模式很好的体现了开-闭原则。策略模式通过把一系列可变的算法进行封装,并定义出合理的使用结构,使得在系统出现新算法的时候,能很容易的把新的算法加入到已有的系统中,而已有的实现不需要做任何修改。这在前面的示例中已经体现出来了,好好体会一下。
        从设计原则上来看,策略模式还很好的体现了里氏替换原则。策略模式是一个扁平结构,一系列的实现算法其实是兄弟关系,都是实现同一个接口或者继承的同一个父类。这样只要使用策略的客户保持面向抽象类型编程,就能够使用不同的策略的具体实现对象来配置它,从而实现一系列算法可以相互替换。

3:何时选用策略模式
        建议在如下情况中,选用策略模式:

  • 出现有许多相关的类,仅仅是行为有差别的情况,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换
  • 出现同一个算法,有很多不同的实现的情况,可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次
  • 需要封装算法中,与算法相关的数据的情况,可以使用策略模式来避免暴露这些跟算法相关的数据结构
  • 出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况,可以使用策略模式来代替这些条件语句

3.7  相关模式

  • 策略模式和状态模式
        这两个模式从模式结构上看是一样的,但是实现的功能是不一样的。
        状态模式是根据状态的变化来选择相应的行为,不同的状态对应不同的类,每个状态对应的类实现了该状态对应的功能,在实现功能的同时,还会维护状态数据的变化。这些实现状态对应的功能的类之间是不能相互替换的。
        策略模式是根据需要或者是客户端的要求来选择相应的实现类,各个实现类是平等的,是可以相互替换的。
        另外策略模式可以让客户端来选择需要使用的策略算法,而状态模式一般是由上下文,或者是在状态实现类里面来维护具体的状态数据,通常不由客户端来指定状态。
  • 策略模式和模板方法模式
        这两个模式可组合使用,如同前面示例的那样。
        模板方法重在封装算法骨架,而策略模式重在分离并封装算法实现。
  • 策略模式和享元模式
        这两个模式可组合使用。
        策略模式分离并封装出一系列的策略算法对象,这些对象的功能通常都比较单一,很多时候就是为了实现某个算法的功能而存在,因此,针对这一系列的、多个细粒度的对象,可以应用享元模式来节省资源,但前提是这些算法对象要被频繁的使用,如果偶尔用一次,就没有必要做成享元了。

 

策略模式结束,谢谢观赏!鞠躬ing

 


---------------------------------------------------------------------------

私塾在线学习网原创内容  跟着cc学设计系列 之 研磨设计模式

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/95.html

---------------------------------------------------------------------------



精品视频课程推荐

Java数据结构和算法精讲版
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。 从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

软件系统功能设计实战训练视频教程
本课程是《软件系统功能设计实战训练》网络班的全套学习视频,通过6个具体的设计案例,综合应用几乎全部的GoF设计模式,以及多种设计理念和方法。 每个设计案例都各有侧重点,训练的难度会逐步加大,以切实帮助各位学员快速的掌握软件系统设计的方法,提升自己的软件系统设计能力。

Javascript基础视频教程
JavaScript的内置对象--Array、String、Date、Math等,可以通过DOM对象进行对象控制,创建控制菜单及复选框的控制,创建二级联动列表框及列表框选项的移动,JavaScript项目,创建基于JS的商品管理系统。

freevoice(局域网对讲机)——Android4项目实战视频教程
实现通过Wifi来在局域网内相互传递信息和语音通话的功能;学习Service;Broadcast Receiver;SharedPreference;SQLite;语音录制、播放、传输等;网络开发:wifi处理、UDP编程、TCP编程;多种设计模式的应用 等等

浏览(6409)|评论(3)   交流分类:Java|笔记分类: 研磨设计模式

评论(3)
3楼 ningbingjian  2013-01-04 引用

用中国话说就是very good!!

2楼 zhang  2012-07-04 引用

支持

1楼 javasscc  2012-07-02 引用

 

 

3.4  策略模式结合模板方法模式

        在实际应用策略模式的过程中,经常会出现这样一种情况,就是发现这一系列算法的实现上存在公共功能,甚至这一系列算法的实现步骤都是一样的,只是在某些局部步骤上有所不同,这个时候,就需要对策略模式进行些许的变化使用了。
        对于一系列算法的实现上存在公共功能的情况,策略模式可以有如下三种实现方式:

  • 一个是在上下文当中实现公共功能,让所有具体的策略算法回调这些方法。
  • 另外一种情况就是把策略的接口改成抽象类,然后在里面实现具体算法的公共功能。
  • 还有一种情况是给所有的策略算法定义一个抽象的父类,让这个父类去实现策略的接口,然后在这个父类里面去实现公共的功能。

        更进一步,如果这个时候发现“一系列算法的实现步骤都是一样的,只是在某些局部步骤上有所不同”的情况,那就可以在这个抽象类里面定义算法实现的骨架,然后让具体的策略算法去实现变化的部分。这样的一个结构自然就变成了策略模式来结合模板方法模式了,那个抽象类就成了模板方法模式的模板类。
        在上一章我们讨论过模板方法模式来结合策略模式的方式,也就是主要的结构是模板方法模式,局部采用策略模式。而这里讨论的是策略模式来结合模板方法模式,也就是主要的结构是策略模式,局部实现上采用模板方法模式。通过这个示例也可以看出来,模式之间的结合是没有定势的,要具体问题具体分析。
        此时策略模式结合模板方法模式的系统结构如下图5所示:


                                    图5  策略模式结合模板方法模式的结构示意图
        还是用实际的例子来说吧,比如上面那个记录日志的例子,如果现在需要在所有的消息前面都添加上日志时间,也就是说现在记录日志的步骤变成了:第一步为日志消息添加日志时间;第二步具体记录日志。
        那么该怎么实现呢?
(1)记录日志的策略接口没有变化,为了看起来方便,还是示例一下,示例代码如下:

 

/**

* 日志记录策略的接口

*/

public interface LogStrategy {

    /**

    * 记录日志

    * @param msg 需记录的日志信息

    */

    public void log(String msg);

}

(2)增加一个实现这个策略接口的抽象类,在里面定义记录日志的算法骨架,相当于模板方法模式的模板,示例代码如下:

 

/**

* 实现日志策略的抽象模板,实现给消息添加时间

*/

public abstract class LogStrategyTemplate implements LogStrategy{

    public final void log(String msg) {

       //第一步:给消息添加记录日志的时间

       DateFormat df = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss SSS");

       msg = df.format(new java.util.Date())+" 内容是:"+ msg;

       //第二步:真正执行日志记录

       doLog(msg);

    }

    /**

    * 真正执行日志记录,让子类去具体实现

    * @param msg 需记录的日志信息

    */                                 

    protected abstract void doLog(String msg);

}

(3)这个时候那两个具体的日志算法实现也需要做些改变,不再直接实现策略接口了,而是继承模板,实现模板方法了。这个时候记录日志到数据库的类,示例代码如下:

 

/**

* 把日志记录到数据库

*/

public class DbLog extends LogStrategyTemplate{

//除了定义上发生了改变外,具体的实现没变

    public void doLog(String msg) {   

       //制造错误

       if(msg!=null && msg.trim().length()>5){

           int a = 5/0;

       }

       System.out.println("现在把 '"+msg+"' 记录到数据库中");

    }

}

同理实现记录日志到文件的类如下:

 

/**

* 把日志记录到数据库

*/

public class FileLog extends LogStrategyTemplate{

    public void doLog(String msg) {

       System.out.println("现在把 '"+msg+"' 记录到文件中");

    }

}

(4)算法实现的改变不影响使用算法的上下文,上下文跟前面一样,示例代码如下:

 

/**

* 日志记录的上下文

*/

public class LogContext {

    /**

    * 记录日志的方法,提供给客户端使用

    * @param msg 需记录的日志信息

    */

    public void log(String msg){

       //在上下文里面,自行实现对具体策略的选择

       //优先选用策略:记录到数据库

       LogStrategy strategy = new DbLog();

       try{

           strategy.log(msg);

       }catch(Exception err){

           //出错了,那就记录到文件中

           strategy = new FileLog();

           strategy.log(msg);

       }

    }  

}

(5)客户端跟以前也一样,示例代码如下:

 

public class Client {

    public static void main(String[] args) {

       LogContext log = new LogContext();

       log.log("记录日志");

       log.log("再次记录日志");

    }

}

        运行一下客户端再次测试看看,体会一下,看看结果是否带上了时间。
        通过这个示例,好好体会一下策略模式和模板方法模式的组合使用,在实用开发中是很常见的方式。

3.5  策略模式的优缺点

  • 定义一系列算法
        策略模式的功能就是定义一系列算法,实现让这些算法可以相互替换。所以会为这一系列算法定义公共的接口,以约束一系列算法要实现的功能。如果这一系列算法具有公共功能,可以把策略接口实现成为抽象类,把这些公共功能实现到父类里面,对于这个问题,前面讲了三种处理方法,这里就不罗嗦了。

避免多重条件语句
    根据前面的示例会发现,策略模式的一系列策略算法是平等的,可以互换的,写在一起就是通过if-else结构来组织,如果此时具体的算法实现里面又有条件语句,就构成了多重条件语句,使用策略模式能避免这样的多重条件语句。
    如下示例来演示了不使用策略模式的多重条件语句,示例代码如下:

 

 

public class OneClass {

    /**

    * 示范多重条件语句

    * @param type 某个用于判断的类型

    */

    public void oneMethod(int type){      

//使用策略模式的时候,这些算法的处理代码就被拿出去,

//放到单独的算法实现类去了,这里就不再是多重条件了

 

       if(type==1){                  

           //算法一示范

           //从某个地方获取这个s的值

           String s = "";

           //然后判断进行相应处理

           if(s.indexOf("a") > 0){

              //处理

           }else{

              //处理

           }

       }else if(type==2){

           //算法二示范

           //从某个地方获取这个a的值

           int a = 3;

           //然后判断进行相应处理

           if(a > 10){

              //处理

           }else{

              //处理

           }

       }

    }

}

  • 更好的扩展性
        在策略模式中扩展新的策略实现非常容易,只要增加新的策略实现类,然后在选择使用策略的地方选择使用这个新的策略实现就好了。
  • 客户必须了解每种策略的不同
        策略模式也有缺点,比如让客户端来选择具体使用哪一个策略,这就可能会让客户需要了解所有的策略,还要了解各种策略的功能和不同,这样才能做出正确的选择,而且这样也暴露了策略的具体实现。
  • 增加了对象数目
        由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
  • 只适合扁平的算法结构
        策略模式的一系列算法地位是平等的,是可以相互替换的,事实上构成了一个扁平的算法结构,也就是在一个策略接口下,有多个平等的策略算法,就相当于兄弟算法。而且在运行时刻只有一个算法被使用,这就限制了算法使用的层级,使用的时候不能嵌套使用。
        对于出现需要嵌套使用多个算法的情况,比如折上折、折后返卷等业务的实现,需要组合或者是嵌套使用多个算法的情况,可以考虑使用装饰模式、或是变形的职责链、或是AOP等方式来实现。

3.6  思考策略模式

1:策略模式的本质
        策略模式的本质:分离算法,选择实现
        仔细思考策略模式的结构和实现的功能,会发现,如果没有上下文,策略模式就回到了最基本的接口和实现了,只要是面向接口编程的,那么就能够享受到接口的封装隔离带来的好处。也就是通过一个统一的策略接口来封装和隔离具体的策略算法,面向接口编程的话,自然不需要关心具体的策略实现,也可以通过使用不同的实现类来实例化接口,从而实现切换具体的策略。
        看起来好像没有上下文什么事情,但是如果没有上下文,那么就需要客户端来直接与具体的策略交互,尤其是当需要提供一些公共功能,或者是相关状态存储的时候,会大大增加客户端使用的难度。因此,引入上下文还是很必要的,有了上下文,这些工作就由上下文来完成了,客户端只需要与上下文交互就可以了,这样会让整个设计模式更独立、更有整体性,也让客户端更简单。
        但纵观整个策略模式实现的功能和设计,它的本质还是“分离算法,选择实现”,因为分离并封装了算法,才能够很容易的修改和添加算法;也能很容易的动态切换使用不同的算法,也就是动态选择一个算法来实现需要的功能了。

2:对设计原则的体现
        从设计原则上来看,策略模式很好的体现了开-闭原则。策略模式通过把一系列可变的算法进行封装,并定义出合理的使用结构,使得在系统出现新算法的时候,能很容易的把新的算法加入到已有的系统中,而已有的实现不需要做任何修改。这在前面的示例中已经体现出来了,好好体会一下。
        从设计原则上来看,策略模式还很好的体现了里氏替换原则。策略模式是一个扁平结构,一系列的实现算法其实是兄弟关系,都是实现同一个接口或者继承的同一个父类。这样只要使用策略的客户保持面向抽象类型编程,就能够使用不同的策略的具体实现对象来配置它,从而实现一系列算法可以相互替换。

3:何时选用策略模式
        建议在如下情况中,选用策略模式:

  • 出现有许多相关的类,仅仅是行为有差别的情况,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换
  • 出现同一个算法,有很多不同的实现的情况,可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次
  • 需要封装算法中,与算法相关的数据的情况,可以使用策略模式来避免暴露这些跟算法相关的数据结构
  • 出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况,可以使用策略模式来代替这些条件语句

3.7  相关模式

  • 策略模式和状态模式
        这两个模式从模式结构上看是一样的,但是实现的功能是不一样的。
        状态模式是根据状态的变化来选择相应的行为,不同的状态对应不同的类,每个状态对应的类实现了该状态对应的功能,在实现功能的同时,还会维护状态数据的变化。这些实现状态对应的功能的类之间是不能相互替换的。
        策略模式是根据需要或者是客户端的要求来选择相应的实现类,各个实现类是平等的,是可以相互替换的。
        另外策略模式可以让客户端来选择需要使用的策略算法,而状态模式一般是由上下文,或者是在状态实现类里面来维护具体的状态数据,通常不由客户端来指定状态。
  • 策略模式和模板方法模式
        这两个模式可组合使用,如同前面示例的那样。
        模板方法重在封装算法骨架,而策略模式重在分离并封装算法实现。
  • 策略模式和享元模式
        这两个模式可组合使用。
        策略模式分离并封装出一系列的策略算法对象,这些对象的功能通常都比较单一,很多时候就是为了实现某个算法的功能而存在,因此,针对这一系列的、多个细粒度的对象,可以应用享元模式来节省资源,但前提是这些算法对象要被频繁的使用,如果偶尔用一次,就没有必要做成享元了。

 

策略模式结束,谢谢观赏!鞠躬ing

 


---------------------------------------------------------------------------

私塾在线学习网原创内容  跟着cc学设计系列 之 研磨设计模式

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/95.html

---------------------------------------------------------------------------



请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网