注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

写着玩

Bob

 
 
 

日志

 
 
 
 

设计模式的解析和实现(C++)之十六-Strategy模式  

2009-06-16 23:17:37|  分类: GOF设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://tech.ddvip.com/2009-03/1238319427112761.html

 

作用:

  定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.

  解析:

  简而言之一句话,Strategy模式是对算法的封装.处理一个问题的时候可能有多种算法,这些算法的接口(输入参数,输出参数等)都是一致的,那么可以考虑采用Strategy模式对这些算法进行封装,在基类中定义一个函数接口就可以了.

  实现:

  1)Strategy.h

/**//********************************************************************

    created:    2006/08/06

    filename:     Strategy.h

    author:        李创

                http://www.cppblog.com/converse/

    purpose:    Strategy模式的演示代码

*********************************************************************/

#ifndef STRATEGY_H

#define STRATEGY_H

class Strategy;

class Context

{

public:

    Context(Strategy *pStrategy);

    ~Context();

    void ContextInterface();

private:

    Strategy* m_pStrategy;

};

class Strategy

{

public:

    virtual ~Strategy(){}

    virtual void AlgorithmInterface() = 0;

};

class ConcreateStrategyA

    : public Strategy

{

public:

    virtual ~ConcreateStrategyA(){}

    virtual void AlgorithmInterface();

};

#endif

2)Strategy.cpp

/**//********************************************************************

    created:    2006/08/06

    filename:     Strategy.cpp

    author:        李创

                http://www.cppblog.com/converse/

    purpose:    Strategy模式的演示代码

*********************************************************************/

#include <iostream>

#include "Strategy.h"

Context::Context(Strategy *pStrategy)

    : m_pStrategy(pStrategy)

{

}

Context::~Context()

{

    delete m_pStrategy;

    m_pStrategy = NULL;

}

void Context::ContextInterface()

{

    if (NULL != m_pStrategy)

    {

        m_pStrategy->AlgorithmInterface();

    }

}

void ConcreateStrategyA::AlgorithmInterface()

{

    std::cout << "AlgorithmInterface Implemented by ConcreateStrategyAn";

}

  3)Main.cpp

/**//********************************************************************

    created:    2006/08/06

    filename:     Main.cpp

    author:        李创

                http://www.cppblog.com/converse/

    purpose:    Strategy模式的测试代码

*********************************************************************/

#include "Strategy.h"

int main()

{

    Strategy* pStrategy = new ConcreateStrategyA();

    Context*  pContext  = new Context(pStrategy);

    pContext->ContextInterface();

    delete pContext;

    return 0;

}

 

以下转载自:

http://www.lifevv.com/sysdesign/doc/20071203214955037.html

 

Strategy模式也叫策略模式,是由GoF提出的23种软件设计模式的一种。Strategy模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换。

本文介绍设计模式中的(Strategy)模式的概念,用法,以及实际应用中怎么样使用Strategy模式进行开发。

Strategy模式的概念与应用场景

概要:

- Strategy模式定义一个算法族,并把每一种可能的算法封装成一个类,这些算法可以在应用程序内部被动态替换。策略模式可以降低客户端与算法之间的耦合关系。

- 这些算法具有一个相同的抽象接口,具体的算法通过继承的子类实现。

一个应用程序需要动态切换算法的时候,Strategy模式便变得非常有用。

Strategy模式的应用场景一般是:

- 具有多种可能需要实现的算法

- 需要在程序中对算法进行动态切换

Strategy模式UML类图

设计模式的解析和实现(C++)之十六-Strategy模式 - yolcy - yolcy的博客

Strategy模式的角色:

Strategy

    策略(算法)抽象。

ConcreteStrategy

    各种策略(算法)的具体实现。

Context

    策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。

Strategy模式的应用范例

为了帮助理解,我们举例来说明。

我们的程序要实现加密功能。加密有一个加密算法,加密算法有很多种,比如MD5,DES等,我们的程序需要实现这个功能,就是可以让用户选择不同的加密算法进行加密。

这个过程我们可以用Strategy模式来实现。

文件一览:

Client

    测试类。

EncryptStrategy

    相当于Strategy角色。加密算法的抽象类/接口。

DesStrategy

    相当于ConcreteStrategy角色。Des加密算法。

MD5Strategy

    相当于ConcreteStrategy角色。MD5加密算法。

EncryptContext

    相当于Context角色。

代码:

view plaincopy to clipboardprint?

  1. public class Client {   
  2.     /**  
  3.      * Test Strategy Pattern  
  4.      *   
  5.      */  
  6.     public static void main(String[] args) {   
  7.         //2种不同的策略   
  8.            
  9.         //使用DES策略(算法)   
  10.         EncryptContext context = new EncryptContext(new DesStrategy());   
  11.         context.encrypt();   
  12.            
  13.         //使用MD5策略(算法)   
  14.         context = new EncryptContext(new MD5Strategy());   
  15.         context.encrypt();   
  16.            
  17.     }   
  18. }   
  19.   
  20. /**  
  21.  * Strategy & subclass  
  22.  *  
  23.  */  
  24. interface EncryptStrategy {   
  25.     public void encrypt();   
  26. }   
  27.   
  28. //Strategy'subclass   
  29. class DesStrategy implements EncryptStrategy {   
  30.     public void encrypt() {   
  31.         System.out.println("encrypt by DES algorithm.");   
  32.         //TODO DES algorithm HERE。这里我们没给出具体的算法。   
  33.     }   
  34. }   
  35.   
  36. //Strategy'subclass   
  37. class MD5Strategy implements EncryptStrategy {   
  38.     public void encrypt() {   
  39.         System.out.println("encrypt by MD5 algorithm.");   
  40.         //TODO MD5 algorithm HERE。这里我们没给出具体的算法。   
  41.     }   
  42. }   
  43.   
  44. /**  
  45.  * Context  
  46.  *  
  47.  */  
  48. class EncryptContext {   
  49.     //策略对象   
  50.     EncryptStrategy strategy;   
  51.           
  52.     public EncryptContext(EncryptStrategy strategy) {   
  53.         this.strategy = strategy;   
  54.     }   
  55.        
  56.     //执行具体的策略行为   
  57.     public void encrypt() {   
  58.         strategy.encrypt();   
  59.     }   
  60.        
  61. }  

public class Client {    /**     * Test Strategy Pattern     *      */    public static void main(String[] args) {        //2种不同的策略                //使用DES策略(算法)        EncryptContext context = new EncryptContext(new DesStrategy());        context.encrypt();                //使用MD5策略(算法)        context = new EncryptContext(new MD5Strategy());        context.encrypt();            }}/** * Strategy & subclass * */interface EncryptStrategy {    public void encrypt();}//Strategy'subclassclass DesStrategy implements EncryptStrategy {    public void encrypt() {        System.out.println("encrypt by DES algorithm.");        //TODO DES algorithm HERE。这里我们没给出具体的算法。    }}//Strategy'subclassclass MD5Strategy implements EncryptStrategy {    public void encrypt() {        System.out.println("encrypt by MD5 algorithm.");        //TODO MD5 algorithm HERE。这里我们没给出具体的算法。    }}/** * Context * */class EncryptContext {    //策略对象    EncryptStrategy strategy;           public EncryptContext(EncryptStrategy strategy) {        this.strategy = strategy;    }        //执行具体的策略行为    public void encrypt() {        strategy.encrypt();    }    }

执行Client,输出结果:

C:\Strategy>javac *.java

C:\Strategy>java Client

encrypt by DES algorithm.

encrypt by MD5 algorithm.

C:\Strategy>

我们可以发现,Client里可以动态的切换加密的算法。

Strategy模式与State,Bridge,Template Method等模式的区别

Strategy模式与State模式的结构形式几乎完全一样。但它们的应用场景(目的)却不一样,State模式重在强调对象内部状态的变化改变对象的行为,Strategy模式重在外部对策略的选择,策略的选择由外部条件决定,也就是说算法的动态的切换。但由于它们的结构是如此的相似,我们可以认为“状态模式是完全封装且自修改的策略模式”。

设计模式的解析和实现(C++)之十六-Strategy模式 - yolcy - yolcy的博客设计模式之State - 状态模式

Strategy模式与Bridge模式在结构上存在几分相似。但单从结构上讲,Bridge模式中,存在行为和抽象的两条平行的继承类;但Strategy模式中只有具有继承关系的算法类。它们在应用场景上的区别,大家可以通过上面的文章加以比较,这里不再详述。

设计模式的解析和实现(C++)之十六-Strategy模式 - yolcy - yolcy的博客设计模式之Bridge - 桥接模式

Strategy模式与Template Method模式都是对不同算法的抽象与封装,但它们的实现粒度不一样。Strategy模式从类的角度,对整个算法加以封装,Template Method模式从方法的角度,对算法的一部分加以封装,且Template Method模式有一个方法模板的概念,在作为抽象类的父类里,定义了一个具有固定算法并可以细分为多个步骤的模板方法(public)。

设计模式的解析和实现(C++)之十六-Strategy模式 - yolcy - yolcy的博客设计模式之Template Method - 模板方法模式

  评论这张
 
阅读(309)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017