当前位置: 首页 > news >正文

设计模式 笔记 策略模式 Strategy



//---------------------------15/04/28----------------------------


//Strategy 策略模式----对象行为型模式


/*

    1:意图:

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

    2:别名:

        政策(Policy)

    3:动机:

    4:适用性:

        1>许多相关的类仅仅是行为有异。策略提供了一种用多个行为中的一个行为来配置一个类的方法。

        2>需要使用一个算法的不同变体。

        3>算法使用客户不应该知道的数据。使用策略模式可以避免暴露复杂的与算法相关的数据结构。

        4>一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。

          将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

    5:结构:

            Context:

            strategy--------------------------->Strategy:

            ContextInterface()                  AlgorithmInterface()

                                                    |

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

                                            |                   |

                                    ConcteStrategyA:        ConcreteStrategyB:

                                    AlgorithmInterface()    AlgorithmInterface()

    6:参与者:

        1>Strategy

            定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。

        2>ConcreteStrategy

            根据Strategy定义的接口实现具体算法

        3>Context

            1)用一个ConcreteStrategy对象来配置。

            2)维护一个对Strategy对象的引用。

            3)可定义一个接口来让Strategy访问它的数据。

    7:协作:

        1>StrategyContext相互作用以实现选定的算法,当算法被调用时,Context可以将该算法所需要的所有

          数据都传递给该Strategy。或者使用自身来当作参数传给Strategy

        2>Context将它的客户的请求转发给它的Strategy。客户通常创建并传递一个ConcreteStrategy对象给

          Context;这样客户可以仅与Context交互。

    8:效果:

        1>相关算法系列:

            Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能

        2>一个替代继承的方法:

            如果使用继承来实现不同的算法,会导致Context难以理解,难以维护和难以扩展,并且算法和实现耦合很

            深,所以Strategy模式很好的补足了这些部分。

        3>消除了一些条件语句:

        4>实现的选择:

            Strategy可以提供相同行为的不同实现,客户可以根据不同时间/空间权衡取舍要求,从而选区不同的策略。

        5>客户必须了解不同的Strategy

            这是Strategy模式潜在的一个缺点,客户必须熟知Strategy的实现才能正确选择什么Strategy

        6>StrategyContext的通信开销:

            一些简单的Strategy可能不需要参数,但是为了别的Strategy考虑,ContextStrategy之间

            通信的接口必须要通用,也就是考虑到所有的参数,所以这可能造成浪费。

        7>增加了对象的数目:

            Strategy增加了应用中的对象的数目。可采用Flyweight来减少开销。

    9:实现:

        1>定义StrategyContext接口:

            1)传递一些数据:

                Context可能会发送一些Strategy不需要的数据。这个方法通过加大开销来解耦两个类

            2)传递自己,或在Strategy中存放一个Context的引用:

                这样StrategyContext会更紧密地耦合在一起。

        2>Strategy作为模版参数:

            这样必须满足两点:

            1)可以在编译时选择Strategy

            2)不需要在运行时改变

            这就是属于编译器多态。

        3>使Strategy对象称为可选的:

            如果即使不使用Strategy对象Context还是有意义的话,可以简化Context,让Context在访问Strategy

            前检查是否存在,有就使用,没有就执行缺省的行为。

    10:代码示例:                                                                        */



//Context 里面保存了一个Compositior类的指针,也就是一个ConcreteStrategy

class Composition

{

public:

    Composition(Compositior*);

    void Repair();

private:

    Compositior* _compositor;

    Component* _components;

    int _componentCount;

    int _lineWidth;

    int* _lineBreaks;

    int _lineCount;

};


//Abstract Strategy

class Compositor

{

public:

    virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

                        int componentCount, int lineWidth, int breaks[])=0;

protected:

    compositor();

};


//这里使用到了Strategy的操作,Compose()

void Composition::Repair()

{

    Coord* natural;

    Coord* stretchability;

    Coord* shrinkability;

    int componentCount;

    int* breaks;

    

    int breakCount;

    breakCount = _compositor->Compose(natural, stretchability, shrinkability

                                      componentCount, _lineWidth, breaks);

    

}


//ConcreteStrategy:自己实现自己的Compose具体怎么做

class SimpleCompositor : Compositor

{

public:

    SimpleCompositor();

    virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

                        int componentCount, int lineWidth, int breaks[]);

};


class TexCompositor : Compositor

{

    TexCompositor();

    virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

                        int componentCount, int lineWidth, int breaks[]);

};


class ArrayCompositor : Compositor

{

    ArrayCompositor(int interval);

    virtual int Compose(Coord natural[],Coord stretch[], Coord shrink[],

                        int componentCount, int lineWidth, int breaks[]);

};


//简单的使用,但是每次都要new一个Strategy对象,可以使用Flyweight模式优化

Composition* quick = new Composition(new SimpleCompositor);

Composition* slick = new Composition(new TexCompositor);

Composition* iconic = new Composition(new ArrayCompositor(100));


转载于:https://www.cnblogs.com/boydfd/p/4983114.html

相关文章:

  • 【STL源码剖析读书笔记】【第1章】STL概论与版本简介
  • SET-UID程序漏洞实验
  • Asp与Asp.Net的区别
  • android host usb
  • Fighting
  • 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)
  • Swing基础
  • php post
  • poj--1517
  • Midas Civil的钢束生成器
  • 练习写一个工资结算系统
  • linux的各个子系统
  • 域名注冊以及域名解析设置
  • 约瑟夫环实现之非递归
  • 微信公众号-开发者-自定义菜单-CLICK事件处理
  • @angular/forms 源码解析之双向绑定
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 《剑指offer》分解让复杂问题更简单
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • js如何打印object对象
  • js数组之filter
  • laravel with 查询列表限制条数
  • Next.js之基础概念(二)
  • Rancher-k8s加速安装文档
  • vue脚手架vue-cli
  • vue中实现单选
  • 包装类对象
  • 基于 Babel 的 npm 包最小化设置
  • 聊聊flink的BlobWriter
  • 马上搞懂 GeoJSON
  • 用jQuery怎么做到前后端分离
  • Mac 上flink的安装与启动
  • ​人工智能书单(数学基础篇)
  • #pragma data_seg 共享数据区(转)
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)STL算法之遍历容器
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (42)STM32——LCD显示屏实验笔记
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET CLR基本术语
  • .net core Swagger 过滤部分Api
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET连接MongoDB数据库实例教程
  • .sh
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • []error LNK2001: unresolved external symbol _m