Welcome

首页 / 软件开发 / C# / 我的Design Pattern之旅[1]:Strategy Pattern (OO)

我的Design Pattern之旅[1]:Strategy Pattern (OO)2010-03-29 cnblogs Abstract

Head First Design Patterns是用strategy pattern当作第一个范例,而陈俊杉教授也是用strategy当作授课的第一个pattern,可见strategy的确适合初学者学第一个学习的pattern。

Intent

定义一整族演算法,将每一个演算法封装起来,可互换使用,更可以在不影响外界的情况下各别抽换所引用的演算法。

其UML表示法

GoF说strategy也称为policy,我个人喜欢称它为plugin,因为可以动态的换演算法,如同在eclipse上可以动态的换plugin一样。

原本在单一class中有一个单一method很单纯,如图Grapher class只有drawShape()这个method,只能画方形。

但後来『需求改变』,希望Grapher也能画三角形和圆形,而且日後还可能增加功能,如画椭圆形,菱形...,当然可以在Grapher陆续加上drawTriangle(),drawCircle(),drawEllipse(),但如此就违反OCP,Grapher须不断的修改,根据DP第三守则"Identify the aspects of your application that vary and separate them from what you stays the same",将『会变』的部份另外包成class,但这些class必须要和原来的class沟通,所以必须订出『标准』彼此才能沟通,IShape就是彼此沟通的标准,Triangle,Circle,Square则必须实做IShape这个interface,这就是strategy pattern。

我们看看这个架构,若日後还有新的shape加入,Grapher,IShape,Triangle,Circle,Square皆不用修改,符合OCP的closed for modification原则,若要加入新的class,只需实做IShape即可,符合OCP的open for extension原则,所以是非常好维护的架构,事实上,.NET Framework和STL都用了很多strategy pattern。

简言之,strategy pattern就是将会变动的member function用class包起来,变成object『挂』在原本的class上。