




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、結(jié)構(gòu)型模式組合模式第1頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二上篇回顧裝飾者模式裝飾者模式:動(dòng)態(tài)地將職責(zé)附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。2第2頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二3組合模式組合模式有時(shí)候又叫做部分-整體模式,它使我們樹(shù)型結(jié)構(gòu)的問(wèn)題中,模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶(hù)程序可以向處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素,從而使得客戶(hù)程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。 第3頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二4生活中的例子組合模式將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu)。讓用戶(hù)一致地使用單個(gè)對(duì)
2、象和組合對(duì)象。雖然例子抽象一些,但是算術(shù)表達(dá)式確實(shí)是組合的例子。算術(shù)表達(dá)式包括操作數(shù)、操作符和另一個(gè)操作數(shù)。操作數(shù)可以是數(shù)字,也可以是另一個(gè)表達(dá)式。這樣,2+3和(2+3)+(4*6)都是合法的表達(dá)式。第4頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二5生活中的例子第5頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二6生活中的例子在Word中我們經(jīng)常會(huì)將一些圖形元素進(jìn)行“組合”,組合以后的圖形還可以向簡(jiǎn)單圖元那樣進(jìn)行移動(dòng)、變形等等操作;除此以外,在Word中,我們對(duì)于一個(gè)字符、一個(gè)詞組、一句話(huà)、一個(gè)段落,甚至是整篇文章的操作是相同的,我們都可以進(jìn)行剪切、復(fù)制,進(jìn)行字體與大
3、小的調(diào)整,進(jìn)行顏色的變換。這些例子都是Composite模式的實(shí)例,我們將簡(jiǎn)單的元素組合成復(fù)雜的元素,然后還可以像操作簡(jiǎn)單元素那樣操作組合元素。第6頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二7認(rèn)識(shí)裝飾者模式結(jié)構(gòu)第7頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二8認(rèn)識(shí)裝飾者模式參與者Component為組合中的對(duì)象聲明接口。在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類(lèi)共有接口的缺省行為。聲明一個(gè)接口用于訪(fǎng)問(wèn)和管理Component的子組件。在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪(fǎng)問(wèn)一個(gè)父組件,并在合適的情況下實(shí)現(xiàn)。Leaf在組合中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)對(duì)象沒(méi)有子節(jié)點(diǎn)。在組合中定義圖元對(duì)象的行為
4、。第8頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二9認(rèn)識(shí)裝飾者模式參與者Composite定義有子部件的那些部件的行為。存儲(chǔ)子部件。在Component接口中實(shí)現(xiàn)與子部件有關(guān)的操作。Client通過(guò)Component接口操縱組合部件的對(duì)象。第9頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二10示例通過(guò)一些基本圖像元素(直線(xiàn)、圓等)以及一些復(fù)合圖像元素(由基本圖像元素組合而成)構(gòu)建復(fù)雜的圖形。在設(shè)計(jì)中我們對(duì)每一個(gè)對(duì)象都配備一個(gè)Draw()方法,在調(diào)用時(shí),會(huì)顯示相關(guān)的圖形??梢钥吹剑@里復(fù)合圖像元素它在充當(dāng)對(duì)象的同時(shí),又是那些基本圖像元素的一個(gè)容器。第10頁(yè),共43頁(yè),2
5、022年,5月20日,19點(diǎn)12分,星期二11示例第11頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二12第一次嘗試namespace NoPattern public abstract class Graphics protected string name; public Graphics(string name) = name; public abstract void Draw(); 第12頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二13第一次嘗試using System;namespace NoPattern public class L
6、ine : Graphics public Line(string name):base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); 第13頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二14第一次嘗試using System;namespace NoPattern public class Circle : Graphics public Circle(string name) : base(name) / public override void Draw() Co
7、nsole.WriteLine(Draw a + name.ToString(); 第14頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二15第一次嘗試using System;namespace NoPattern public class Rectangle : Graphics public Rectangle(string name) : base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); 第15頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二16第
8、一次嘗試using System;using System.Collections;namespace NoPattern public class Picture : Graphics public Picture(string name) : base(name) / public override void Draw() / public ArrayList GetChild() / 第16頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二17存在的問(wèn)題現(xiàn)在我們要對(duì)該圖像元素進(jìn)行處理:在客戶(hù)端程序中,需要判斷返回對(duì)象的具體類(lèi)型到底是基本圖像元素,還是復(fù)合圖像元素。如果是復(fù)合圖像元
9、素,我們將要用遞歸去處理,然而這種處理的結(jié)果卻增加了客戶(hù)端程序與復(fù)雜圖像元素內(nèi)部結(jié)構(gòu)之間的依賴(lài),那么我們?nèi)绾稳ソ怦钸@種關(guān)系呢?第17頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二18使用組合模式透明方式我們希望的是客戶(hù)程序可以像處理基本圖像元素一樣來(lái)處理復(fù)合圖像元素,這就要引入Composite模式了,需要把對(duì)于子對(duì)象的管理工作交給復(fù)合圖像元素,為了進(jìn)行子對(duì)象的管理,它必須提供必要的Add(),Remove()等方法。第18頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二19使用組合模式透明方式第19頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二20示例代碼n
10、amespace CompositPattern public abstract class Graphics protected string name; public Graphics(string name) = name; public abstract void Draw(); public abstract void Add(Graphics g); public abstract void Remove(Graphics g); 第20頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二21示例代碼using System;namespace Compo
11、sitPattern public class Line : Graphics public Line(string name):base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); public override void Add(Graphics g) / public override void Remove(Graphics g) / 第21頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二22示例代碼using System;namespace Composit
12、Pattern public class Circle : Graphics public Circle(string name) : base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); public override void Add(Graphics g) / public override void Remove(Graphics g) / 第22頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二23示例代碼using System;namespace Compo
13、sitPattern public class Rectangle : Graphics public Rectangle(string name) : base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); public override void Add(Graphics g) / public override void Remove(Graphics g) / 第23頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二24示例代碼using System;using
14、System.Collections;namespace CompositPattern public class Picture : Graphics protected ArrayList picList = new ArrayList(); public Picture(string name) : base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); foreach (Graphics g in picList) g.Draw(); public override voi
15、d Add(Graphics g) picList.Add(g); public override void Remove(Graphics g) picList.Remove(g); 第24頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二25示例代碼using System;using System.Collections;namespace CompositPattern public class Picture : Graphics protected ArrayList picList = new ArrayList(); public Picture(string name
16、) : base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); foreach (Graphics g in picList) g.Draw(); public override void Add(Graphics g) picList.Add(g); public override void Remove(Graphics g) picList.Remove(g); 第25頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二26示例代碼using System;namesp
17、ace CompositPattern public class Tester public static void Main() Picture pic = new Picture(Root); pic.Add(new Line(Line); pic.Add(new Circle(Circle); Rectangle r = new Rectangle(Rectangle); pic.Add(r); pic.Draw(); Line l = new Line(Line); r.Add(l); r.Remove(l); r.Draw(); 第26頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12
18、分,星期二27使用組合模式透明方式這樣引入Composite模式后,客戶(hù)端程序不再依賴(lài)于復(fù)合圖像元素的內(nèi)部實(shí)現(xiàn)了。然而,我們程序中仍然存在著問(wèn)題,因?yàn)長(zhǎng)ine,Rectangle,Circle已經(jīng)沒(méi)有了子對(duì)象,它是一個(gè)基本圖像元素,因此Add(),Remove()的方法對(duì)于它來(lái)說(shuō)沒(méi)有任何意義,而且把這種錯(cuò)誤不會(huì)在編譯的時(shí)候報(bào)錯(cuò),把錯(cuò)誤放在了運(yùn)行期,我們希望能夠捕獲到這類(lèi)錯(cuò)誤,并加以處理。第27頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二28如此修改publicclassLine:GraphicspublicLine(stringname) :base(name)publicove
19、rridevoidDraw()Console.WriteLine(Drawa+name.ToString();publicoverridevoidAdd(Graphicsg)/拋出一個(gè)我們自定義的異常publicoverridevoidRemove(Graphicsg)/拋出一個(gè)我們自定義的異常 第28頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二29使用組合模式安全方式這樣改進(jìn)以后,我們可以捕獲可能出現(xiàn)的錯(cuò)誤,做進(jìn)一步的處理。上面的這種實(shí)現(xiàn)方法屬于透明式的Composite模式,如果我們想要更安全的一種做法,就需要把管理子對(duì)象的方法聲明在樹(shù)枝構(gòu)件Picture類(lèi)里面,這樣如果葉子
20、節(jié)點(diǎn)Line,Rectangle,Circle使用這些方法時(shí),在編譯期就會(huì)出錯(cuò)。第29頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二30使用組合模式安全方式第30頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二31示例代碼namespace CompositPattern public abstract class Graphics protected string name; public Graphics(string name) = name; public abstract void Draw(); 第31頁(yè),共43頁(yè),2022年,5月20日,
21、19點(diǎn)12分,星期二32示例代碼using System;namespace CompositPattern public class Line : Graphics public Line(string name):base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); 第32頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二33示例代碼using System;namespace CompositPattern public class Circle : Graphic
22、s public Circle(string name) : base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); 第33頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二34示例代碼using System;namespace CompositPattern public class Rectangle : Graphics public Rectangle(string name) : base(name) / public override void Draw()
23、Console.WriteLine(Draw a + name.ToString(); 第34頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二35示例代碼using System;using System.Collections;namespace CompositPattern public class Picture : Graphics protected ArrayList picList = new ArrayList(); public Picture(string name) : base(name) / public override void Draw() Cons
24、ole.WriteLine(Draw a + name.ToString(); foreach (Graphics g in picList) g.Draw(); public void Add(Graphics g) picList.Add(g); public void Remove(Graphics g) picList.Remove(g); 第35頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二36示例代碼using System;using System.Collections;namespace CompositPattern public class Picture :
25、 Graphics protected ArrayList picList = new ArrayList(); public Picture(string name) : base(name) / public override void Draw() Console.WriteLine(Draw a + name.ToString(); foreach (Graphics g in picList) g.Draw(); public void Add(Graphics g) picList.Add(g); public void Remove(Graphics g) picList.Remove(g); 第36頁(yè),共43頁(yè),2022年,5月20日,19點(diǎn)12分,星期二37示例代碼using System;namespace CompositPattern public class Tester public static void Main() Picture pic = new Picture(Root); pic.Add(new Line(Line); pic.Add(new Circle(Circle); Rectangle r = new Rectangle(Rectangle); pic.Add(r); pic.Draw(); r.Draw(); 第37頁(yè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)藥店合作合同范本
- 丹麥工作合同范本
- 辦理消防驗(yàn)收合同范本
- 個(gè)人工資合同范本
- 入股公司項(xiàng)目合同范本
- 2024年云浮聯(lián)通招聘考試真題
- 東莞代理記賬合同范本
- 2025東風(fēng)公司全球校園招聘筆試參考題庫(kù)附帶答案詳解
- 買(mǎi)賣(mài)車(chē)訂金合同范本
- 2024年河南濮陽(yáng)工學(xué)院籌建處 引進(jìn)考試真題
- 春節(jié)后復(fù)產(chǎn)復(fù)工培訓(xùn)
- 刑事案件及分析報(bào)告
- 《奧運(yùn)歷史》課件
- 《紅樓夢(mèng)》重點(diǎn)情節(jié)梳理
- 《感染性休克的治療》課件
- 《消費(fèi)者權(quán)益與法律保護(hù)》課程培訓(xùn)教案課件
- 中醫(yī)基礎(chǔ)理論-
- 水利站工作計(jì)劃
- 五年級(jí)下冊(cè)音樂(lè)課程綱要
- 食材配送、包裝、運(yùn)輸、驗(yàn)收、售后服務(wù)方案應(yīng)急預(yù)案
- 萬(wàn)千教育學(xué)前讀懂兒童的思維:支持自主游戲中的圖式探索
評(píng)論
0/150
提交評(píng)論