結(jié)構(gòu)型模式組合模式_第1頁
結(jié)構(gòu)型模式組合模式_第2頁
結(jié)構(gòu)型模式組合模式_第3頁
結(jié)構(gòu)型模式組合模式_第4頁
結(jié)構(gòu)型模式組合模式_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、結(jié)構(gòu)型模式組合模式第1頁,共43頁,2022年,5月20日,19點12分,星期二上篇回顧裝飾者模式裝飾者模式:動態(tài)地將職責附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。2第2頁,共43頁,2022年,5月20日,19點12分,星期二3組合模式組合模式有時候又叫做部分-整體模式,它使我們樹型結(jié)構(gòu)的問題中,模糊了簡單元素和復(fù)雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。 第3頁,共43頁,2022年,5月20日,19點12分,星期二4生活中的例子組合模式將對象組合成樹形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu)。讓用戶一致地使用單個對

2、象和組合對象。雖然例子抽象一些,但是算術(shù)表達式確實是組合的例子。算術(shù)表達式包括操作數(shù)、操作符和另一個操作數(shù)。操作數(shù)可以是數(shù)字,也可以是另一個表達式。這樣,2+3和(2+3)+(4*6)都是合法的表達式。第4頁,共43頁,2022年,5月20日,19點12分,星期二5生活中的例子第5頁,共43頁,2022年,5月20日,19點12分,星期二6生活中的例子在Word中我們經(jīng)常會將一些圖形元素進行“組合”,組合以后的圖形還可以向簡單圖元那樣進行移動、變形等等操作;除此以外,在Word中,我們對于一個字符、一個詞組、一句話、一個段落,甚至是整篇文章的操作是相同的,我們都可以進行剪切、復(fù)制,進行字體與大

3、小的調(diào)整,進行顏色的變換。這些例子都是Composite模式的實例,我們將簡單的元素組合成復(fù)雜的元素,然后還可以像操作簡單元素那樣操作組合元素。第6頁,共43頁,2022年,5月20日,19點12分,星期二7認識裝飾者模式結(jié)構(gòu)第7頁,共43頁,2022年,5月20日,19點12分,星期二8認識裝飾者模式參與者Component為組合中的對象聲明接口。在適當?shù)那闆r下,實現(xiàn)所有類共有接口的缺省行為。聲明一個接口用于訪問和管理Component的子組件。在遞歸結(jié)構(gòu)中定義一個接口,用于訪問一個父組件,并在合適的情況下實現(xiàn)。Leaf在組合中表示葉節(jié)點對象,葉節(jié)點對象沒有子節(jié)點。在組合中定義圖元對象的行為

4、。第8頁,共43頁,2022年,5月20日,19點12分,星期二9認識裝飾者模式參與者Composite定義有子部件的那些部件的行為。存儲子部件。在Component接口中實現(xiàn)與子部件有關(guān)的操作。Client通過Component接口操縱組合部件的對象。第9頁,共43頁,2022年,5月20日,19點12分,星期二10示例通過一些基本圖像元素(直線、圓等)以及一些復(fù)合圖像元素(由基本圖像元素組合而成)構(gòu)建復(fù)雜的圖形。在設(shè)計中我們對每一個對象都配備一個Draw()方法,在調(diào)用時,會顯示相關(guān)的圖形。可以看到,這里復(fù)合圖像元素它在充當對象的同時,又是那些基本圖像元素的一個容器。第10頁,共43頁,2

5、022年,5月20日,19點12分,星期二11示例第11頁,共43頁,2022年,5月20日,19點12分,星期二12第一次嘗試namespace NoPattern public abstract class Graphics protected string name; public Graphics(string name) = name; public abstract void Draw(); 第12頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點12分,星期二17存在的問題現(xiàn)在我們要對該圖像元素進行處理:在客戶端程序中,需要判斷返回對象的具體類型到底是基本圖像元素,還是復(fù)合圖像元素。如果是復(fù)合圖像元

9、素,我們將要用遞歸去處理,然而這種處理的結(jié)果卻增加了客戶端程序與復(fù)雜圖像元素內(nèi)部結(jié)構(gòu)之間的依賴,那么我們?nèi)绾稳ソ怦钸@種關(guān)系呢?第17頁,共43頁,2022年,5月20日,19點12分,星期二18使用組合模式透明方式我們希望的是客戶程序可以像處理基本圖像元素一樣來處理復(fù)合圖像元素,這就要引入Composite模式了,需要把對于子對象的管理工作交給復(fù)合圖像元素,為了進行子對象的管理,它必須提供必要的Add(),Remove()等方法。第18頁,共43頁,2022年,5月20日,19點12分,星期二19使用組合模式透明方式第19頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點12

18、分,星期二27使用組合模式透明方式這樣引入Composite模式后,客戶端程序不再依賴于復(fù)合圖像元素的內(nèi)部實現(xiàn)了。然而,我們程序中仍然存在著問題,因為Line,Rectangle,Circle已經(jīng)沒有了子對象,它是一個基本圖像元素,因此Add(),Remove()的方法對于它來說沒有任何意義,而且把這種錯誤不會在編譯的時候報錯,把錯誤放在了運行期,我們希望能夠捕獲到這類錯誤,并加以處理。第27頁,共43頁,2022年,5月20日,19點12分,星期二28如此修改publicclassLine:GraphicspublicLine(stringname) :base(name)publicove

19、rridevoidDraw()Console.WriteLine(Drawa+name.ToString();publicoverridevoidAdd(Graphicsg)/拋出一個我們自定義的異常publicoverridevoidRemove(Graphicsg)/拋出一個我們自定義的異常 第28頁,共43頁,2022年,5月20日,19點12分,星期二29使用組合模式安全方式這樣改進以后,我們可以捕獲可能出現(xiàn)的錯誤,做進一步的處理。上面的這種實現(xiàn)方法屬于透明式的Composite模式,如果我們想要更安全的一種做法,就需要把管理子對象的方法聲明在樹枝構(gòu)件Picture類里面,這樣如果葉子

20、節(jié)點Line,Rectangle,Circle使用這些方法時,在編譯期就會出錯。第29頁,共43頁,2022年,5月20日,19點12分,星期二30使用組合模式安全方式第30頁,共43頁,2022年,5月20日,19點12分,星期二31示例代碼namespace CompositPattern public abstract class Graphics protected string name; public Graphics(string name) = name; public abstract void Draw(); 第31頁,共43頁,2022年,5月20日,

21、19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁,共43頁,2022年,5月20日,19點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頁

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論