引用块内容
策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响使用算法的客户。
#include "stdafx.h"
#include<iostream>
using namespace std;
//抽象类算法
class Strategy
{
public:
virtual void AlgorithmInterface()=0;
};
//ConcreteStrategy封装了具体算法。
class ConcreteStrategyA:public Strategy
{
void AlgorithmInterface()
{
cout<<"算法A实现"<<endl;
}
};
class ConcreteStrategyB:public Strategy
{
void AlgorithmInterface()
{
cout<<"算法B实现"<<endl;
}
};
class ConcreteStrategyC:public Strategy
{
void AlgorithmInterface()
{
cout<<"算法C实现"<<endl;
}
};
//Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
class Context
{
public:
Strategy *strategy;
Context(Strategy *strategy)
{
this->strategy = strategy;
}
void ContextInterface()
{
strategy->AlgorithmInterface();
}
};
//策略模式+简单工厂:将实例化具体策略的过程由 客户端转移到 ContextB中来。简单工厂的应用
class ContextB
{
private:
Strategy* strategy;
public:
ContextB(const char* s)
{
switch(*s)
{
case 'A':
{
ConcreteStrategyA *A = new ConcreteStrategyA() ;
strategy = A;
break;
}
case 'B':
{
ConcreteStrategyB *B = new ConcreteStrategyB();
strategy = B;
break;
}
case 'C':
{
ConcreteStrategyC *C = new ConcreteStrategyC();
strategy = C;
break;
}
}
}
void Result()
{
strategy->AlgorithmInterface();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//策略模式
Context context(new ConcreteStrategyA);
context.ContextInterface();
Context contextB(new ConcreteStrategyB);
contextB.ContextInterface();
Context contextC(new ConcreteStrategyC);
contextC.ContextInterface();
//策略+工厂
ContextB B("A");
B.Result();
ContextB C("B");
C.Result();
return 0;
}