设计模式笔记-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没有。

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

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

先说说题外话。公司的代码就像老而陈旧的破船,更新迭代过程中上面打满的补丁,并且还捕捞了一只巨大的鲸鱼。 每当在想去重新改建一下,让这艘船更加健壮,就会有新的需求过来,让原本已经破败的小船更加不堪。周...
  • Agou_66
  • Agou_66
  • 2017年11月30日 15:09
  • 45

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

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

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

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

设计模式学习笔记(四):策略模式【Strategy】

刘备要到江东娶老婆了,走之前诸葛亮给赵云

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

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

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

排序方法的种类:  {冒着路兮}

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

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

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

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

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

转自 : http://www.cnblogs.com/wanggary/archive/2011/04/07/2008796.html 设计模式C++学习笔记之一(Strategy策略模式)...

【设计模式】学习笔记1:策略模式(Strategy)

策略模式定义 定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 设计原则1: 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式笔记-Strategy策略模式
举报原因:
原因补充:

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