版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、封面Java設計模式設計模式 耿祥義耿祥義 張躍平張躍平 著著 2022-6-281清華大學出版社清華大學出版社 設計模式的誕生與發(fā)展 模式的誕生與定義 模式起源于建筑業(yè)而非軟件業(yè) 模式(Pattern)之父美國加利佛尼亞大學環(huán)境結(jié)構(gòu)中心研究所所長Christopher Alexander博士 A Pattern Language: Towns, Buildings, Construction253個建筑和城市規(guī)劃模式 模式 Context(模式可適用的前提條件) Theme或Problem(在特定條件下要解決的目標問題) Solution(對目標問題求解過程中各種物理關(guān)系的記述)設計模式的誕
2、生與發(fā)展Christopher Alexander設計模式的誕生與發(fā)展w 模式的誕生與定義 Alexander給出了關(guān)于模式的經(jīng)典定義:每給出了關(guān)于模式的經(jīng)典定義:每個模式都描述了一個個模式都描述了一個在我們的環(huán)境中不斷出在我們的環(huán)境中不斷出現(xiàn)的問題現(xiàn)的問題,然后描述了該問題的,然后描述了該問題的解決方案解決方案的的核心,通過這種方式,我們可以無數(shù)次地重核心,通過這種方式,我們可以無數(shù)次地重用那些已有的解決方案,無需再重復相同的用那些已有的解決方案,無需再重復相同的工作。工作。 模式是在模式是在特定環(huán)境特定環(huán)境中中解決問題解決問題的一種的一種方案方案 設計模式的誕生與發(fā)展w 軟件模式 1990
3、年,軟件工程界開始關(guān)注年,軟件工程界開始關(guān)注Christopher Alexander等在這一住宅、公共建筑與城市規(guī)劃領(lǐng)等在這一住宅、公共建筑與城市規(guī)劃領(lǐng)域的重大突破,最早將該模式的思想引入軟件工程域的重大突破,最早將該模式的思想引入軟件工程方法學的是方法學的是1991-1992年以年以“四人組四人組(Gang of Four,GoF,分別是,分別是Erich Gamma, Richard Helm, Ralph Johnson和和John Vlissides)”自稱的自稱的四位著名軟件工程學者,他們在四位著名軟件工程學者,他們在1994年歸納發(fā)表了年歸納發(fā)表了23種在軟件開發(fā)中使用頻率較高的
4、設計模式,旨在種在軟件開發(fā)中使用頻率較高的設計模式,旨在用模式來統(tǒng)一溝通面向?qū)ο蠓椒ㄔ诜治觥⒃O計和實用模式來統(tǒng)一溝通面向?qū)ο蠓椒ㄔ诜治?、設計和實現(xiàn)間的鴻溝現(xiàn)間的鴻溝。設計模式的誕生與發(fā)展設計模式的誕生與發(fā)展設計模式的發(fā)展 1987年,Kent Beck和Ward Cunningham借鑒Alexander的模式思想在程序開發(fā)中開始應用一些模式 ,在OOPSLA會議上發(fā)表了他們的成果。 1990年,OOPSLA與ECOOP聯(lián)合舉辦,Erich Gamma和Richard Helm等人開始討論有關(guān)模式的話題(Bruce Anderson主持),“四人組” 正式成立,并開始著手進行設計模式的分類整理
5、工作。 1991 年,OOPSLA,Bruce Anderson主持了首次針對設計模式的研討會 。 1992 年,OOPSLA ,Anderson再度主持研討會,模式已經(jīng)逐漸成為人們討論的話題。 注: OOPSLA (Object-Oriented Programming, Systems, Languages & Applications,面向?qū)ο缶幊?、系統(tǒng)、語言和應用大會),編程語言及軟件工程國際頂級會議,2010年改為SPLASH - Systems, Programming, Languages and Applications: Software for Humanity 設
6、計模式的誕生與發(fā)展 設計模式的發(fā)展 1993年,Kent Beck 和 Grady Booch 贊助了第一次關(guān)于設計模式的會議,這個設計模式研究組織發(fā)展成為著名的Hillside Group研究組。 1994 年,由Hillside Group發(fā)起,在美國伊利諾伊州(Illinois)的Allerton Park召開了第1屆關(guān)于面向?qū)ο竽J降氖澜缧詴h,名為PLoP(Pattern Languages of Programs, 編程語言模式會議),簡稱PLoP94。 1995年,PLoP95 仍在伊利諾伊州的Allerton Park舉行 ,“四人組”出版了設計模式:可復用面向?qū)ο筌浖幕A(chǔ)(
7、Design Patterns: Elements of Reusable Object-Oriented Software)一書,本書成為1995年最搶手的面向?qū)ο髸?,也成為設計模式的經(jīng)典書籍。 設計模式的誕生與發(fā)展 設計模式的發(fā)展 從1995年至今,設計模式在軟件開發(fā)中得以廣泛應用,在Sun的Java SE/Java EE平臺和Microsoft的.net平臺設計中就應用了大量的設計模式。 誕生了越來越多的與設計模式相關(guān)的書籍和網(wǎng)站,設計模式也作為一門獨立的課程或作為軟件體系結(jié)構(gòu)等課程的重要組成部分出現(xiàn)在國內(nèi)外研究生和大學教育的課堂上。設計模式的定義與分類 設計模式的定義 設計模式(De
8、sign Pattern)是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設計經(jīng)驗的總結(jié),使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式的定義與分類 設計模式的基本要素 設計模式一般有如下幾個基本要素:模式名稱、問題、目的、解決方案、效果、實例代碼和相關(guān)設計模式,其中的關(guān)鍵元素包括以下四個方面:模式名稱 (Pattern name) 問題 (Problem) 解決方案 (Solution) 效果 (Consequences) 設計模式的定義與分類 設計模式的分類根據(jù)其目的(模式是用來做什么的)可分為創(chuàng)建型(Creational),結(jié)構(gòu)型(Structural
9、)和行為型(Behavioral)三種: 創(chuàng)建型模式主要用于創(chuàng)建對象。 結(jié)構(gòu)型模式主要用于處理類或?qū)ο蟮慕M合。 行為型模式主要用于描述對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?。GoF設計模式簡介 w創(chuàng)建型模式抽象工廠模式抽象工廠模式(Abstract Factory)建造者模式建造者模式(Builder)工廠方法模式工廠方法模式(Factory Method)原型模式原型模式(Prototype)單例模式單例模式(Singleton) GoF設計模式簡介 w 結(jié)構(gòu)型模式適配器模式適配器模式(Adapter)橋接模式橋接模式(Bridge)組合模式組合模式(Composite)裝飾模式裝飾模式(Deco
10、rator)外觀模式外觀模式(Facade)享元模式享元模式(Flyweight)代理模式代理模式(Proxy)GoF設計模式簡介 w行為型模式職責鏈模式職責鏈模式(Chain of Responsibility)命令模式命令模式(Command)解釋器模式解釋器模式(Interpreter)迭代器模式迭代器模式(Iterator)中介者模式中介者模式(Mediator)備忘錄模式備忘錄模式(Memento)觀察者模式觀察者模式(Observer)狀態(tài)模式狀態(tài)模式(State)策略模式策略模式(Strategy)模板方法模式模板方法模式(Template Method)訪問者模式訪問者模式(V
11、isitor)設計模式的優(yōu)點 設計模式是從許多優(yōu)秀的軟件系統(tǒng)中總結(jié)出的成功的、能夠?qū)崿F(xiàn)可維護性復用的設計方案,使用這些方案將避免我們做一些重復性的工作,而且可以設計出高質(zhì)量的軟件系統(tǒng)。 設計模式的主要優(yōu)點如下: 設計模式融合了眾多專家的經(jīng)驗,并以一種標準的形式供廣大開發(fā)人員所用,它提供了一套通用的設計詞匯和一種通用的語言以方便開發(fā)人員之間溝通和交流,使得設計方案更加通俗易懂。對于使用不同編程語言的開發(fā)和設計人員可以通過設計模式來交流系統(tǒng)設計方案,每一個模式都對應一個標準的解決方案,設計模式可以降低開發(fā)人員理解系統(tǒng)的復雜度。設計模式的優(yōu)點 設計模式使人們可以更加簡單方便地復用成功的設計和體系結(jié)構(gòu)
12、,將已證實的技術(shù)表述成設計模式也會使新系統(tǒng)開發(fā)者更加容易理解其設計思路。設計模式使得重用成功的設計更加容易,并避免那些導致不可重用的設計方案。 設計模式使得設計方案更加靈活,且易于修改。 設計模式的使用將提高軟件系統(tǒng)的開發(fā)效率和軟件質(zhì)量,且在一定程度上節(jié)約設計成本。 設計模式有助于初學者更深入地理解面向?qū)ο笏枷?,一方面可以幫助初學者更加方便地閱讀和學習現(xiàn)有類庫與其他系統(tǒng)中的源代碼,另一方面還可以提高軟件的設計水平和代碼質(zhì)量。第二章第二章 面向?qū)ο蟮膸讉€基本原則面向?qū)ο蟮膸讉€基本原則 2022-6-2818面向?qū)ο蟮娜筇卣?封裝:隱藏內(nèi)部實現(xiàn),保護內(nèi)部信息,提供一種公共的訪問方式 繼承:實現(xiàn)復
13、用,歸納共性 多態(tài):對象在不同的時刻可以表現(xiàn)出不同的狀態(tài)問題:是不是在設計程序時類的結(jié)構(gòu)中使用到了封裝、繼承、多態(tài)就是面向?qū)ο螅空嬲拿嫦驅(qū)ο?體現(xiàn)出三大特性:封裝、繼承、多態(tài) 遵循面向?qū)ο蟮幕驹O計原則 正確使用設計模式 實現(xiàn)軟件系統(tǒng)可擴展性好、可復用性好、靈活性好、維護性好的目的。面向?qū)ο蟮幕驹瓌t簡介中文名稱中文名稱英文名稱英文名稱提出者提出者單一職責原則Single responsibility principleRobert C. Martin開-閉原則Open-Closed PrincipleBertrand Meyer里氏替換原則Liskov Substitution Princ
14、ipleBarbara Liskov接口分離原則Interface Segregation PrincipleRobert C. Martin依賴倒置原則Dependency Inversion PrincipleRobert C. Martin第二章第二章 面向?qū)ο蟮膸讉€基本原則面向?qū)ο蟮膸讉€基本原則 面向抽象原則面向抽象原則 2022-6-2822 設計一個類時,不讓該類面向具體的設計一個類時,不讓該類面向具體的類,而是面向抽象類或接口類,而是面向抽象類或接口 。23 面向抽象原則- 抽象類特點 抽象類中可以有抽象方法,也可以有非抽象方法 抽象類不能用new運算符創(chuàng)建對象 如果一個子類繼承
15、一個抽象類,該子類要么實現(xiàn)父類的所有抽象方法,要么該子類也聲明為抽象類。 可以作為上轉(zhuǎn)型對象。24面向抽象原則 - 抽象類示例abstract class Apublic abstract int add(int a, int b);class B extends Apublic int add(int a, int b)return a+b;public class Applicationpublic static void main(String args)A a = new B();int m = a.add(3,2);System.out.println(m);25面向抽象原則- 接口
16、特點 接口中只可以有public權(quán)限的抽象方法,不可以有非抽象方法 接口中的成員變量都默認是共有的和終結(jié)類型的 接口不能用new創(chuàng)建對象,必須用類去實現(xiàn) 接口的回調(diào):在接口類型的變量中可以存儲實現(xiàn)該接口的類實例的引用,并通過該接口變量來訪問類實例的方法。26面向抽象原則- 接口示例interface Compublic abstract int sub(int x, int y);class ComImp implements Compublic int sub(int x, int y)return x y;public class Applicationpublic static void
17、 main(String args)Com com = new ComImp();int m = com.sub(8,2);System.out.println(m);27面向抽象原則- 面向抽象 指當設計類時,不讓該類面向具體的類,而是面向抽象類或接口,即所設計類中重要數(shù)據(jù)是抽象類或接口的變量,而不是具體類的變量。28面向抽象原則- 面向抽象示例public class Circle double r; public Circle(double r) this.r =r; public double getArea() return Math.PI*r*r; public class Pil
18、lar Circle bottom; double height29面向抽象原則- 面向抽象示例改進30面向抽象原則- 面向抽象示例改進開-閉原則(OCP) 核心思想: 對擴展開放:有新的需求或變化時,可以對現(xiàn)有代碼進行擴展,以適應新情況。 對修改關(guān)閉:類一旦設計完成,就可以獨立完成自己的工作,而不要再對類進行任何修改。 實現(xiàn)方式:抽象,多態(tài),繼承,接口軟件應該是可擴展,而不可修改的。軟件應該是可擴展,而不可修改的。 對擴展開放,對修改關(guān)閉。對擴展開放,對修改關(guān)閉。 32開-閉原則 如果遵守了如果遵守了“開開-閉原則閉原則”,那么這,那么這個設計一定是易維護的,因為在設計個設計一定是易維護的,
19、因為在設計中增加新的模塊時,不必去修改設計中增加新的模塊時,不必去修改設計中的核心模塊。中的核心模塊。 OCP的動機很簡單:軟件是變化的。不論是的動機很簡單:軟件是變化的。不論是優(yōu)質(zhì)的設計還是低劣的設計都無法回避這一問優(yōu)質(zhì)的設計還是低劣的設計都無法回避這一問題。題。OCP說明了軟件設計應該盡可能地使架構(gòu)說明了軟件設計應該盡可能地使架構(gòu)穩(wěn)定而又容易滿足不同的需求穩(wěn)定而又容易滿足不同的需求 實例分析 Console.Write(請輸入數(shù)字請輸入數(shù)字A:);string A = Console.ReadLine();Console.Write(請選擇運算符號請選擇運算符號(+、-、*、/):);st
20、ring B = Console.ReadLine();Console.Write(請輸入數(shù)字請輸入數(shù)字B:);string C = Console.ReadLine();string D = ;if (B = +) D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C);if (B = -) D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C);if (B = *) D = Convert.ToString(Convert.ToDouble(A) *
21、Convert.ToDouble(C);if (B = /) D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C);Console.WriteLine(結(jié)果是:結(jié)果是: + D);要加運算,怎么辦?要加運算,怎么辦? 實例分析 先不論程序的健壯性,如果客戶要求增加求余運算,該如何處理?增加判斷,增加分支增加判斷,增加分支 客戶類改進后客戶類開閉原則小結(jié)開閉原則適用于那些需求會經(jīng)常發(fā)生變化的系統(tǒng),應該努力使大部分模塊滿足開閉原則。開閉原則是面向?qū)ο笤O計的核心,滿足該原則可以達到最大限度的復用和可維護性。組合優(yōu)先于繼承 (1)
22、什么是繼承? 它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。 (2)什么是組合? 通過創(chuàng)建一個由其他對象組合的對象來獲得新功能的重用方法,新功能的獲得是通過調(diào)用組合對象的功能實現(xiàn)的,有時又叫聚合。 (3)繼承與組合 繼承與子類之間是“Is-a”的關(guān)系 組合與其它類之間是“Has-a”的關(guān)系繼承的優(yōu)缺點 繼承的優(yōu)缺點 優(yōu)點:1.新的實現(xiàn)很容易,因為大部分是繼承而來的 2.很容易修改和擴展已有的實現(xiàn) 缺點:1.打破了封裝,因為基類向子類暴露了實現(xiàn)細節(jié) 2.白盒重用,因為基類的內(nèi)部細節(jié)通常對子類是可見的 3.當父類的實現(xiàn)改變時可能要相應的對子類做出改變 4.不能在運
23、行時改變由父類繼承來的實現(xiàn)組合的優(yōu)缺點 組合的優(yōu)缺點 優(yōu)點:1. 被包含對象通過包含他們的類來訪問 2. 黑盒重用,因為被包含對象的內(nèi)部細節(jié)是不可見的 3. 很好的封裝 4. 每個類專注于一個任務 5. 通過獲得和被包含對象的類型相同的對象引用,可以在運行時動態(tài)定義組合的方式 缺點:1.結(jié)果系統(tǒng)可能會包含更多的對象 2.為了使組合時可以使用不同的對象,必須小心的 定義接口組合比繼承具有更大的靈活性和更穩(wěn)定的結(jié)構(gòu)組合比繼承具有更大的靈活性和更穩(wěn)定的結(jié)構(gòu) 組合優(yōu)先于繼承 實例:有一個叫做HuntBird的游戲,里面需要表示各種各樣的鳥類。組合優(yōu)先于繼承 最初的設計組合優(yōu)先于繼承需求變化:鳥類要會飛
24、組合優(yōu)先于繼承 如果增加一種鳥類“企鵝”呢?組合優(yōu)先于繼承 改進方法:對“飛”使用多態(tài)組合優(yōu)先于繼承 改進方法:再次使用繼承組合優(yōu)先于繼承 如果增加“游泳”行為呢?組合優(yōu)先于繼承組合優(yōu)先于繼承 使用“組合”思路考慮問題 “汽車”擁有某種或某些“用途” “汽車”和“用途”獨立變化,互不影響組合優(yōu)先于繼承 什么時候使用繼承? 子類是超類的一個特殊種類,而不是超類的一個角色,也就是要區(qū)分“Has-A”與“Is-A”的不同。 子類具有擴展超類的責任,而不是具有置換掉(Override)或注銷超類的責任。 只有在分類學角度上有意義時,才可以使用繼承。50高內(nèi)聚-低耦合原則 高內(nèi)聚高內(nèi)聚 如果類中的方法是
25、一組相關(guān)的行為,則稱該類是如果類中的方法是一組相關(guān)的行為,則稱該類是高內(nèi)聚高內(nèi)聚的,反之稱為低內(nèi)聚的。的,反之稱為低內(nèi)聚的。 低耦合低耦合 所謂所謂低耦合低耦合就是盡量不要讓一個類含有太多的其就是盡量不要讓一個類含有太多的其它類的實例的引用,以避免修改系統(tǒng)的其中一部它類的實例的引用,以避免修改系統(tǒng)的其中一部分會影響到其它部分。分會影響到其它部分。高內(nèi)聚低耦合哪種耦合度低?什么是單一職責原則單一職責原則(Single Responsibility Principle ): 就一個類而言,應該僅有一個引起它變化的原因。多功能的山寨手機山寨手機的功能: 拍照、攝像、手機游戲、網(wǎng)絡攝像頭、GPS、炒股
26、等等。功能多、但是每一個功能都不強。拍攝功能 -專業(yè)攝像機或照相機手機游戲 -PSP網(wǎng)絡攝像頭-專業(yè)攝像頭GPS功能-專業(yè)GPS導航系統(tǒng)煩人的山寨手機 每一個職責都是一個變化的軸線,當需求變化時會反映為類的職責的變化。如果一個類承擔的職責多于一個,那么引起它變化的原因就有多個。一個職責的變化甚至可能會削弱或者抑制類完成其他職責的能力,從而導致脆弱的設計。單一職責原則示例接受客戶端輸入并提交到數(shù)據(jù)庫。原有設計: 一個類負責接受客戶端輸入,對客戶端輸入進行校驗,連接數(shù)據(jù)庫,并提交數(shù)據(jù)到數(shù)據(jù)庫?,F(xiàn)有設計: 一個功能也就是一個職責由一個類來負責。單一職責原則(SRP) (1)目的:如果你有多個原因去改
27、變一個類,那么應該把這些引起變化的原因分離開,把這個類分成多個類,每個類只負責處理一種改變。當你做出某種改變時,只需要修改負責處理該改變的類。 (2)單一職責原則 一個類應該只受一種變化的影響。 如果一個類承擔的職責過多,就等于把這些職責耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發(fā)生時,設計會遭到意想不到的破壞。一個類,應該僅有一個引起它變化的原因一個類,應該僅有一個引起它變化的原因 單一職責原則(SRP) (3)好處: 類的復雜性降低,實現(xiàn)什么職責都有清晰明確的定義。 可讀性提高。 可維護性提高。 變更引起的風險降低。第三章第三章
28、UMLUML類圖簡介類圖簡介 3.1 類類(Class)_1 (Class)_1 2022-6-2858 在在UMLUML中,使用一個長方形描述一個類的主要構(gòu)成,將長中,使用一個長方形描述一個類的主要構(gòu)成,將長方形垂直地分為三層方形垂直地分為三層 。 第第1 1層層是名字層,類名字是常規(guī)字形,表明該類是具體類,是名字層,類名字是常規(guī)字形,表明該類是具體類,類名字是斜體字形,表明該類是抽象類。類名字是斜體字形,表明該類是抽象類。 第第2 2層層是變量層,也稱屬性層,列出類的成員變量及類型,是變量層,也稱屬性層,列出類的成員變量及類型,格式是格式是“變量名字:類型變量名字:類型”。 第第3 3層層
29、是方法層,也稱操作層,列出類的方法及返回類型,是方法層,也稱操作層,列出類的方法及返回類型,格式是格式是“方法名字(參數(shù)列表):類型方法名字(參數(shù)列表):類型”。 3.1 類類(Class)_2 (Class)_2 2022-6-2859Student+name:String#age:int-money:double+setName(String):void#printMess():void+getAge():intsetAge(int):void-getMoney();名字層名字層 變量層變量層 方法層方法層 +#-protected的的private的的友好的友好的的的public的的變量
30、變量或或方法方法的訪問權(quán)限是的訪問權(quán)限是名字名字前加前加3.2 接口(接口(InterfaceInterface)_1 _1 2022-6-2860 表示接口的表示接口的UMLUML圖和表示類的圖和表示類的UMLUML圖類似,使用一個長方形圖類似,使用一個長方形描述一個接口的主要構(gòu)成,將長方形垂直地分為三層描述一個接口的主要構(gòu)成,將長方形垂直地分為三層 。 第第1 1層層是名字層,接口的名字必須是斜體字形,而且需要用是名字層,接口的名字必須是斜體字形,而且需要用修飾名字,并且該修飾和名字分列在修飾名字,并且該修飾和名字分列在2 2行。行。 第第2層層是常量層,列出接口中的常量及類型,格式是是常
31、量層,列出接口中的常量及類型,格式是“常常量名字:類型量名字:類型”。 第第3層層是方法層,也稱操作層,列出接口中的方法及返回是方法層,也稱操作層,列出接口中的方法及返回類型,格式是類型,格式是“方法名字(參數(shù)列表):類型方法名字(參數(shù)列表):類型”。 3.2 接口(接口(Interface)_2 Interface)_2 2022-6-2861Creator +MAX:int +factoryMethod():Product 名字層名字層 常量層常量層 方法層方法層 +public的的常量常量或或方法方法的訪問權(quán)限是的訪問權(quán)限是名字名字前加前加3.3 泛化關(guān)系(泛化關(guān)系(Generaliza
32、tionGeneralization) 2022-6-2862 對于面向?qū)ο笳Z言,對于面向?qū)ο笳Z言,UMLUML中中所說的所說的泛化關(guān)系就是指類的繼泛化關(guān)系就是指類的繼承關(guān)系承關(guān)系。如果一個類是另一個。如果一個類是另一個類的子類,那么類的子類,那么UMLUML通過使用通過使用一個實線連接兩個類的一個實線連接兩個類的UMLUML圖圖來表示二者之間的繼承關(guān)系,來表示二者之間的繼承關(guān)系,實線的起始端是子類的實線的起始端是子類的UMLUML圖,圖,終點端是父類的終點端是父類的UMLUML圖,但終圖,但終點端使用一個空心的三角形表點端使用一個空心的三角形表示實線的結(jié)束示實線的結(jié)束 。 3.4 關(guān)聯(lián)關(guān)系(
33、關(guān)聯(lián)關(guān)系(AssociationAssociation)2022-6-2863 如果如果A A類中成員變量是用類中成員變量是用B B類(接口)來聲明的變量,類(接口)來聲明的變量,那么那么A A和和B B的關(guān)系是關(guān)聯(lián)關(guān)系,稱的關(guān)系是關(guān)聯(lián)關(guān)系,稱A A關(guān)聯(lián)于關(guān)聯(lián)于B B。那么。那么UMLUML通過通過使用一個實線連使用一個實線連A A和和B B的的UMLUML圖,實線的起始端是圖,實線的起始端是A A的的UMLUML圖,圖,終點端是終點端是B B的的UMLUML圖,但終點端使用一個指向圖,但終點端使用一個指向B B的的UMLUML圖的方圖的方向箭頭表示實線的結(jié)束向箭頭表示實線的結(jié)束 。 3.5
34、依賴關(guān)系(依賴關(guān)系(DependencyDependency) 2022-6-2864 如果如果A A類中某個方法的參數(shù)用類中某個方法的參數(shù)用B B類(接口)來聲明的變類(接口)來聲明的變量或某個方法返回的數(shù)據(jù)類型是量或某個方法返回的數(shù)據(jù)類型是B B類型的,那么類型的,那么A A和和B B的關(guān)的關(guān)系是依賴關(guān)系,稱系是依賴關(guān)系,稱A A依賴于依賴于B B。那么那么UMLUML通過使用一個虛線通過使用一個虛線連連A A和和B B的的UMLUML圖,虛線的起始端是圖,虛線的起始端是A A的的UMLUML圖,終點端是圖,終點端是B B的的UMLUML圖,但終點端使用一個指向圖,但終點端使用一個指向B
35、B的的UMLUML圖的方向箭頭表示圖的方向箭頭表示虛線的結(jié)束。虛線的結(jié)束。 3.6 實現(xiàn)關(guān)系(實現(xiàn)關(guān)系(RealizationRealization) 2022-6-2865 如果一個類實現(xiàn)了一個如果一個類實現(xiàn)了一個接口,那么類和接口的關(guān)系接口,那么類和接口的關(guān)系是實現(xiàn)關(guān)系,稱類實現(xiàn)接口。是實現(xiàn)關(guān)系,稱類實現(xiàn)接口。UMLUML通過使用虛線連接類和通過使用虛線連接類和它所實現(xiàn)的接口,虛線起始它所實現(xiàn)的接口,虛線起始端是類,虛線的終點端是它端是類,虛線的終點端是它實現(xiàn)的接口,但終點端使用實現(xiàn)的接口,但終點端使用一個空心的三角形表示虛線一個空心的三角形表示虛線的結(jié)束的結(jié)束 。3.7 注釋(注釋(An
36、notationAnnotation) 2022-6-2866 UML UML使用注釋為類圖提供附加的說明。使用注釋為類圖提供附加的說明。UMLUML在一個帶卷角的在一個帶卷角的長方形中顯示給出的注釋,并使用虛線將這個帶卷角的長方形長方形中顯示給出的注釋,并使用虛線將這個帶卷角的長方形和所它所注釋的實體連接起來和所它所注釋的實體連接起來 。第四章第四章 命令模式命令模式 2022-6-2867命令模式(別名:動作,事務)命令模式(別名:動作,事務) 將一個請求封裝為一個對象,從而使你可用不同的請將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以求對客
37、戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤消的操作。及支持可撤消的操作。Command Pattern(Another Name: Action, Transaction) Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.一一 、 概述概述 2022-6-2868 在許多設計中,經(jīng)常涉及到一個對象請求另一個對在許多設計中,
38、經(jīng)常涉及到一個對象請求另一個對象調(diào)用其方法到達某種目的。如果請求者不希望或無象調(diào)用其方法到達某種目的。如果請求者不希望或無法直接和被請求者打交道,即不希望或無法含有被請法直接和被請求者打交道,即不希望或無法含有被請求者的引用,那么就可以使用命令模式。求者的引用,那么就可以使用命令模式。 二、二、命令模式的結(jié)構(gòu)與使用命令模式的結(jié)構(gòu)與使用 2022-6-2869模式的結(jié)構(gòu)中包括四種角色:模式的結(jié)構(gòu)中包括四種角色: 接收者(接收者(ReceiverReceiver) 命令命令(Command)(Command)接口接口 具體命令(具體命令(ConcreteCommandConcreteCommand
39、) 請求者(請求者(InvokerInvoker)2022-6-2870模式的模式的UMLUML類圖類圖 2022-6-2871模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 1 1接收者(接收者(ReceiverReceiver) : : CompanyArmy.javaCompanyArmy.javapublic class CompanyArmypublic class CompanyArmy public void sneakAttack() public void sneakAttack() System.out.println( System.out.println(我們知道如何偷襲
40、敵人我們知道如何偷襲敵人, ,保證完成任務保證完成任務); ); 2022-6-2872模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 2 2命令(命令(CommandCommand)接口)接口 : : Command.javaCommand.javapublic interface Command public interface Command public abstract void execute(); public abstract void execute(); 2022-6-2873模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 3 3具體命令(具體命令(ConcreteComman
41、dConcreteCommand) ConcreteCommand.java ConcreteCommand.java public class ConcreteCommand implements Commandpublic class ConcreteCommand implements Command CompanyArmy army; CompanyArmy army; /含有接收者的引用含有接收者的引用 ConcreteCommand(CompanyArmy army)ConcreteCommand(CompanyArmy army) this.army=army; this.arm
42、y=army; public void execute() public void execute() /封裝著指揮官的請求封裝著指揮官的請求 army.sneakAttack(); army.sneakAttack(); /偷襲敵人偷襲敵人 2022-6-2874模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 4 4請求者(請求者(InvokerInvoker) ArmySuperior.java ArmySuperior.java public class ArmySuperiorpublic class ArmySuperior Command command; Command comma
43、nd; /用來存放具體命令的引用用來存放具體命令的引用 public void setCommand(Command command)public void setCommand(Command command) mand=command; mand=command; public void startExecuteCommand() public void startExecuteCommand() /讓具體命令執(zhí)行讓具體命令執(zhí)行execute()execute()方法方法 command.execute();command.execute(); 2022-6-2875模式的結(jié)構(gòu)的描述與使用
44、模式的結(jié)構(gòu)的描述與使用 5 5應用應用 Application.javaApplication.java public class Application public class Application public static void main(String args) public static void main(String args) CompanyArmy CompanyArmy 三連三連=new CompanyArmy(); =new CompanyArmy(); Command command=new ConcreteCommand( Command command=ne
45、w ConcreteCommand(三連三連);); ArmySuperior ArmySuperior 指揮官指揮官=new ArmySuperior(); =new ArmySuperior(); 指揮官指揮官.setCommand(command); .setCommand(command); 指揮官指揮官.startExecuteCommand();.startExecuteCommand(); 三、三、命令模式的優(yōu)點命令模式的優(yōu)點 2022-6-2876 在命令模式中,請求者(Invoker)不直接與接收者(Receiver)交互,即請求者(Invoker)不包含接收者(Receiv
46、er)的引用,因此徹底消除了彼此之間的耦合。 命令模式滿足“開-閉原則”。如果增加新的具體命令和該命令的接受者,不必修改調(diào)用者的代碼,調(diào)用者就可以使用新的命令對象;反之,如果增加新的調(diào)用者,不必修改現(xiàn)有的具體命令和接受者,新增加的調(diào)用者就可以使用已有的具體命令。 由于請求者的請求被封裝到了具體命令中,那么就可以將具體命令保存到持久化的媒介中,在需要的時候,重新執(zhí)行這個具體命令。因此,使用命令模式可以記錄日志。 使用命令模式可以對請求者的“請求”進行排隊。每個請求都各自對應一個具體命令,因此可以按一定順序執(zhí)行這些具體命令。第五章第五章 觀察者模式觀察者模式 2022-6-2877觀察者模式(別名
47、:依賴,發(fā)布觀察者模式(別名:依賴,發(fā)布-訂閱)訂閱) 定義對象間的一種一對多的依賴關(guān)系,當一個對象的定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生變化時,所有依賴于它的對象都得到通知并被狀態(tài)發(fā)生變化時,所有依賴于它的對象都得到通知并被自動更新。自動更新。Observer Pattern(Another Name: Dependents, Publish-Subscribe) Define a one-to-many dependency between objects so that when one object changes state, all its dependents
48、are notified and updated automatically. 一一 、 概述概述 2022-6-2878 在許多設計中,經(jīng)常涉及到多個對象在許多設計中,經(jīng)常涉及到多個對象都對一個特殊對象中的數(shù)據(jù)變化感興趣,都對一個特殊對象中的數(shù)據(jù)變化感興趣,而且這多個對象都希望跟蹤那個特殊對而且這多個對象都希望跟蹤那個特殊對象中的數(shù)據(jù)變化。象中的數(shù)據(jù)變化。 二、二、 模式的結(jié)構(gòu)與使用模式的結(jié)構(gòu)與使用 2022-6-2879觀察者模式的結(jié)構(gòu)中包括四種角色:觀察者模式的結(jié)構(gòu)中包括四種角色: 主題(主題(SubjectSubject) 觀察者(觀察者(ObserverObserver) 具體主題(
49、具體主題(ConcreteSubjectConcreteSubject) 具體觀察者(具體觀察者(ConcreteObserverConcreteObserver) 2022-6-2880模式的模式的UMLUML類圖類圖 2022-6-2881模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 1 1主題主題 : : Subject.java Subject.java public interface Subject public interface Subject public void addObserver(Observer o); public void addObserver(Observ
50、er o); public void deleteObserver(Observer o); public void deleteObserver(Observer o); public void notifyObservers(); public void notifyObservers(); 2022-6-2882模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 2 2觀察者觀察者 : : Obsever.java Obsever.java public interface Observerpublic interface Observer public void hearTelephone(
51、String heardMess); public void hearTelephone(String heardMess); 2022-6-2883模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 3 3具體主題具體主題 SeekJobCenter.java_1 SeekJobCenter.java_1 import java.util.ArrayList; public class SeekJobCenter implements Subject String mess; boolean changed; ArrayList personList; SeekJobCenter() person
52、List=new ArrayList(); mess=; changed=false; public void addObserver(Observer o) if(!(personList.contains(o) personList.add(o); public void deleteObserver(Observer o) if(personList.contains(o) personList.remove(o); 2022-6-2884模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 3 3具體主題具體主題 SeekJobCenter.java_2 SeekJobCenter.java_
53、2 public void notifyObservers() if(changed)for(int i=0;ipersonList.size();i+) Observer observer=personList.get(i); observer.hearTelephone(mess); changed=false; public void giveNewMess(String str) if(str.equals(mess) changed=false; else mess=str; changed=true; 2022-6-2885模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 4 4具體觀
54、察者具體觀察者_1 _1 UniversityStudent.javaUniversityStudent.javaimport java.io.import java.io.* *; ;public class UniverStudent implements Observerpublic class UniverStudent implements Observer Subject subject; Subject subject; File myFile; File myFile; UniverStudent(Subject subject,String fileName) UniverS
55、tudent(Subject subject,String fileName) this.subject=subject; this.subject=subject; subject.addObserver(this); / subject.addObserver(this); /使當前實例成為使當前實例成為subjectsubject所引用的具體主題的觀察者所引用的具體主題的觀察者 myFile=new File(fileName);myFile=new File(fileName); public void hearTelephone(String heardMess) public vo
56、id hearTelephone(String heardMess) try RandomAccessFile out=new RandomAccessFile(myFile,rw); try RandomAccessFile out=new RandomAccessFile(myFile,rw); out.seek(out.length(); out.seek(out.length(); byte b=heardMess.getBytes(); byte b=heardMess.getBytes(); out.write(b); / out.write(b); /更新文件中的內(nèi)容更新文件中的
57、內(nèi)容 System.out.print(System.out.print(我是一個大學生我是一個大學生,); ,); System.out.println( System.out.println(我向文件我向文件+myFile.getName()+myFile.getName()+寫入如下內(nèi)容寫入如下內(nèi)容:);:); System.out.println(heardMess); System.out.println(heardMess); catch(IOException exp) catch(IOException exp) System.out.println(exp.toString(
58、); System.out.println(exp.toString(); 2022-6-2886模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 4 4具體觀察者具體觀察者_2 _2 HaiGui.javaHaiGui.java import java.io.import java.io.* *; ;import java.util.regex.import java.util.regex.* *; ;public class HaiGui implements Observerpublic class HaiGui implements Observer Subject subject; Su
59、bject subject; File myFile; File myFile; HaiGui(Subject subject,String fileName) HaiGui(Subject subject,String fileName) this.subject=subject; this.subject=subject; subject.addObserver(this); / subject.addObserver(this); /使當前實例成為使當前實例成為subjectsubject所引用的具體主題的觀察者所引用的具體主題的觀察者 myFile=new File(fileName)
60、;myFile=new File(fileName); public void hearTelephone(String heardMess) public void hearTelephone(String heardMess) try boolean boo=heardMess.contains(java try boolean boo=heardMess.contains(java程序員程序員)|heardMess.contains()|heardMess.contains(軟件軟件);); if(boo) if(boo) RandomAccessFile out=new RandomAcces
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鹽城貨運從業(yè)資格考試題目
- 2025年江蘇貨運從業(yè)資格證考試模擬題庫答案解析
- 小學數(shù)學二年級第二學期口算計算共3018道題
- 小學數(shù)學二年級第二學期口算計算共3029道題
- 初中道德與法治:說明類材料分析題答題技巧
- 2025年自貢道路貨運駕駛員從業(yè)資格證考試題庫
- 2025年廊坊下載貨運從業(yè)資格證模擬考試
- 兒童科學實驗的安全操作規(guī)程
- 企業(yè)安全風險防控與生產(chǎn)效益的平衡
- 健康管理軟件在孕婦保健中的應用探討
- 醫(yī)保檢查自查自糾報告
- VBOXTools軟件操作手冊
- 外研版(三年級起點)五年級上冊重點知識點復習
- 2023年報告文學研究(自考)(重點)題庫(帶答案)
- 國軍淞滬會戰(zhàn)
- 2023年湖南體育職業(yè)學院高職單招(語文)試題庫含答案解析
- GB/T 39314-2020鋁合金石膏型鑄造通用技術(shù)導則
- GB/T 17252-1998聲學100kHz以下超聲壓電換能器的特性和測量
- GB 16847-1997保護用電流互感器暫態(tài)特性技術(shù)要求
- 裝飾裝修施工質(zhì)量檢查評分表
- 超圖軟件三維平臺技術(shù)參數(shù)v7c2015r
評論
0/150
提交評論