设计模式笔记-Strategy策略模式

原创 2016年05月30日 20:35:59

策略模式,它解决的问题与前一篇Template模式类似,都是为了给逻辑(算法)具体实现和抽象接口之间的解耦。策略模式将接口的实现放在被组合对象中,将抽象接口放在组合类中。策略模式使得算法可以在不影响到客户端的情况下进行替换。它与模板模式的区别是:GoF的设计模式那本书里有这么一句话:"Template methods use inheritance to vary part of an algorithm. Strategies use delegation to vary the entire algorithm."看到这句话估计大家就明白了,策略模式使用组合的方式,允许“整个算法”的替换,而模板模式使用继承的方式,各个具体算法派生类有公共接口,也有各自不同的实现。这基本上也是继承与组合的区别。

以缓冲区替换算法为例,UML图如下:


有几点:

1. 在Cache类中组合了一个ReplaceAlgorithm *类型的指针。这时候在Client中使用时,需要先new一个具体的替换算法对象,然后将该对象的指针传递到Cache构造函数中!这暴露了算法的定义,用户必须对所有算法都有一个掌握--这貌似也是应该的,你都不知道它干什么的,怎么用它!

int main()
{
	Cache cache(new LRU_ReplaceAlgorithm()); //暴露了算法的定义
	cache.Replace();
	return 0;
}
2. 也可以用枚举方式定义算法类型,在Replace函数中传入算法类型参数,类似简单工厂模式!

//Cache需要用到替换算法
enum RA {LRU, FIFO, RANDOM}; //标签
class Cache
{
private:
	ReplaceAlgorithm *m_ra;
public:
	Cache(enum RA ra) 
	{ 
		if(ra == LRU)
			m_ra = new LRU_ReplaceAlgorithm();
		else if(ra == FIFO)
			m_ra = new FIFO_ReplaceAlgorithm();
		else if(ra == RANDOM)
			m_ra = new Random_ReplaceAlgorithm();
		else 
			m_ra = NULL;
	}
	~Cache() { delete m_ra; }
	void Replace() { m_ra->Replace(); }
};
这些都不是重点!
有人可能奇怪,我定义一个函数,里面用if-else语句判断,用户传进来什么参数,我用什么算法,不行吗?当然行,不过这种做法太落后了,不利于扩展,比如:什么时候想多加一个算法,那你得再加一个else语句,这种修改原来代码的行为是架构设计的忌讳,违反了“对扩展开放 对修改关闭”的原则,它比继承的办法还落后!哎,我也没体会到模式的好处,可能是自己造诣不够,做的项目不够大!

与状态模式区别:在解决的问题上,状态模式是解决内在状态的改变,而策略模式是解决内部算法的改变。在解决的方法上,状态模式是自我控制状态的改变,而策略模式是由外部制定使用啥策略。State模式注重的是对象在不同状态下的操作,它的具体实现类中有一个指向Context的引用,而Strategy没有。

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

相关文章推荐

设计模式C++学习笔记之一(Strategy策略模式)

无意中,从网上下到一本电子书《24种设计模式介绍与6大设计原则》,很好奇这里有24种设计模式,印象中GOF写的《设计模式》(Design Patterns),好像只有23种吧。运行起来一看,还真挺吸引...

设计模式C++学习笔记之一(Strategy策略模式)

设计模式C++学习笔记之一(Strategy策略模式) 无意中,从网上下到一本电子书《24种设计模式介绍与6大设计原则》,很好奇这里有24种设计模式,印象中GOF写的《设计模式》(Desig...

设计模式C++学习笔记之一(Strategy策略模式)

博文很精彩,为方便个人学习特转载,地址:http://www.cnblogs.com/wanggary/archive/2011/04/07/2008796.html 无意中,从网上下到一本电子...

设计模式学习笔记--策略模式(Strategy Pattern)

设计模式第一弹,发现在继续深入学习Java相关知识前,很有必要学习下设计模式,其中几个比较重要的设计模式其实在之前的使用中已经出现过很多次,但是由于没有学过设计模式,也就知其然不知其所以然的拿来用了,...

设计模式C++学习笔记之十(Strategy策略模式)

无意中,从网上下到一本电子书《24种设计模式介绍与6大设计原则》,很好奇这里有24种设计模式,印象中GOF写的《设计模式》(Design Patterns),好像只有23种吧。运行起来一看,还真挺吸引...

设计模式学习笔记(三)—Strategy策略模式

GOF《设计模式》一书对Strategy模式是这样描述的:     定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。Strategy模式使算法可独立于使用它的客户而变化。     S...

设计模式学习笔记---策略模式strategy pattern(Java版)

一、场景 市场人员接到单之后的报价策略,比如普通用户或老客户,还是小批量或大批量。 二、实质 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问...

设计模式学习笔记(六)之策略模式(Strategy)

设计模式学习笔记(六)之策略模式(Strategy)                (一):策略模式的定义:        它定义了算法家族,分别封装起来,让他...

[学习笔记]Head First 设计模式 - 策略模式(Strategy)

本章要点: 知道OO基础,并不足以
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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