《第三講策略模式課件》由會員分享,可在線閱讀,更多相關《第三講策略模式課件(15頁珍藏版)》請在裝配圖網上搜索。
1、單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,單擊此處編輯母版標題樣式,第三章 策略模式,韓 格,2011,年,3,月,提綱,3.1,問題描述,3.2,典型案例,3.3,策略模式,3.4,效果與適應性,3.1,問題描述,問題,在處理客戶相同的業(yè)務時,可能有不同的邏輯處理算法??蛻粜枰喾N不同的算法實現。,客戶希望在運行時根據上下文選擇其中一個算法。使用算法的類變得復雜而難于維護,尤其當需要支持多種算法且每種算法都很復雜時問題會更加嚴重;,不同時候需要不同的算法,支持并不使用的算法可能帶來性能的負擔;,算法的實現和使用算法的對象緊緊耦合在一起,使新增算法或修改算法變得十分困難,系
2、統(tǒng)應對變化的能力很差。,3.1,問題描述,方法,依據面向對象的思想,我們所能想到的辦法就是將每種算法的實現都剝離出來構成一個個獨立的算法對象,再從這些算法對象中抽象出公共的算法接口,最后將算法接口組合到使用算法的類中。上述思路就引入了一個新的設計模式策略模式。,3.2,典型案例,超市打折收銀軟件,為提高超市收益,超市開展促銷活動。除了正常收費方式,外,添加對某些產品打折收費和滿額返現收費方式。例如:,商品打,8,折、打,7,折、滿,300,元消費返回,100,元、滿,500,返,200,。實現能夠計算總收費額度的功能。,如何添加和修改各式各樣的多種收費方式,?,3.2,典型案例,3.2,典型案
3、例,收銀軟件設計類圖,3.2,典型案例,abstract class,CashSuper,/,收取現金的父類,public abstract double,AcceptCash(double,cash);,class,CashRebate:CashSuper,/,按一定打折率收取現金類,private double discount=1.0;,public,CashRebate(double,_discount),discount=_discount;,public override double,AcceptCash(double,cash),return cash*discount;,部分
4、核心源碼,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;,p
5、l.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
6、);,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,),它定義了算法家族,分別對其封裝起來,通過基類讓它們之間可以相互替換,而算法的變化不會影響到使用算法的客戶。,3.3,策略模式,3.4,效果與適應性,優(yōu)點,策略模式定義一系列算法,從概念上來看,所有這些算法都是完成相同或相似的工作,只是實現不同。它能以相同的方式調用所有算法,減少各種算法類與使用算法類之間的耦合。,策略模
7、式的,Strategy,類層次為,Context,定義了一系列的可供重用的算法或行為。因為繼承有助于析取出這些算法的公共功能。,3.4,效果與適應性,策略模式也化簡了單元測試,因為每一個算法都在一個類內,可以通過自己的接口單獨測試。,缺點,客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。,策略模式造成很多的策略類。有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。,3.4,效果與適應性,適用范圍,策略模式就是用來封裝算法的。在實踐中,我們發(fā)現可以用它來封裝幾乎任何類型的規(guī)則,只要在分析過程中聽到需要再不同情況下應用不同的業(yè)務規(guī)則,就可以考慮使用策略模式處理這種變化的肯能性。,The End,Thanks!,