设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Strategy:(1)、意图: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
#include <iostream>
using namespace std;//策略基类
class COperation
{
public:int m_nFirst;int m_nSecond;virtual double GetResult(){double dResult = 0;return dResult;}
};//策略具体类----加法类
class AddOperation : public COperation
{
public:AddOperation(int a, int b){m_nFirst = a;m_nSecond = b;}virtual double GetResult(){return m_nFirst + m_nSecond;}
};class Context
{
private:COperation* op;
public:Context(COperation* temp){op = temp;}double GetResult(){return op->GetResult();}
};//客户端
int main()
{int a, b;char c;cin>>a>>b;cout<<"请输入运算符:";cin>>c;switch (c){case '+': {Context* context = new Context(new AddOperation(a, b));cout<<context->GetResult()<<endl;break; }default:break;}/*result58请输入运算符:+13*/return 0;
}
//策略与工厂结合:客户端只需访问Context类,而不用知道其它任何类信息,实现了低耦合。
#include <iostream>
using namespace std;//策略基类
class COperation
{
public:int m_nFirst;int m_nSecond;virtual double GetResult(){double dResult = 0;return dResult;}
};//策略具体类----加法类
class AddOperation : public COperation
{
public:AddOperation(int a, int b){m_nFirst = a;m_nSecond = b;}virtual double GetResult(){return m_nFirst + m_nSecond;}
};class Context
{
private:COperation* op;
public:Context(char cType){switch (cType){case '+':op = new AddOperation(5, 8);break;default:break;}}double GetResult(){return op->GetResult();}
};//客户端
int main()
{int a, b;cin>>a>>b;Context* test = new Context('+');cout<<test->GetResult()<<endl;/*result2513*/return 0;
}
示例代码3:
Strategy.h:
#ifndef _STRATEGY_H_
#define _STRATEGY_H_class Strategy
{
public:Strategy();virtual ~Strategy();virtual void AlgrithmInterface() = 0;
protected:
private:
};class ConcreteStrategyA : public Strategy
{
public:ConcreteStrategyA();virtual ~ConcreteStrategyA();void AlgrithmInterface();
protected:
private:
};class ConcreteStrategyB : public Strategy
{
public:ConcreteStrategyB();virtual ~ConcreteStrategyB();void AlgrithmInterface();
protected:
private:
};#endif//~_STRATEGY_H_
Strategy.cpp:
#include "Strategy.h"
#include <iostream>using namespace std;Strategy::Strategy()
{}Strategy::~Strategy()
{cout<<"~Strategy ..."<<endl;
}void Strategy::AlgrithmInterface()
{}ConcreteStrategyA::ConcreteStrategyA()
{}ConcreteStrategyA::~ConcreteStrategyA()
{cout<<"~ConcreteStrategy ..."<<endl;
}void ConcreteStrategyA::AlgrithmInterface()
{cout<<"test ConcreteStrategyA ..."<<endl;
}ConcreteStrategyB::ConcreteStrategyB()
{}ConcreteStrategyB::~ConcreteStrategyB()
{cout<<"~ConcreteStrategyB ..."<<endl;
}void ConcreteStrategyB::AlgrithmInterface()
{cout<<"test ConcreteStrategyB ..."<<endl;
}
Context.h:
#ifndef _CONTEXT_H_
#define _CONTEXT_H_class Strategy;
/*
这个类是Strategy模式的关键,也是Strategy模式和Template模式的根本区别所在。
Strategy通过"组合"(委托)方式实现算法(实现)的异构,而Template模式则采取的是继承的方式。
这两个模式的区别也是继承和组合两种实现接口重用的方式的区别
*/class Context
{
public:Context(Strategy* stg);~Context();void DoAction();
protected:
private:Strategy* _stg;
};#endif//~_CONTEXT_H_
Context.cpp:
#include "Context.h"
#include "Strategy.h"
#include <iostream>using namespace std;Context::Context(Strategy* stg)
{_stg = stg;
}Context::~Context()
{if (!_stg)delete _stg;
}void Context::DoAction()
{_stg->AlgrithmInterface();
}
main.cpp:
#include "Context.h"
#include "Strategy.h"
#include <iostream>using namespace std;int main()
{Strategy* ps = new ConcreteStrategyA();Context* pc = new Context(ps);pc->DoAction();if (NULL != pc)delete pc;/*resulttest ConcreteStrategyA ...*/return 0;
}
策略模式结构图:
参考文献:
1、《大话设计模式C++》
2、《设计模式精解----GoF23种设计模式解析》
3、《设计模式----可复用面向对象软件的基础》
设计模式之策略模式(Strategy)摘录相关推荐
- 锈才学设计模式之 —— 策略模式(Strategy Pattern)
锈才学设计模式之 -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...
- 设计模式实战-策略模式(Strategy Pattern)
0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...
- 设计模式之策略模式(strategy)--游戏角色使用武器
策略模式:定义了算法族,并且让算法之间可以相互替换,它可以将算法实现和算法的使用客户独立. 转载于:https://www.cnblogs.com/beyondwcm/archive/2007/11/ ...
- Java设计模式之——策略模式(Strategy)
一.例子 令狐冲被岳不群罚在思过崖上面壁思过.偶然的机会发现崖内有一个后洞,石壁上刻有魔教十长老尽破五岳剑派的图形招式.所有五岳剑派引以为豪的精微奥妙招式尽数被破得干干净净,包括一些已经失传的招式. ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
最新文章
- excel单元格调用mysql数据_Excel 使用单元格的值 查询MySQL数据库并返回数据给相应的单元格...
- Gym 100431E	Word Cover 题解:KMP上跑dp
- 50个Android开发技巧(09 避免用EditText对日期进行验证)
- SQL Server之字符串函数
- .net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...
- CCF201409-3 字符串匹配(100分)
- 为什么在使用超级终端配置交换机时显示乱码或无显示?
- 一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码
- Structure from Motion Using OpenCV
- 正则判断手机号地区_手机号码验证方法(正则验证)
- 机器学习之层次聚类及代码示例
- Unity学习笔记(一)——基本概念之场景(Scene)
- java中美元符号的作用_$美元符号在配置文件中的意义
- 联想电脑如何启动BIOS并开启CPU虚拟化功能
- php期末作业作业,作业作业作业作业作业作业
- 阿里巴巴-新加坡南洋理工大学成立联合研究院 开展全方位AI合作
- 八股文之linux常用指令
- perl脚本提取后仿中的notimingcheck路径
- ArcGIS Enterprise部署介绍
- 关于 Word 如何创建临时文件的说明
热门文章
- Linux那些事儿 之 戏说USB(9)面纱
- 【TensorFlow2.0】(7) 张量排序、填充、复制、限幅、坐标选择
- memcpy()内存拷贝和赋值操作效率测试
- opencv中image watch插件安装与使用教程
- LeetCode刷题记录5——441. Arranging Coins(easy)
- 从PCD文件写入和读取点云数据
- IDEA Maven项目引入本地外部jar包
- Unity创建使用操纵杆飞行动画教程
- Django 路由分发
- [每日一讲] Python系列:Python概述