【第22期】观点:IT 行业加班,到底有没有价值?

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)

在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:   策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以...

设计模式之Strategy(策略)

设计模式之Strategy(策略) Strategy策略模式是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现. 这里以字符串替代为例, 有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案.<

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

转载处:http://blog.csdn.net/guolin_blog/article/details/8986285

软件设计模式系列之三 STRATEGY(策略)

在说策略之前,我们先来完成这样一项任务。 “做一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费” 这个不是很简单嘛,只要给我们几分钟就好了,之后就有了下面的代码: <pr

策略模式Strategy(对象行为型)

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
  • volts
  • volts
  • 2017-01-21 08:53
  • 55
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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