博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式(Strategy Pattern)
阅读量:5113 次
发布时间:2019-06-13

本文共 2395 字,大约阅读时间需要 7 分钟。

策略模式(Strategy Pattern)

概念

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

模式结构

1559814240966

模式实例与解析

这里的例子还是上文中的计算器加减乘除的设计。

与原先的简单工厂模式比较,这里提供了一个类Context,在主函数中判断是哪一算法。

#include 
using namespace std;class Operation{public: virtual double GetResult() { double dResult = 0; return dResult; }public: int m_nFirst; int m_nSecond;};class AddOperation : public Operation{public: AddOperation(int a, int b) { m_nFirst = a; m_nSecond = b; } virtual double GetResult() { return m_nFirst + m_nSecond; }};class SubOperation : public Operation{public: SubOperation(int a, int b) { m_nFirst = a; m_nSecond = b; } virtual double GetResult() { return m_nFirst - m_nSecond; }};class Context{public: Context(Operation * temp) { op = temp; } double GetResult() { return op->GetResult(); }private: Operation * op;};int main(){ int a, b; char c; cin >> a >> b; cout << "plz input operator:" << endl; cin >> c; switch(c) { Context * context; case '+': context = new Context(new AddOperation(a, b)); cout << context->GetResult() << endl; break; case '-': context = new Context(new SubOperation(a, b)); cout << context->GetResult() << endl; break; }}

优缺点

策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理变化的可能性。

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

优点:适合类中的成员以方法为主,算法经常变动简化了单元测试(因为每个算法都有自己的类,可以通过自己的接口单独测试)

策略模式和简单工厂基本相同,但简单工厂模式只能解决对象创建问题,对于经常变动的算法应使用策略模式。

缺点:客户端要做出判断是哪一个算法,为了将这部分判断移走,可以和简单工厂模式结合。

策略模式与简单工厂结合

修改部分,其余不变:

class Context{public:    Context(char cType)    {        switch(cType)        {        case '+':            op = new AddOperation(3, 8);            break;        case '-':            op = new SubOperation(5, 2);            break;        }    }    double GetResult()    {        return op->GetResult();    }private:    Operation * op;};int main(){    Context * test = new Context('+');    cout << test->GetResult() << endl;    return 0;}

小结

我们再来比较简单工厂和结合模式两种的客户端代码:

工厂模式:

Operation * op = CalculatorFactory::Create('+');    double result = op->GetResult();

结合模式:

Context * test = new Context('+');    cout << test->GetResult() << endl;

在结合模式中对于客户端来说只需要知道有Context类就行了,降低了耦合度。


参考:

  1. 《大话设计模式》 程杰

转载于:https://www.cnblogs.com/Mered1th/p/10986393.html

你可能感兴趣的文章
jmeter(十五)Jmeter默认报告优化
查看>>
HTML5与HTML4的区别(2)
查看>>
ES DSL 基础查询语法学习笔记
查看>>
oracle中的exists 和not exists 用法详解
查看>>
4月10号总结
查看>>
JVM内存堆布局图解分析
查看>>
Sitecore性化 - 您需要了解的4件事
查看>>
Oracle Process Cloud流程云实践
查看>>
利用setTimeout来实现setInterval
查看>>
【字符串】Simplify Path(栈)
查看>>
赋值、浅拷贝和深拷贝的关系
查看>>
UVA1391/LA3713 Astronauts
查看>>
openstack barbican重要概念
查看>>
centos中的shell编程
查看>>
(DP)uva 10036 Problem C: Divisibility
查看>>
web界面直连MySql数据库
查看>>
实现js中的时间格式中的T
查看>>
查看TCP IP协议中端口号对应的进程
查看>>
C# 封装微信的模板消息
查看>>
STL 2—迭代器相关运算——advance(),distance(),next(),prev()
查看>>