博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《设计模式》学习笔记——策略模式
阅读量:4111 次
发布时间:2019-05-25

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

        策略模式(Strategy Pattern)是指有一定行动内容的相对稳定的策略名称。一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

意图:
    定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:
    在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:
    一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:
    将这些算法封装成一个一个的类,任意地替换。
关键代码:
    实现同一个接口。
应用实例:
    1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。
    2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 
    3、JAVA AWT 中的 LayoutManager。
优点:
    1、算法可以自由切换。 
    2、避免使用多重条件判断。 
    3、扩展性良好。
缺点: 
    1、策略类会增多。 
    2、所有策略类都需要对外暴露。
使用场景: 
    1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为。
        那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 
    2、一个系统需要动态地在几种算法中选择一种。 
    3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:
    如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

StrategyPattern.h

#pragma once#include
#include
// 抽象策略接口class StrategyPattern{public: StrategyPattern() {}; ~StrategyPattern() {}; virtual void crypt(void) = 0; // 定义了一个加密策略(接口)};// 继承了抽象策略接口类的具体策略类// AES对称加密策略class AESStrategy:public StrategyPattern{public: AESStrategy() {}; ~AESStrategy() {}; virtual void crypt(void) // 实现了一个加密策略(接口) { std::cout << "AESStrategy" << std::endl; }};// 继承了抽象策略接口类的具体策略类// DES 对称加密策略class DESStrategy :public StrategyPattern{public: DESStrategy() {}; ~DESStrategy() {}; virtual void crypt(void) // 实现了一个加密策略(接口) { std::cout << "DESStrategy" << std::endl; }};// 抽象策略接口类的封装类,被称为执行环境class Context{public: void setStrategy(StrategyPattern * strategyPattern) // 对外的策略注入接口 { m_strategyPattern = strategyPattern; } void operatingStrategy(void) // 对外的策略执行接口 { m_strategyPattern->crypt();//执行对应的策略 std::cout << "策略执行" << std::endl; }private: StrategyPattern * m_strategyPattern= nullptr;protected:};

 

StrategyPattern.cpp

#include "StrategyPattern.h"

 

mainTest.cpp

#include
#include
#include "StrategyPattern.h"int main(void){ // 创建一个具体的策略 StrategyPattern* desStrategy = new DESStrategy; // 创建一个具体的策略 StrategyPattern* aesStrategy = new AESStrategy; // 创建策略执行环境 Context* context = new Context; // 注入一个策略 context->setStrategy(desStrategy); // 执行策略 context->operatingStrategy(); // 注入另一个策略 context->setStrategy(aesStrategy); // 执行策略 context->operatingStrategy(); delete context; delete aesStrategy; delete desStrategy; system("pause"); return 0;}

 

转载地址:http://femsi.baihongyu.com/

你可能感兴趣的文章
Android中AsyncTask的简单用法
查看>>
Jenkins 启动命令
查看>>
剑指offer算法题分析与整理(三)
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>
fastcgi_param 详解
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
乘法逆元
查看>>
Objective-C 基础入门(一)
查看>>
Flutter Boost的router管理
查看>>
iOS开发支付集成之微信支付
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>