策略模式意图将解决问题的算法分别封装成一个个对象的形式,并使这些算法对象相互间可被替换。模式比较简单,对于策略对象结构的设计,可抽象一个抽象基类,并定义好相关算法(纯)虚接口,并由各种具体的实现算法子类实现即可。因此模式的类关系结构图参考如下:

模式编码结构参考如下:

 namespace strategy
{
class IAbstractStrategy
{
public:
// some code here........
virtual void executeAlgorithm() = ; };//class IAbstractStrategy class ConcreteStrategy1 : public IAbstractStrategy
{
public:
// some code here........
virtual void executeAlgorithm() override {
// some code here........
// execute real algorithm code.
// some code here........
} };//class ConcreteStrategy1 class ConcreteStrategy2 : public IAbstractStrategy
{
public:
// some code here........
virtual void executeAlgorithm() override {
// some code here........
// execute real algorithm code.
// some code here........
} };//class ConcreteStrategy2 class Context
{
public:
// some code here........
void doSomething(IAbstractStrategy* pStrategy) {
// e.g
if (nullptr != pStrategy) {
pStrategy->executeAlgorithm();
}
} }; }//namespace strategy

Strategy模式编码结构参考

策略模式主要是在当一个问题的解存在不止一种方案并且这些解有可能随时被替换相互替换的情况下使用。如游戏中的角色的目标选择方案就可考虑使用策略模式。如游戏中的角色技能也可考虑使用策略模式,同一角色当前正在使用普通技能,过会就可能使用法术技能等等。在这些情况下使用策略模式是挺方便的,比较后期想有了新的具体实现策略时,不需要对应用的逻辑结构进行调整,只需要新扩展一个具体实现策略即可。

在编码实现上,设计人员可能需要考虑数据信息如何传递给对应的策略对象中,此时可能需要视具体的环境而定。一种可参考的方案可将策略所需的数据信息骑过参数形式传入。这种方案对于不同的具体实现策略对象来说,却并不一定全都有用。甚至有时为了某个特别的具体实现策略对象来说,需要的参数很多,于是在抽象类上就将所有参数都列入。可实际上,这些参数中的绝对大多数却有可能对其他的那些具体实现策略来说,是完全没有用的。并且后期如果扩展新的实现策略的话,则有可能会影响整个策略类系的接口重新调整。第二种可参考的方案是直接将上下文对象作为参数传入。该方案对于策略类系来说,结构比较稳定,并且任何一个新的或旧的具体实现策略都可以取到它们自己所需要的数据信息。但是这种情况下,势必要求上下文对象必需开放过多的(甚至是)不必要的接口出来。这样就无形当中破坏了封装性。

【行为型】Strategy模式的更多相关文章

  1. 模板模式与策略模式/template模式与strategy模式/行为型模式

    模板模式 模版模式,又被称为模版方法模式,它可以将工作流程进行封装,并且对外提供了个性化的控制,但主流程外界不能修改,也就是说,模版方法模式中,将工作的主体架构规定好,具体类可以根据自己的需要,各自去 ...

  2. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  3. Java 实现策略(Strategy)模式

    策略模式:行为型模式 将同一行为,不同的处理算法分别封装起来.让它们之间能够互相替换 1. 定义一个超类型接口,及 行为方法 2. 定义不同的实现类,实现该行为的 不同的算法 /** * 策略模式:针 ...

  4. 敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式

    1.TEMPLATE METHOD 泛型,也就是这个模式,是可以基于泛型的. 我们往往会有一些算法,比如排序算法.它的算法部分,我可以把它放在一个基类里面,这样具体类型的比较可以放在子类里面. 看如下 ...

  5. Template Method模式和Strategy模式[继承与委托]

    继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...

  6. Strategy 模式

    可以看到 Strategy 模式和 Template 模式解决了类似的问题,也正如在 Template 模式中分析的,Strategy模式和 Template 模式实际是实现一个抽象接口的两种方式:继 ...

  7. C++设计模式---Strategy模式

    一.前言 学习的第一个设计模式!不知道理解的对不对,期望大家一起多交流~ Strategy模式:策略模式,定义了算法族,分别封装起来,此模式可以让算法的变化独立于使用算法的客户.Strategy模式将 ...

  8. 设计模式之Singleton模式和Strategy模式是什么

    Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...

  9. 设计模式之——浅谈strategy模式(策略模式)

    strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...

随机推荐

  1. [后端Day1]Python2.7之基础

    注:以下内容全部为 廖雪峰的官方网站 中学习内容的摘要和总结 输入和输出: name = raw_input('please enter your name: ') print '100 + 200 ...

  2. [AS/400] 基本概念

    本文内容源于 Go4AS400 在 AS/400 中,AS 代表着 Application System.AS/400 是一个安全性高的系统,可以限制用户只能访问.处理特定的信息.AS/400 整合了 ...

  3. php如何同时连接多个数据库

    下面是一个函数能够保证连接多个数据库的下不同的表的函数,可以收藏一下,比较实用,测试过是有用的. function mysql_oper($oper,$db,$table,$where='1',$li ...

  4. 卸载Symantec Endpoint Protection, 无需password的卸载方法

    近期一次偶然的机会, 被人装了个Symantec在电脑上, 搞得各种报警, 验证, 烦死. 然后就自然而然的想卸载掉这个该死的杀毒软件, 没想到这个杀毒软件竟然还是个流氓杀毒软件, 卸载还须要pass ...

  5. Java使用Protocol Buffers入门四步骤

    Protocol Buffers(简称protobuf)是谷歌的一项技术.用于将结构化的数据序列化.反序列化.经经常使用于网络传输. 这货实际上相似于XML生成和解析.但protobuf的效率高于XM ...

  6. Linux如何关闭防火墙和查看防火墙的具体情况

    1.Linux下关闭和开启防火墙 1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后失效 开启: ser ...

  7. C++笔试题库-------Coding整理

    1. 反转字符串 char* strrev1(const char* str) { int len = strlen(str); ]; char *p = temp + len; *p = '\0'; ...

  8. Bellman_ford POJ 3259 Wormholes

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41728   Accepted: 15325 Descr ...

  9. Ubuntu上glibc CVE-2015-7547漏洞的POC验证和修复

    Ubuntu上查看Glibc版本 $ldd --version ldd (Ubuntu GLIBC 2.21-0ubuntu4) 2.21 Ubuntu上查看使用Glibc的相关程序 sudo lso ...

  10. java.util.concurrent.atomic 类包详解

    java.util.concurrent包分成了三个部分,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concurren ...