设计模式---行为类型---策略
来源:互联网 发布:苹果手机的mac地址在哪 编辑:程序博客网 时间:2024/04/28 02:21
1、意图
定义一系列的算法,把他们一个个封装起来,并且使他们可相互替换。本模式使得算法可独立于使用它的客户而变化。
2、动机
有许多算法可对一个正文流进行分析。将这些算法硬编进使用他们的类中是不可取的,其原因如下:
1)需要换行功能的客户程序如果直接包含换行算法代码的话将会变得复杂,这使得客户程序庞大而且难以维护,尤其当其需要支持多种换行算法时问题会更加严重。
2)不同的时候需要不同的算法,我们不想支持我们并不使用的换行算法。
3)当换行功能是客户程序的一个难以分割的成分时,增加新的换行算法或改变现有算法将十分困难。
3、适用性
当存在以下情况时使用Strategy模式
1)许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
2)需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以替换这些条件语句。
4、C++实例
// Test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <Windows.h>#include <list>#include <string>using namespace std;struct Coord{Coord(){_x = 0;_y = 0;}Coord( int x, int y ){_x = x;_y = y;}int _x;int _y ;};class Compositor{public:virtual int Compose( Coord natural, Coord strecth, Coord shrink,int componentCount, int lineWidth, int breaks ) = 0;protected:Compositor(){}};class Composition{public:Composition( Compositor* comp ){_compositor = comp;_lineWidth = 10;}void Repair();private:Compositor *_compositor;int _componentCount;int _lineWidth;int *_lineBreaks;int _lineCount;};void Composition::Repair(){Coord natural( 1, 2 );Coord stretch( 3, 4 );Coord shrink( 5, 6 );int breakCount;int componentCount = 7;int breaks = 8;breakCount = _compositor->Compose( natural, stretch, shrink, componentCount, _lineWidth, breaks );}class SimpleCompositor: public Compositor{public:SimpleCompositor(){}virtual int Compose( Coord natural, Coord strecth, Coord shrink,int componentCount, int lineWidth, int breaks ) {cout<<"SimpleCompositor:Compose "<<"natural: x : "<<natural._x<<" y : "<<natural._y<<endl;return 0;}};class TexCompositor: public Compositor{public:TexCompositor(){}virtual int Compose( Coord natural, Coord strecth, Coord shrink,int componentCount, int lineWidth, int breaks ) {cout<<"TexCompositor:Compose "<<"strecth: x : "<<strecth._x<<" y : "<<strecth._y<<endl;return 0;}};class ArrayCompositor: public Compositor{public:ArrayCompositor(){}virtual int Compose( Coord natural, Coord strecth, Coord shrink,int componentCount, int lineWidth, int breaks ) {cout<<"ArrayCompositor:Compose "<<"shrink: x : "<<shrink._x<<" y : "<<shrink._y<<endl;return 0;}};int _tmain(int argc, _TCHAR* argv[]){Compositor *simple = new SimpleCompositor;Composition *quick = new Composition( simple );quick->Repair();Compositor *tex = new TexCompositor;Composition *slick = new Composition( tex );slick->Repair();Compositor *array = new ArrayCompositor;Composition *iconic = new Composition( array );iconic->Repair();delete simple;delete quick;delete tex;delete slick;delete array;delete iconic;return 0;}
0 0
- 设计模式---行为类型---策略
- 设计模式-行为-策略
- 设计模式--行为模式--策略模式--Java
- 设计模式 - 行为型模式 - 策略模式
- 设计模式 行为模式之策略模式
- 设计模式->行为型模式->策略模式
- 设计模式--行为型--策略模式
- 设计模式14:策略模式【行为型】
- [设计模式-行为型]策略模式(Strategy)
- 行为设计模式---策略模式(Strategy)
- 设计模式-行为型之策略模式
- 【设计模式】行为模式之Strategy策略
- 行为型设计模式-策略模式
- java-行为型模式-策略设计模式
- 行为型的设计模式-策略模式
- 设计模式---行为类型---命令
- 设计模式---行为类型---迭代器
- 设计模式---行为类型---备忘录
- 二分查找法
- iOS9关键字的简单实用
- 8.蛇形填数
- 面对对象总结
- ({}+{}).length
- 设计模式---行为类型---策略
- java旅行第四天--《一个都不能少》观后感
- JavaScript实用技巧
- 9.韩信点兵
- 结构可变数组
- Android中如何实现一键退出
- DevOps之初探
- 信号之可重入函数、竞态条件
- iOS float类型变量置空值