设计模式 笔记 策略模式 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>Strategy和Context相互作用以实现选定的算法,当算法被调用时,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>Strategy和Context的通信开销:
一些简单的Strategy可能不需要参数,但是为了别的Strategy考虑,Context和Strategy之间
通信的接口必须要“通用”,也就是考虑到所有的参数,所以这可能造成浪费。
7>增加了对象的数目:
Strategy增加了应用中的对象的数目。可采用Flyweight来减少开销。
9:实现:
1>定义Strategy和Context接口:
1)传递一些数据:
Context可能会发送一些Strategy不需要的数据。这个方法通过加大开销来解耦两个类
2)传递自己,或在Strategy中存放一个Context的引用:
这样Strategy和Context会更紧密地耦合在一起。
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, ;
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 =
));
设计模式 笔记 策略模式 Strategy的更多相关文章
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- [设计模式] 21 策略模式 Strategy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...
- 大熊君说说JS与设计模式之------策略模式Strategy
一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...
- 设计模式之策略模式Strategy
/** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...
- 大话设计模式之策略模式(strategy)
策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户. 针对商城收银模式,打折,返现促销等的例子: 打折还是促销其实都是一些算法,可以用工厂模式来 ...
随机推荐
- [原创]RedHat 安装MySQL数据库
朋友购买了阿里云的服务器,服务器上自带有CentOS操作系统,但是开发软件需要自己安装,接下来将介绍本地RedHat Linux 5.10虚拟机上搭建Mysql数据库. 一.软件准备 (1)jdk-6 ...
- python的类基础
python类的基础: 1,面向对象的基本概念 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的 ...
- SQL Server 复制表结构、整表数据
1.将表1结构复制到表2 SELECT * INTO 表2 FROM 表1 WHERE 1=2 2.将表1内容全部复制到表2 SELECT * INTO 表2 FROM 表1
- JS中的防抖与节流
什么是防抖?and什么是节流?一起来开心的学习下吧. 首先什么是防抖:就是在一定的时间内事件只发生一次,比如你点击button按钮,1秒内任你单身30年手速点击无数次,他也还是只触发一次.举个例子,当 ...
- 基于汇编的 C/C++ 协程 - 背景知识
近几年来,协程在 C/C++ 服务器中的解决方案开始涌现.本文主要阐述以汇编实现上下文切换的协程方案,并且说明其在异步开发模式中的应用. 本文地址:https://segmentfault.com/a ...
- 【webGL】
1.类型化数组 WebGL设计复杂的计算,需要提前知道数值的精度,而标准的javascript数值无法满足需要.WebGL引入了一个概念,叫类型化数组. ArrayBuffer的类型,表示的只是内存中 ...
- Linux命令——用户和用户组管理
Linux命令--用户和用户组管理 命令groupadd 作用:新增组 格式:groupadd [-g GID] groupname 参数:-g,指定GID,一般从500开始 说明:一般不必加-g参数 ...
- CentOS中配置Kafka集群
环境:三台虚拟机Host0,Host1,Host2 Host0:192.168.10.2 Host1: 192.168.10.3 Host2: 192.168.10.4 在三台虚拟机上配置zook ...
- nodeSelector + deamonset
DaemonSet 配置文件的语法和结构与 Deployment 几乎完全一样,只是将 kind 设为 DaemonSet. 选择运行节点:当指定.spec.template.spec.nodeSel ...
- DB2创建function(二)
DB2创建function(一),介绍将function内容作为字段值,或做为一个where条件的情况. DB2创建function(二),介绍返回的内容为一个集合的情况.调用结果集的示例如下: se ...