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上。