Strategy模式

Strategy模式

 
    Strategy模式和Template模式要解决的问题是相同的,都是为了实现业务逻辑具体实现和抽象接口之间的解耦。
Strategy模式将逻辑算法封装到一个类中,通过组合的方式将具体算法的实现放在组合对象中实现,再通过委托的方式
将抽象接口的实现委托给组合对象实现。Strategy模式和Template模式实际上是实现一个抽象接口的两种方式--组合
和继承之间的区别。State也有类似功能。

 
C++代码示例:

//strategy.h
#ifndef STRATEGY_H
#define STRATEGY_H

class Strategy{

public:
    Strategy();
    virtual ~Strategy();
    virtual void AlgrithmInterface() = 0;
};

class ConcreteStrategyA : public Strategy{

public:
    ConcreteStrategyA();
    virtual ~ConcreteStrategyA();
    void AlgrithmInterface();
};

class ConcreteStrategyB : public Strategy{

public:
    ConcreteStrategyB();
    virtual ~ConcreteStrategyB();
    void AlgrithmInterface();
};

#endif // STRATEGY_H


//strategy.cpp
#include "strategy.h"
#include <iostream>

using std::cout;
using std::endl;

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 << "Trest ConcreteStrategyB..." << endl;
}
//context.h
#ifndef CONTEXT_H
#define CONTEXT_H

class Strategy;

class Context{  //这个类是Strategy模式的关键

public:
    Context(Strategy* strategy);
    ~Context();
    void DoAction();
private:
    Strategy* m_strategy;
};

#endif // CONTEXT_H

//context.cpp
#include "context.h"
#include "strategy.h"
#include <iostream>

Context::Context(Strategy* strategy){

    m_strategy = strategy;
}

Context::~Context(){

    if(m_strategy)
        delete m_strategy;
}

void Context::DoAction(){

    m_strategy->AlgrithmInterface();
}

//main.cpp
#include "context.h"
#include "strategy.h"
#include <iostream>

int main()
{
    Strategy* ps;
    ps = new ConcreteStrategyA();
    Context* pc = new Context(ps);
    pc->DoAction();
    if(NULL != pc)
        delete pc;
    return 0;
}
//运行结果:


 
 
 
***简单说一下继承和组合的优缺点 //这里没有对私有保护公有多重继承/组合展开分析,不过优缺点差不多就这些了
一、继承:
  优点:易于修改和扩展那些被复用的实现。
  缺点:1)破坏了封装性 2)”白盒“复用 3)当父类的实现更改时,所有子类不得不随之改变 4)从父类继承而来的实现在运行
期间不能改变,编译时期就已确定。
二、组合:
  优点:1)"黑盒"复用 2)封装性好 3)实现和抽象的依赖性小 4)可以在运行期间动态定义实现(通过一个指向相同类型的指针,
典型的是指向基类的指针).
  缺点:系统中对象过多等。

//如有欠缺,还望看此博文的朋友补充。。。





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值