Strategy 模式

原创 2016年06月01日 15:29:53

问题

Strategy 模式和 Template 模式要解决的问题是相同 (类似)的, 都是为了给业务逻辑 (算法) 具体实现和抽象接口之间的解耦。 Strategy 模式将逻辑(算法) 封装到一个类( Context)里面, 通过组合的方式将具体算法的实现在组合对象中实现, 再通过委托的方式将抽象接口的实现委托给组合对象实现。


解决方案

这里的关键就是将算法的逻辑抽象接口( DoAction)封装到一个类中( Context),再
通过委托的方式将具体的算法实现委托给具体的 Strategy 类来实现( ConcreteStrategeA、ConcreteStrategeB类)。
这里写图片描述


实现

#pragma once
//Context.h

namespace StrategyPattern
{
    //前置声明
    class Strategy;
    /**
    *这个类是 Strategy 模式的关键,也是 Strategy 模式和 Template 模式的根本区别所在。
    *Strategy 通过“组合”(委托) 方式实现算法(实现) 的异构,而 Template 模式则采取的是继承的方式
    *这两个模式的区别也是继承和组合两种实现接口重用的方式的区别
    */

    class Context
    {
    public:
        Context(Strategy* stg);
        ~Context();
        void DoAction();
        void SetAction(Strategy* stg);
    protected:
    private:
        Strategy* _stg;
    };
}

//Context.cpp
#include "Context.h"
#include "StrategyPattern.h"
#include <iostream>
using namespace std;

namespace StrategyPattern
{
    Context::Context(Strategy* stg)
    {
        _stg = stg;
    }
    Context::~Context()
    {
        if (!_stg)
            delete _stg;
    }
    void Context::DoAction()
    {
        _stg->AlgrithmInterface();
    }

    void Context::SetAction(Strategy* stg)
    {
        _stg = stg;
    }
}
//StrategyPattern.h
#pragma once

namespace StrategyPattern
{
    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:
    };

};

//StrategyPattern.cpp
#include "StrategyPattern.h"
#include <iostream>
using namespace std;

namespace StrategyPattern
{
    Strategy::Strategy()
    {
    }

    Strategy::~Strategy()
    {
        cout<<"~Strategy....."<<endl;
    }

    void Strategy::AlgrithmInterface()
    {
    }


    //////////////////////////////////////////////////////////////
    ConcreteStrategyA::ConcreteStrategyA()
    {
    }

    ConcreteStrategyA::~ConcreteStrategyA()
    {
        cout<<"~ConcreteStrategyA....."<<endl;
    }

    void ConcreteStrategyA::AlgrithmInterface()
    {
        cout<<"test ConcreteStrategyA....."<<endl;
    }
    ////////////////////////////////////////////////////////////////
    ConcreteStrategyB::ConcreteStrategyB()
    {
    }
    ConcreteStrategyB::~ConcreteStrategyB()
    {
        cout<<"~ConcreteStrategyB....."<<endl;
    }
    void ConcreteStrategyB::AlgrithmInterface()
    {
        cout<<"test ConcreteStrategyB....."<<endl;
    }
}

//main.cpp

#include "Context.h"
#include "StrategyPattern.h"
int main()
{
    StrategyPattern::Strategy *pa = new StrategyPattern::ConcreteStrategyA();
    StrategyPattern::Strategy *pb = new StrategyPattern::ConcreteStrategyB();

    StrategyPattern::Context *pc = new StrategyPattern::Context(pa);
    pc->DoAction();

    pc->SetAction(pb);
    pc->DoAction();

    if (pa)
    {
        delete pa;
    }
    if (pb)
    {
        delete pb;
    }

    if (pc)
    {
        delete pc;
    }

    return 0;


}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

邮寄收费系统 strategy模式运用

  • 2014年01月08日 20:45
  • 7KB
  • 下载

strategy策略模式源码

  • 2010年02月23日 14:25
  • 3KB
  • 下载

Java设计模式透析之 —— 策略(Strategy)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8986285 今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他...

策略模式(Strategy)

  • 2012年06月05日 11:39
  • 2KB
  • 下载

Java Design Patterns--Strategy Pattern --策略模式

一.创建接口 public interface Strategy { public int doOperation(int num1, int num2); } 二.创建具体的实现类,实现St...

Strategy模式

  • 2014年04月16日 11:17
  • 13KB
  • 下载

每天感悟总结-策略模式Strategy

  • 2009年03月10日 09:59
  • 4KB
  • 下载

Strategy 策略模式

意图:     定义了算法家族,分别封装起来让它们之间可以互相替换,此模式让算法的变化不会影响 到使用算法的客户。 结构: 代码: abstract class Strategy{ public ...

Strategy设计模式范例

  • 2014年06月26日 17:16
  • 15KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Strategy 模式
举报原因:
原因补充:

(最多只允许输入30个字)