ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

策略模式

2020-07-17 22:31:59  阅读:226  来源: 互联网

标签:context 策略 模式 Strategy 算法 Context strategy


策略模式:

  它定义了算法家族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化,不会影响到使用算法的客户。

结构图如下:

 

 代码:

//算法抽象类

class Strategy

{

//定义支持的算法接口

public viod Algorithminterface();

}

 

//算法子类A

class StrategyChildA : Strategy

{

//算法A的具体实现

public viod Algorithminterface();

}

 

//算法子类B

class StrategyChildB : Strategy

{

//算法A的具体实现

public viod Algorithminterface();

}

 

//Context类

class Context

{

  Strategy strategy ;

public:

//构造时初始化具体的策略对象

  Context(Strategy strategy 

  {

    this.strategy = strategy;

  }

//根据具体策略,调用其具体算法

  void ContextInterface()

  {

    strategy.Algorithminterface();

  }

}

//客户端代码

Context context;

context = new Context(new StrategyChildA() );

context.ContextInterface();//使用算法A的计算结果

 

进阶版——策略工厂:

//Context类

class Context

{

  Strategy strategy ;

public:

//可支持的具体策略

typedef enum TagEnumstrategy

{

StrategyChildA ,

StrategyChildB ,

StrategyChildEnd,

}Enumstrategy;

//构造时初始化具体的策略对象

  Context(Enumstrategy enumstrategy 

  {

    switch(enumstrategy

    {

      case StrategyChildA:

        this.strategy = new StrategyChildA() ;

        break;

      case StrategyChildB:

        this.strategy = new StrategyChildB() ;

        break;

    }

  }

//根据具体策略,调用其具体算法

  void ContextInterface()

  {

    strategy.Algorithminterface();

  }

}

//客户端代码

Contextcontext = null;

context = new Context(StrategyChildA );//比起单纯的策略模式或简单工厂模式,客户端只依赖一个context类,连Strategy父类都不依赖。

context.ContextInterface();//使用算法A的计算结果

 

优点:策略模式封装任意类型的规则,只要需要在不同情况下应用不同的规则算法,就可以考虑策略模式;和简单工厂相比,简单工厂生产具体产品,策略上下文给出具体结果。

缺点:违背开放-封闭原则,每次增改都需要上下文类。并且需要对客户暴露所有策略。

标签:context,策略,模式,Strategy,算法,Context,strategy
来源: https://www.cnblogs.com/haosk/p/13333874.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有