第三講策略模式課件
單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,第三章 策略模式,韓 格,2011,年,3,月,提綱,3.1,問題描述,3.2,典型案例,3.3,策略模式,3.4,效果與適應(yīng)性,3.1,問題描述,問題,在處理客戶相同的業(yè)務(wù)時(shí),可能有不同的邏輯處理算法??蛻粜枰喾N不同的算法實(shí)現(xiàn)。,客戶希望在運(yùn)行時(shí)根據(jù)上下文選擇其中一個(gè)算法。使用算法的類變得復(fù)雜而難于維護(hù),尤其當(dāng)需要支持多種算法且每種算法都很復(fù)雜時(shí)問題會(huì)更加嚴(yán)重;,不同時(shí)候需要不同的算法,支持并不使用的算法可能帶來性能的負(fù)擔(dān);,算法的實(shí)現(xiàn)和使用算法的對(duì)象緊緊耦合在一起,使新增算法或修改算法變得十分困難,系統(tǒng)應(yīng)對(duì)變化的能力很差。,3.1,問題描述,方法,依據(jù)面向?qū)ο蟮乃枷?,我們所能想到的辦法就是將每種算法的實(shí)現(xiàn)都剝離出來構(gòu)成一個(gè)個(gè)獨(dú)立的算法對(duì)象,再?gòu)倪@些算法對(duì)象中抽象出公共的算法接口,最后將算法接口組合到使用算法的類中。上述思路就引入了一個(gè)新的設(shè)計(jì)模式策略模式。,3.2,典型案例,超市打折收銀軟件,為提高超市收益,超市開展促銷活動(dòng)。除了正常收費(fèi)方式,外,添加對(duì)某些產(chǎn)品打折收費(fèi)和滿額返現(xiàn)收費(fèi)方式。例如:,商品打,8,折、打,7,折、滿,300,元消費(fèi)返回,100,元、滿,500,返,200,。實(shí)現(xiàn)能夠計(jì)算總收費(fèi)額度的功能。,如何添加和修改各式各樣的多種收費(fèi)方式,?,3.2,典型案例,3.2,典型案例,收銀軟件設(shè)計(jì)類圖,3.2,典型案例,abstract class,CashSuper,/,收取現(xiàn)金的父類,public abstract double,AcceptCash(double,cash);,class,CashRebate:CashSuper,/,按一定打折率收取現(xiàn)金類,private double discount=1.0;,public,CashRebate(double,_discount),discount=_discount;,public override double,AcceptCash(double,cash),return cash*discount;,部分核心源碼,3.2,典型案例,public virtual GroupBox CreateGroupBox(String title,Control control),GroupBox gb=new GroupBox();,gb.Text=title;,gb.Dock=DockStyle.Fill;,gb.Controls.Add(control);,control.Dock=DockStyle.Fill;,return gb;,public virtual Panel CreatePanel(),Panel pl=new Panel();,pl.BackColor=Color.White;,pl.Paint+=new PaintEventHandler(pl_Paint);,return pl;,protected void pl_Paint(object sender,PaintEventArgs pea),int nPoint=101;,double w=(Panel)sender).Width-1;,double h=(Panel)sender).Height-1;,Point points=new PointnPoint;,for(int i=0;i nPoint;i+),double t=(double)i)/(nPoint-1);,pointsi.X=(int)(t*w);,pointsi.Y=(int)(4*h*(t-.5)*(t-.5);,Pen p=new Pen(Color.Black);,Graphics g=pea.Graphics;,g.DrawLines(p,points);,3.3,策略模式,策略模式(,Strategy,),它定義了算法家族,分別對(duì)其封裝起來,通過基類讓它們之間可以相互替換,而算法的變化不會(huì)影響到使用算法的客戶。,3.3,策略模式,3.4,效果與適應(yīng)性,優(yōu)點(diǎn),策略模式定義一系列算法,從概念上來看,所有這些算法都是完成相同或相似的工作,只是實(shí)現(xiàn)不同。它能以相同的方式調(diào)用所有算法,減少各種算法類與使用算法類之間的耦合。,策略模式的,Strategy,類層次為,Context,定義了一系列的可供重用的算法或行為。因?yàn)槔^承有助于析取出這些算法的公共功能。,3.4,效果與適應(yīng)性,策略模式也化簡(jiǎn)了單元測(cè)試,因?yàn)槊恳粋€(gè)算法都在一個(gè)類內(nèi),可以通過自己的接口單獨(dú)測(cè)試。,缺點(diǎn),客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴悺Q言之,策略模式只適用于客戶端知道所有的算法或行為的情況。,策略模式造成很多的策略類。有時(shí)候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計(jì)成可共享的,這樣策略類實(shí)例可以被不同客戶端使用。換言之,可以使用享元模式來減少對(duì)象的數(shù)量。,3.4,效果與適應(yīng)性,適用范圍,策略模式就是用來封裝算法的。在實(shí)踐中,我們發(fā)現(xiàn)可以用它來封裝幾乎任何類型的規(guī)則,只要在分析過程中聽到需要再不同情況下應(yīng)用不同的業(yè)務(wù)規(guī)則,就可以考慮使用策略模式處理這種變化的肯能性。,The End,Thanks!,