设计模式之策略模式

1、意图:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
2、结构:
3、应用场合:
1)、许多相关的类仅仅是行为有异。”策略“提供了一种用多个行为中的一个行为来配置一个类的方法。
2)、需要使用一个算法的不同变体。
3)、算法使用客户不应该知道的数据。策略模式以避免暴露复杂的、与算法相关的数据结构。
4)、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入各自的策略类中。
4、参与者
1)、策略(Strategy):
定义所有支持的算法的公共接口。
2)、具体策略(ConcreteStrategy):
实现策略中定义接口,用于实现某具体算法。
3)、上下文(Context):
用一个具体策略对象配置;维护一个对策略对象的引用;可定义一个接口让策略访问它的数据。
5、协作:
具体的算法由客户进行确定。
6、实现:
C++实现的策略模式代码;
//  Defines the entry point for the console application.
//

#include "stdafx.h"
#include "ConcreteStrategy.h"
#include "Context.h"

int main(int argc, char* argv[])
{
	//printf("Hello World!\n");
	//用哪种算法由客户确定
	
	ConcreteStrategy_A strategyA;
	ConcreteStrategy_B strategyB;
	
	//使用A策略
	Context context(&strategyA);
	context.Run();
	
	//动态更改为B策略
	context.SetStrategy(&strategyB);
	context.Run();
	
	//更改回A策略
	context.SetStrategy(&strategyB);
	context.Run();

	return 0;
}

#ifndef _CONTEXT_H_
#define _CONTEXT_H_

#include "strategy.h"

class Context
{
private:
	strategy *p_strategyObj;
public:
	Context(strategy *p_strategyObj);
	~Context();
	void Run();
	void SetStrategy(strategy *p_strategyObj);
};



#endif/*_CONTEXT_H_*/

//
#include "stdafx.h"
#include "Context.h"

Context::Context(strategy *p_strategyObj)
{
	//TODO:ADD CONTEXT INIT
	printf("Create Context Object!\n");
	Context::p_strategyObj = p_strategyObj;
}
Context::~Context()
{
	//TODO:ADD CONTEXT END
	printf("Del Context Object!\n");
}
void Context::Run()
{
	//CALL STRATEGY 
//	printf("Call Algorithm!\n");
	p_strategyObj->AlgorithmInterface();
}

void Context::SetStrategy(strategy *p_strategyObj)
{
	printf("modify strategy!\n");
	Context::p_strategyObj = p_strategyObj;
}

#ifndef _STRATEGY_H_
#define _STRATEGY_H_


class strategy{
private:

public:
	strategy(){};
	~strategy(){};
	virtual void AlgorithmInterface() = 0;
};


#endif/*_STRATEGY_H_*/

#ifndef _CONCRETE_STRATEGY_H_
#define _CONCRETE_STRATEGY_H_

#include "strategy.h"

class ConcreteStrategy_A:public strategy{
private:
	
public:
	ConcreteStrategy_A();
	~ConcreteStrategy_A();
	void AlgorithmInterface();
};


class ConcreteStrategy_B:public strategy{
private:
	
public:
	ConcreteStrategy_B();
	~ConcreteStrategy_B();
	void AlgorithmInterface();
};

#endif/*CONCRETE_STRATEGY_H_*/

// ConcreteStrategy.cpp : concrete strategy class
//
#include "stdafx.h"
#include "ConcreteStrategy.h"

ConcreteStrategy_A::ConcreteStrategy_A()
{
	//TODO:ADD INIT
	printf("Create ConcreteStrategy_A Object!\n");
}
ConcreteStrategy_A::~ConcreteStrategy_A()
{
	//TODO ADD END
	printf("Del ConcreteStrategy_A Object!\n");
}
void ConcreteStrategy_A::AlgorithmInterface()
{
	printf("Useing algorithm A!\n");
}



ConcreteStrategy_B::ConcreteStrategy_B()
{
	//TODO:ADD INIT
	printf("Create ConcreteStrategy_B Object!\n");
}
ConcreteStrategy_B::~ConcreteStrategy_B()
{
	//TODO:ADD END
	printf("Del ConcreteStrategy_B Object!\n");
}

void ConcreteStrategy_B::AlgorithmInterface()
{
	printf("Useing algorithm B!\n");
}

完整的工程代码请到网址 http://download.youkuaiyun.com/detail/apn172/4952123下载
7、类别:对象行为型模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值