Java設(shè)計(jì)模式課件_第1頁(yè)
Java設(shè)計(jì)模式課件_第2頁(yè)
Java設(shè)計(jì)模式課件_第3頁(yè)
Java設(shè)計(jì)模式課件_第4頁(yè)
Java設(shè)計(jì)模式課件_第5頁(yè)
已閱讀5頁(yè),還剩307頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、封面Java設(shè)計(jì)模式設(shè)計(jì)模式 耿祥義耿祥義 張躍平張躍平 著著 2022-6-281清華大學(xué)出版社清華大學(xué)出版社 設(shè)計(jì)模式的誕生與發(fā)展 模式的誕生與定義 模式起源于建筑業(yè)而非軟件業(yè) 模式(Pattern)之父美國(guó)加利佛尼亞大學(xué)環(huán)境結(jié)構(gòu)中心研究所所長(zhǎng)Christopher Alexander博士 A Pattern Language: Towns, Buildings, Construction253個(gè)建筑和城市規(guī)劃模式 模式 Context(模式可適用的前提條件) Theme或Problem(在特定條件下要解決的目標(biāo)問(wèn)題) Solution(對(duì)目標(biāo)問(wèn)題求解過(guò)程中各種物理關(guān)系的記述)設(shè)計(jì)模式的誕

2、生與發(fā)展Christopher Alexander設(shè)計(jì)模式的誕生與發(fā)展w 模式的誕生與定義 Alexander給出了關(guān)于模式的經(jīng)典定義:每給出了關(guān)于模式的經(jīng)典定義:每個(gè)模式都描述了一個(gè)個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出在我們的環(huán)境中不斷出現(xiàn)的問(wèn)題現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的,然后描述了該問(wèn)題的解決方案解決方案的的核心,通過(guò)這種方式,我們可以無(wú)數(shù)次地重核心,通過(guò)這種方式,我們可以無(wú)數(shù)次地重用那些已有的解決方案,無(wú)需再重復(fù)相同的用那些已有的解決方案,無(wú)需再重復(fù)相同的工作。工作。 模式是在模式是在特定環(huán)境特定環(huán)境中中解決問(wèn)題解決問(wèn)題的一種的一種方案方案 設(shè)計(jì)模式的誕生與發(fā)展w 軟件模式 1990

3、年,軟件工程界開(kāi)始關(guān)注年,軟件工程界開(kāi)始關(guān)注Christopher Alexander等在這一住宅、公共建筑與城市規(guī)劃領(lǐng)等在這一住宅、公共建筑與城市規(guī)劃領(lǐng)域的重大突破,最早將該模式的思想引入軟件工程域的重大突破,最早將該模式的思想引入軟件工程方法學(xué)的是方法學(xué)的是1991-1992年以年以“四人組四人組(Gang of Four,GoF,分別是,分別是Erich Gamma, Richard Helm, Ralph Johnson和和John Vlissides)”自稱(chēng)的自稱(chēng)的四位著名軟件工程學(xué)者,他們?cè)谒奈恢浖こ虒W(xué)者,他們?cè)?994年歸納發(fā)表了年歸納發(fā)表了23種在軟件開(kāi)發(fā)中使用頻率較高的

4、設(shè)計(jì)模式,旨在種在軟件開(kāi)發(fā)中使用頻率較高的設(shè)計(jì)模式,旨在用模式來(lái)統(tǒng)一溝通面向?qū)ο蠓椒ㄔ诜治?、設(shè)計(jì)和實(shí)用模式來(lái)統(tǒng)一溝通面向?qū)ο蠓椒ㄔ诜治觥⒃O(shè)計(jì)和實(shí)現(xiàn)間的鴻溝現(xiàn)間的鴻溝。設(shè)計(jì)模式的誕生與發(fā)展設(shè)計(jì)模式的誕生與發(fā)展設(shè)計(jì)模式的發(fā)展 1987年,Kent Beck和Ward Cunningham借鑒Alexander的模式思想在程序開(kāi)發(fā)中開(kāi)始應(yīng)用一些模式 ,在OOPSLA會(huì)議上發(fā)表了他們的成果。 1990年,OOPSLA與ECOOP聯(lián)合舉辦,Erich Gamma和Richard Helm等人開(kāi)始討論有關(guān)模式的話(huà)題(Bruce Anderson主持),“四人組” 正式成立,并開(kāi)始著手進(jìn)行設(shè)計(jì)模式的分類(lèi)整理

5、工作。 1991 年,OOPSLA,Bruce Anderson主持了首次針對(duì)設(shè)計(jì)模式的研討會(huì) 。 1992 年,OOPSLA ,Anderson再度主持研討會(huì),模式已經(jīng)逐漸成為人們討論的話(huà)題。 注: OOPSLA (Object-Oriented Programming, Systems, Languages & Applications,面向?qū)ο缶幊?、系統(tǒng)、語(yǔ)言和應(yīng)用大會(huì)),編程語(yǔ)言及軟件工程國(guó)際頂級(jí)會(huì)議,2010年改為SPLASH - Systems, Programming, Languages and Applications: Software for Humanity 設(shè)

6、計(jì)模式的誕生與發(fā)展 設(shè)計(jì)模式的發(fā)展 1993年,Kent Beck 和 Grady Booch 贊助了第一次關(guān)于設(shè)計(jì)模式的會(huì)議,這個(gè)設(shè)計(jì)模式研究組織發(fā)展成為著名的Hillside Group研究組。 1994 年,由Hillside Group發(fā)起,在美國(guó)伊利諾伊州(Illinois)的Allerton Park召開(kāi)了第1屆關(guān)于面向?qū)ο竽J降氖澜缧詴?huì)議,名為PLoP(Pattern Languages of Programs, 編程語(yǔ)言模式會(huì)議),簡(jiǎn)稱(chēng)PLoP94。 1995年,PLoP95 仍在伊利諾伊州的Allerton Park舉行 ,“四人組”出版了設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)(

7、Design Patterns: Elements of Reusable Object-Oriented Software)一書(shū),本書(shū)成為1995年最搶手的面向?qū)ο髸?shū)籍,也成為設(shè)計(jì)模式的經(jīng)典書(shū)籍。 設(shè)計(jì)模式的誕生與發(fā)展 設(shè)計(jì)模式的發(fā)展 從1995年至今,設(shè)計(jì)模式在軟件開(kāi)發(fā)中得以廣泛應(yīng)用,在Sun的Java SE/Java EE平臺(tái)和Microsoft的.net平臺(tái)設(shè)計(jì)中就應(yīng)用了大量的設(shè)計(jì)模式。 誕生了越來(lái)越多的與設(shè)計(jì)模式相關(guān)的書(shū)籍和網(wǎng)站,設(shè)計(jì)模式也作為一門(mén)獨(dú)立的課程或作為軟件體系結(jié)構(gòu)等課程的重要組成部分出現(xiàn)在國(guó)內(nèi)外研究生和大學(xué)教育的課堂上。設(shè)計(jì)模式的定義與分類(lèi) 設(shè)計(jì)模式的定義 設(shè)計(jì)模式(De

8、sign Pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設(shè)計(jì)模式的定義與分類(lèi) 設(shè)計(jì)模式的基本要素 設(shè)計(jì)模式一般有如下幾個(gè)基本要素:模式名稱(chēng)、問(wèn)題、目的、解決方案、效果、實(shí)例代碼和相關(guān)設(shè)計(jì)模式,其中的關(guān)鍵元素包括以下四個(gè)方面:模式名稱(chēng) (Pattern name) 問(wèn)題 (Problem) 解決方案 (Solution) 效果 (Consequences) 設(shè)計(jì)模式的定義與分類(lèi) 設(shè)計(jì)模式的分類(lèi)根據(jù)其目的(模式是用來(lái)做什么的)可分為創(chuàng)建型(Creational),結(jié)構(gòu)型(Structural

9、)和行為型(Behavioral)三種: 創(chuàng)建型模式主要用于創(chuàng)建對(duì)象。 結(jié)構(gòu)型模式主要用于處理類(lèi)或?qū)ο蟮慕M合。 行為型模式主要用于描述對(duì)類(lèi)或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)。GoF設(shè)計(jì)模式簡(jiǎn)介 w創(chuàng)建型模式抽象工廠模式抽象工廠模式(Abstract Factory)建造者模式建造者模式(Builder)工廠方法模式工廠方法模式(Factory Method)原型模式原型模式(Prototype)單例模式單例模式(Singleton) GoF設(shè)計(jì)模式簡(jiǎn)介 w 結(jié)構(gòu)型模式適配器模式適配器模式(Adapter)橋接模式橋接模式(Bridge)組合模式組合模式(Composite)裝飾模式裝飾模式(Deco

10、rator)外觀模式外觀模式(Facade)享元模式享元模式(Flyweight)代理模式代理模式(Proxy)GoF設(shè)計(jì)模式簡(jiǎn)介 w行為型模式職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)命令模式命令模式(Command)解釋器模式解釋器模式(Interpreter)迭代器模式迭代器模式(Iterator)中介者模式中介者模式(Mediator)備忘錄模式備忘錄模式(Memento)觀察者模式觀察者模式(Observer)狀態(tài)模式狀態(tài)模式(State)策略模式策略模式(Strategy)模板方法模式模板方法模式(Template Method)訪(fǎng)問(wèn)者模式訪(fǎng)問(wèn)者模式(V

11、isitor)設(shè)計(jì)模式的優(yōu)點(diǎn) 設(shè)計(jì)模式是從許多優(yōu)秀的軟件系統(tǒng)中總結(jié)出的成功的、能夠?qū)崿F(xiàn)可維護(hù)性復(fù)用的設(shè)計(jì)方案,使用這些方案將避免我們做一些重復(fù)性的工作,而且可以設(shè)計(jì)出高質(zhì)量的軟件系統(tǒng)。 設(shè)計(jì)模式的主要優(yōu)點(diǎn)如下: 設(shè)計(jì)模式融合了眾多專(zhuān)家的經(jīng)驗(yàn),并以一種標(biāo)準(zhǔn)的形式供廣大開(kāi)發(fā)人員所用,它提供了一套通用的設(shè)計(jì)詞匯和一種通用的語(yǔ)言以方便開(kāi)發(fā)人員之間溝通和交流,使得設(shè)計(jì)方案更加通俗易懂。對(duì)于使用不同編程語(yǔ)言的開(kāi)發(fā)和設(shè)計(jì)人員可以通過(guò)設(shè)計(jì)模式來(lái)交流系統(tǒng)設(shè)計(jì)方案,每一個(gè)模式都對(duì)應(yīng)一個(gè)標(biāo)準(zhǔn)的解決方案,設(shè)計(jì)模式可以降低開(kāi)發(fā)人員理解系統(tǒng)的復(fù)雜度。設(shè)計(jì)模式的優(yōu)點(diǎn) 設(shè)計(jì)模式使人們可以更加簡(jiǎn)單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu)

12、,將已證實(shí)的技術(shù)表述成設(shè)計(jì)模式也會(huì)使新系統(tǒng)開(kāi)發(fā)者更加容易理解其設(shè)計(jì)思路。設(shè)計(jì)模式使得重用成功的設(shè)計(jì)更加容易,并避免那些導(dǎo)致不可重用的設(shè)計(jì)方案。 設(shè)計(jì)模式使得設(shè)計(jì)方案更加靈活,且易于修改。 設(shè)計(jì)模式的使用將提高軟件系統(tǒng)的開(kāi)發(fā)效率和軟件質(zhì)量,且在一定程度上節(jié)約設(shè)計(jì)成本。 設(shè)計(jì)模式有助于初學(xué)者更深入地理解面向?qū)ο笏枷?,一方面可以幫助初學(xué)者更加方便地閱讀和學(xué)習(xí)現(xiàn)有類(lèi)庫(kù)與其他系統(tǒng)中的源代碼,另一方面還可以提高軟件的設(shè)計(jì)水平和代碼質(zhì)量。第二章第二章 面向?qū)ο蟮膸讉€(gè)基本原則面向?qū)ο蟮膸讉€(gè)基本原則 2022-6-2818面向?qū)ο蟮娜筇卣?封裝:隱藏內(nèi)部實(shí)現(xiàn),保護(hù)內(nèi)部信息,提供一種公共的訪(fǎng)問(wèn)方式 繼承:實(shí)現(xiàn)復(fù)

13、用,歸納共性 多態(tài):對(duì)象在不同的時(shí)刻可以表現(xiàn)出不同的狀態(tài)問(wèn)題:是不是在設(shè)計(jì)程序時(shí)類(lèi)的結(jié)構(gòu)中使用到了封裝、繼承、多態(tài)就是面向?qū)ο??真正的面向?qū)ο?體現(xiàn)出三大特性:封裝、繼承、多態(tài) 遵循面向?qū)ο蟮幕驹O(shè)計(jì)原則 正確使用設(shè)計(jì)模式 實(shí)現(xiàn)軟件系統(tǒng)可擴(kuò)展性好、可復(fù)用性好、靈活性好、維護(hù)性好的目的。面向?qū)ο蟮幕驹瓌t簡(jiǎn)介中文名稱(chēng)中文名稱(chēng)英文名稱(chēng)英文名稱(chēng)提出者提出者單一職責(zé)原則Single responsibility principleRobert C. Martin開(kāi)-閉原則Open-Closed PrincipleBertrand Meyer里氏替換原則Liskov Substitution Princ

14、ipleBarbara Liskov接口分離原則Interface Segregation PrincipleRobert C. Martin依賴(lài)倒置原則Dependency Inversion PrincipleRobert C. Martin第二章第二章 面向?qū)ο蟮膸讉€(gè)基本原則面向?qū)ο蟮膸讉€(gè)基本原則 面向抽象原則面向抽象原則 2022-6-2822 設(shè)計(jì)一個(gè)類(lèi)時(shí),不讓該類(lèi)面向具體的設(shè)計(jì)一個(gè)類(lèi)時(shí),不讓該類(lèi)面向具體的類(lèi),而是面向抽象類(lèi)或接口類(lèi),而是面向抽象類(lèi)或接口 。23 面向抽象原則- 抽象類(lèi)特點(diǎn) 抽象類(lèi)中可以有抽象方法,也可以有非抽象方法 抽象類(lèi)不能用new運(yùn)算符創(chuàng)建對(duì)象 如果一個(gè)子類(lèi)繼承

15、一個(gè)抽象類(lèi),該子類(lèi)要么實(shí)現(xiàn)父類(lèi)的所有抽象方法,要么該子類(lèi)也聲明為抽象類(lèi)。 可以作為上轉(zhuǎn)型對(duì)象。24面向抽象原則 - 抽象類(lèi)示例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、特點(diǎn) 接口中只可以有public權(quán)限的抽象方法,不可以有非抽象方法 接口中的成員變量都默認(rèn)是共有的和終結(jié)類(lèi)型的 接口不能用new創(chuàng)建對(duì)象,必須用類(lèi)去實(shí)現(xiàn) 接口的回調(diào):在接口類(lèi)型的變量中可以存儲(chǔ)實(shí)現(xiàn)該接口的類(lèi)實(shí)例的引用,并通過(guò)該接口變量來(lái)訪(fǎng)問(wèn)類(lèi)實(shí)例的方法。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面向抽象原則- 面向抽象 指當(dāng)設(shè)計(jì)類(lèi)時(shí),不讓該類(lèi)面向具體的類(lèi),而是面向抽象類(lèi)或接口,即所設(shè)計(jì)類(lèi)中重要數(shù)據(jù)是抽象類(lèi)或接口的變量,而不是具體類(lèi)的變量。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面向抽象原則- 面向抽象示例改進(jìn)30面向抽象原則- 面向抽象示例改進(jìn)開(kāi)-閉原則(OCP) 核心思想: 對(duì)擴(kuò)展開(kāi)放:有新的需求或變化時(shí),可以對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新情況。 對(duì)修改關(guān)閉:類(lèi)一旦設(shè)計(jì)完成,就可以獨(dú)立完成自己的工作,而不要再對(duì)類(lèi)進(jìn)行任何修改。 實(shí)現(xiàn)方式:抽象,多態(tài),繼承,接口軟件應(yīng)該是可擴(kuò)展,而不可修改的。軟件應(yīng)該是可擴(kuò)展,而不可修改的。 對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。 32開(kāi)-閉原則 如果遵守了如果遵守了“開(kāi)開(kāi)-閉原則閉原則”,那么這,那么這個(gè)設(shè)計(jì)一定是易維護(hù)的,因?yàn)樵谠O(shè)計(jì)個(gè)設(shè)計(jì)一定是易維護(hù)的,

19、因?yàn)樵谠O(shè)計(jì)中增加新的模塊時(shí),不必去修改設(shè)計(jì)中增加新的模塊時(shí),不必去修改設(shè)計(jì)中的核心模塊。中的核心模塊。 OCP的動(dòng)機(jī)很簡(jiǎn)單:軟件是變化的。不論是的動(dòng)機(jī)很簡(jiǎn)單:軟件是變化的。不論是優(yōu)質(zhì)的設(shè)計(jì)還是低劣的設(shè)計(jì)都無(wú)法回避這一問(wèn)優(yōu)質(zhì)的設(shè)計(jì)還是低劣的設(shè)計(jì)都無(wú)法回避這一問(wèn)題。題。OCP說(shuō)明了軟件設(shè)計(jì)應(yīng)該盡可能地使架構(gòu)說(shuō)明了軟件設(shè)計(jì)應(yīng)該盡可能地使架構(gòu)穩(wěn)定而又容易滿(mǎn)足不同的需求穩(wěn)定而又容易滿(mǎn)足不同的需求 實(shí)例分析 Console.Write(請(qǐng)輸入數(shù)字請(qǐng)輸入數(shù)字A:);string A = Console.ReadLine();Console.Write(請(qǐng)選擇運(yùn)算符號(hào)請(qǐng)選擇運(yùn)算符號(hào)(+、-、*、/):);st

20、ring B = Console.ReadLine();Console.Write(請(qǐng)輸入數(shù)字請(qǐng)輸入數(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);要加運(yùn)算,怎么辦?要加運(yùn)算,怎么辦? 實(shí)例分析 先不論程序的健壯性,如果客戶(hù)要求增加求余運(yùn)算,該如何處理?增加判斷,增加分支增加判斷,增加分支 客戶(hù)類(lèi)改進(jìn)后客戶(hù)類(lèi)開(kāi)閉原則小結(jié)開(kāi)閉原則適用于那些需求會(huì)經(jīng)常發(fā)生變化的系統(tǒng),應(yīng)該努力使大部分模塊滿(mǎn)足開(kāi)閉原則。開(kāi)閉原則是面向?qū)ο笤O(shè)計(jì)的核心,滿(mǎn)足該原則可以達(dá)到最大限度的復(fù)用和可維護(hù)性。組合優(yōu)先于繼承 (1)

22、什么是繼承? 它可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展。 (2)什么是組合? 通過(guò)創(chuàng)建一個(gè)由其他對(duì)象組合的對(duì)象來(lái)獲得新功能的重用方法,新功能的獲得是通過(guò)調(diào)用組合對(duì)象的功能實(shí)現(xiàn)的,有時(shí)又叫聚合。 (3)繼承與組合 繼承與子類(lèi)之間是“Is-a”的關(guān)系 組合與其它類(lèi)之間是“Has-a”的關(guān)系繼承的優(yōu)缺點(diǎn) 繼承的優(yōu)缺點(diǎn) 優(yōu)點(diǎn):1.新的實(shí)現(xiàn)很容易,因?yàn)榇蟛糠质抢^承而來(lái)的 2.很容易修改和擴(kuò)展已有的實(shí)現(xiàn) 缺點(diǎn):1.打破了封裝,因?yàn)榛?lèi)向子類(lèi)暴露了實(shí)現(xiàn)細(xì)節(jié) 2.白盒重用,因?yàn)榛?lèi)的內(nèi)部細(xì)節(jié)通常對(duì)子類(lèi)是可見(jiàn)的 3.當(dāng)父類(lèi)的實(shí)現(xiàn)改變時(shí)可能要相應(yīng)的對(duì)子類(lèi)做出改變 4.不能在運(yùn)

23、行時(shí)改變由父類(lèi)繼承來(lái)的實(shí)現(xiàn)組合的優(yōu)缺點(diǎn) 組合的優(yōu)缺點(diǎn) 優(yōu)點(diǎn):1. 被包含對(duì)象通過(guò)包含他們的類(lèi)來(lái)訪(fǎng)問(wèn) 2. 黑盒重用,因?yàn)楸话瑢?duì)象的內(nèi)部細(xì)節(jié)是不可見(jiàn)的 3. 很好的封裝 4. 每個(gè)類(lèi)專(zhuān)注于一個(gè)任務(wù) 5. 通過(guò)獲得和被包含對(duì)象的類(lèi)型相同的對(duì)象引用,可以在運(yùn)行時(shí)動(dòng)態(tài)定義組合的方式 缺點(diǎn):1.結(jié)果系統(tǒng)可能會(huì)包含更多的對(duì)象 2.為了使組合時(shí)可以使用不同的對(duì)象,必須小心的 定義接口組合比繼承具有更大的靈活性和更穩(wěn)定的結(jié)構(gòu)組合比繼承具有更大的靈活性和更穩(wěn)定的結(jié)構(gòu) 組合優(yōu)先于繼承 實(shí)例:有一個(gè)叫做HuntBird的游戲,里面需要表示各種各樣的鳥(niǎo)類(lèi)。組合優(yōu)先于繼承 最初的設(shè)計(jì)組合優(yōu)先于繼承需求變化:鳥(niǎo)類(lèi)要會(huì)飛

24、組合優(yōu)先于繼承 如果增加一種鳥(niǎo)類(lèi)“企鵝”呢?組合優(yōu)先于繼承 改進(jìn)方法:對(duì)“飛”使用多態(tài)組合優(yōu)先于繼承 改進(jìn)方法:再次使用繼承組合優(yōu)先于繼承 如果增加“游泳”行為呢?組合優(yōu)先于繼承組合優(yōu)先于繼承 使用“組合”思路考慮問(wèn)題 “汽車(chē)”擁有某種或某些“用途” “汽車(chē)”和“用途”獨(dú)立變化,互不影響組合優(yōu)先于繼承 什么時(shí)候使用繼承? 子類(lèi)是超類(lèi)的一個(gè)特殊種類(lèi),而不是超類(lèi)的一個(gè)角色,也就是要區(qū)分“Has-A”與“Is-A”的不同。 子類(lèi)具有擴(kuò)展超類(lèi)的責(zé)任,而不是具有置換掉(Override)或注銷(xiāo)超類(lèi)的責(zé)任。 只有在分類(lèi)學(xué)角度上有意義時(shí),才可以使用繼承。50高內(nèi)聚-低耦合原則 高內(nèi)聚高內(nèi)聚 如果類(lèi)中的方法是

25、一組相關(guān)的行為,則稱(chēng)該類(lèi)是如果類(lèi)中的方法是一組相關(guān)的行為,則稱(chēng)該類(lèi)是高內(nèi)聚高內(nèi)聚的,反之稱(chēng)為低內(nèi)聚的。的,反之稱(chēng)為低內(nèi)聚的。 低耦合低耦合 所謂所謂低耦合低耦合就是盡量不要讓一個(gè)類(lèi)含有太多的其就是盡量不要讓一個(gè)類(lèi)含有太多的其它類(lèi)的實(shí)例的引用,以避免修改系統(tǒng)的其中一部它類(lèi)的實(shí)例的引用,以避免修改系統(tǒng)的其中一部分會(huì)影響到其它部分。分會(huì)影響到其它部分。高內(nèi)聚低耦合哪種耦合度低?什么是單一職責(zé)原則單一職責(zé)原則(Single Responsibility Principle ): 就一個(gè)類(lèi)而言,應(yīng)該僅有一個(gè)引起它變化的原因。多功能的山寨手機(jī)山寨手機(jī)的功能: 拍照、攝像、手機(jī)游戲、網(wǎng)絡(luò)攝像頭、GPS、炒股

26、等等。功能多、但是每一個(gè)功能都不強(qiáng)。拍攝功能 -專(zhuān)業(yè)攝像機(jī)或照相機(jī)手機(jī)游戲 -PSP網(wǎng)絡(luò)攝像頭-專(zhuān)業(yè)攝像頭GPS功能-專(zhuān)業(yè)GPS導(dǎo)航系統(tǒng)煩人的山寨手機(jī) 每一個(gè)職責(zé)都是一個(gè)變化的軸線(xiàn),當(dāng)需求變化時(shí)會(huì)反映為類(lèi)的職責(zé)的變化。如果一個(gè)類(lèi)承擔(dān)的職責(zé)多于一個(gè),那么引起它變化的原因就有多個(gè)。一個(gè)職責(zé)的變化甚至可能會(huì)削弱或者抑制類(lèi)完成其他職責(zé)的能力,從而導(dǎo)致脆弱的設(shè)計(jì)。單一職責(zé)原則示例接受客戶(hù)端輸入并提交到數(shù)據(jù)庫(kù)。原有設(shè)計(jì): 一個(gè)類(lèi)負(fù)責(zé)接受客戶(hù)端輸入,對(duì)客戶(hù)端輸入進(jìn)行校驗(yàn),連接數(shù)據(jù)庫(kù),并提交數(shù)據(jù)到數(shù)據(jù)庫(kù)?,F(xiàn)有設(shè)計(jì): 一個(gè)功能也就是一個(gè)職責(zé)由一個(gè)類(lèi)來(lái)負(fù)責(zé)。單一職責(zé)原則(SRP) (1)目的:如果你有多個(gè)原因去改

27、變一個(gè)類(lèi),那么應(yīng)該把這些引起變化的原因分離開(kāi),把這個(gè)類(lèi)分成多個(gè)類(lèi),每個(gè)類(lèi)只負(fù)責(zé)處理一種改變。當(dāng)你做出某種改變時(shí),只需要修改負(fù)責(zé)處理該改變的類(lèi)。 (2)單一職責(zé)原則 一個(gè)類(lèi)應(yīng)該只受一種變化的影響。 如果一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多,就等于把這些職責(zé)耦合在一起,一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類(lèi)完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)變化發(fā)生時(shí),設(shè)計(jì)會(huì)遭到意想不到的破壞。一個(gè)類(lèi),應(yīng)該僅有一個(gè)引起它變化的原因一個(gè)類(lèi),應(yīng)該僅有一個(gè)引起它變化的原因 單一職責(zé)原則(SRP) (3)好處: 類(lèi)的復(fù)雜性降低,實(shí)現(xiàn)什么職責(zé)都有清晰明確的定義。 可讀性提高。 可維護(hù)性提高。 變更引起的風(fēng)險(xiǎn)降低。第三章第三章

28、UMLUML類(lèi)圖簡(jiǎn)介類(lèi)圖簡(jiǎn)介 3.1 類(lèi)類(lèi)(Class)_1 (Class)_1 2022-6-2858 在在UMLUML中,使用一個(gè)長(zhǎng)方形描述一個(gè)類(lèi)的主要構(gòu)成,將長(zhǎng)中,使用一個(gè)長(zhǎng)方形描述一個(gè)類(lèi)的主要構(gòu)成,將長(zhǎng)方形垂直地分為三層方形垂直地分為三層 。 第第1 1層層是名字層,類(lèi)名字是常規(guī)字形,表明該類(lèi)是具體類(lèi),是名字層,類(lèi)名字是常規(guī)字形,表明該類(lèi)是具體類(lèi),類(lèi)名字是斜體字形,表明該類(lèi)是抽象類(lèi)。類(lèi)名字是斜體字形,表明該類(lèi)是抽象類(lèi)。 第第2 2層層是變量層,也稱(chēng)屬性層,列出類(lèi)的成員變量及類(lèi)型,是變量層,也稱(chēng)屬性層,列出類(lèi)的成員變量及類(lèi)型,格式是格式是“變量名字:類(lèi)型變量名字:類(lèi)型”。 第第3 3層層

29、是方法層,也稱(chēng)操作層,列出類(lèi)的方法及返回類(lèi)型,是方法層,也稱(chēng)操作層,列出類(lèi)的方法及返回類(lèi)型,格式是格式是“方法名字(參數(shù)列表):類(lèi)型方法名字(參數(shù)列表):類(lèi)型”。 3.1 類(lèi)類(lèi)(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、變量或或方法方法的訪(fǎng)問(wèn)權(quán)限是的訪(fǎng)問(wèn)權(quán)限是名字名字前加前加3.2 接口(接口(InterfaceInterface)_1 _1 2022-6-2860 表示接口的表示接口的UMLUML圖和表示類(lèi)的圖和表示類(lèi)的UMLUML圖類(lèi)似,使用一個(gè)長(zhǎng)方形圖類(lèi)似,使用一個(gè)長(zhǎng)方形描述一個(gè)接口的主要構(gòu)成,將長(zhǎng)方形垂直地分為三層描述一個(gè)接口的主要構(gòu)成,將長(zhǎng)方形垂直地分為三層 。 第第1 1層層是名字層,接口的名字必須是斜體字形,而且需要用是名字層,接口的名字必須是斜體字形,而且需要用修飾名字,并且該修飾和名字分列在修飾名字,并且該修飾和名字分列在2 2行。行。 第第2層層是常量層,列出接口中的常量及類(lèi)型,格式是是常

31、量層,列出接口中的常量及類(lèi)型,格式是“常常量名字:類(lèi)型量名字:類(lèi)型”。 第第3層層是方法層,也稱(chēng)操作層,列出接口中的方法及返回是方法層,也稱(chēng)操作層,列出接口中的方法及返回類(lèi)型,格式是類(lèi)型,格式是“方法名字(參數(shù)列表):類(lèi)型方法名字(參數(shù)列表):類(lèi)型”。 3.2 接口(接口(Interface)_2 Interface)_2 2022-6-2861Creator +MAX:int +factoryMethod():Product 名字層名字層 常量層常量層 方法層方法層 +public的的常量常量或或方法方法的訪(fǎng)問(wèn)權(quán)限是的訪(fǎng)問(wèn)權(quán)限是名字名字前加前加3.3 泛化關(guān)系(泛化關(guān)系(Generaliza

32、tionGeneralization) 2022-6-2862 對(duì)于面向?qū)ο笳Z(yǔ)言,對(duì)于面向?qū)ο笳Z(yǔ)言,UMLUML中中所說(shuō)的所說(shuō)的泛化關(guān)系就是指類(lèi)的繼泛化關(guān)系就是指類(lèi)的繼承關(guān)系承關(guān)系。如果一個(gè)類(lèi)是另一個(gè)。如果一個(gè)類(lèi)是另一個(gè)類(lèi)的子類(lèi),那么類(lèi)的子類(lèi),那么UMLUML通過(guò)使用通過(guò)使用一個(gè)實(shí)線(xiàn)連接兩個(gè)類(lèi)的一個(gè)實(shí)線(xiàn)連接兩個(gè)類(lèi)的UMLUML圖圖來(lái)表示二者之間的繼承關(guān)系,來(lái)表示二者之間的繼承關(guān)系,實(shí)線(xiàn)的起始端是子類(lèi)的實(shí)線(xiàn)的起始端是子類(lèi)的UMLUML圖,圖,終點(diǎn)端是父類(lèi)的終點(diǎn)端是父類(lèi)的UMLUML圖,但終圖,但終點(diǎn)端使用一個(gè)空心的三角形表點(diǎn)端使用一個(gè)空心的三角形表示實(shí)線(xiàn)的結(jié)束示實(shí)線(xiàn)的結(jié)束 。 3.4 關(guān)聯(lián)關(guān)系(

33、關(guān)聯(lián)關(guān)系(AssociationAssociation)2022-6-2863 如果如果A A類(lèi)中成員變量是用類(lèi)中成員變量是用B B類(lèi)(接口)來(lái)聲明的變量,類(lèi)(接口)來(lái)聲明的變量,那么那么A A和和B B的關(guān)系是關(guān)聯(lián)關(guān)系,稱(chēng)的關(guān)系是關(guān)聯(lián)關(guān)系,稱(chēng)A A關(guān)聯(lián)于關(guān)聯(lián)于B B。那么。那么UMLUML通過(guò)通過(guò)使用一個(gè)實(shí)線(xiàn)連使用一個(gè)實(shí)線(xiàn)連A A和和B B的的UMLUML圖,實(shí)線(xiàn)的起始端是圖,實(shí)線(xiàn)的起始端是A A的的UMLUML圖,圖,終點(diǎn)端是終點(diǎn)端是B B的的UMLUML圖,但終點(diǎn)端使用一個(gè)指向圖,但終點(diǎn)端使用一個(gè)指向B B的的UMLUML圖的方圖的方向箭頭表示實(shí)線(xiàn)的結(jié)束向箭頭表示實(shí)線(xiàn)的結(jié)束 。 3.5

34、依賴(lài)關(guān)系(依賴(lài)關(guān)系(DependencyDependency) 2022-6-2864 如果如果A A類(lèi)中某個(gè)方法的參數(shù)用類(lèi)中某個(gè)方法的參數(shù)用B B類(lèi)(接口)來(lái)聲明的變類(lèi)(接口)來(lái)聲明的變量或某個(gè)方法返回的數(shù)據(jù)類(lèi)型是量或某個(gè)方法返回的數(shù)據(jù)類(lèi)型是B B類(lèi)型的,那么類(lèi)型的,那么A A和和B B的關(guān)的關(guān)系是依賴(lài)關(guān)系,稱(chēng)系是依賴(lài)關(guān)系,稱(chēng)A A依賴(lài)于依賴(lài)于B B。那么那么UMLUML通過(guò)使用一個(gè)虛線(xiàn)通過(guò)使用一個(gè)虛線(xiàn)連連A A和和B B的的UMLUML圖,虛線(xiàn)的起始端是圖,虛線(xiàn)的起始端是A A的的UMLUML圖,終點(diǎn)端是圖,終點(diǎn)端是B B的的UMLUML圖,但終點(diǎn)端使用一個(gè)指向圖,但終點(diǎn)端使用一個(gè)指向B

35、B的的UMLUML圖的方向箭頭表示圖的方向箭頭表示虛線(xiàn)的結(jié)束。虛線(xiàn)的結(jié)束。 3.6 實(shí)現(xiàn)關(guān)系(實(shí)現(xiàn)關(guān)系(RealizationRealization) 2022-6-2865 如果一個(gè)類(lèi)實(shí)現(xiàn)了一個(gè)如果一個(gè)類(lèi)實(shí)現(xiàn)了一個(gè)接口,那么類(lèi)和接口的關(guān)系接口,那么類(lèi)和接口的關(guān)系是實(shí)現(xiàn)關(guān)系,稱(chēng)類(lèi)實(shí)現(xiàn)接口。是實(shí)現(xiàn)關(guān)系,稱(chēng)類(lèi)實(shí)現(xiàn)接口。UMLUML通過(guò)使用虛線(xiàn)連接類(lèi)和通過(guò)使用虛線(xiàn)連接類(lèi)和它所實(shí)現(xiàn)的接口,虛線(xiàn)起始它所實(shí)現(xiàn)的接口,虛線(xiàn)起始端是類(lèi),虛線(xiàn)的終點(diǎn)端是它端是類(lèi),虛線(xiàn)的終點(diǎn)端是它實(shí)現(xiàn)的接口,但終點(diǎn)端使用實(shí)現(xiàn)的接口,但終點(diǎn)端使用一個(gè)空心的三角形表示虛線(xiàn)一個(gè)空心的三角形表示虛線(xiàn)的結(jié)束的結(jié)束 。3.7 注釋?zhuān)ㄗ⑨專(zhuān)ˋn

36、notationAnnotation) 2022-6-2866 UML UML使用注釋為類(lèi)圖提供附加的說(shuō)明。使用注釋為類(lèi)圖提供附加的說(shuō)明。UMLUML在一個(gè)帶卷角的在一個(gè)帶卷角的長(zhǎng)方形中顯示給出的注釋?zhuān)⑹褂锰摼€(xiàn)將這個(gè)帶卷角的長(zhǎng)方形長(zhǎng)方形中顯示給出的注釋?zhuān)⑹褂锰摼€(xiàn)將這個(gè)帶卷角的長(zhǎng)方形和所它所注釋的實(shí)體連接起來(lái)和所它所注釋的實(shí)體連接起來(lái) 。第四章第四章 命令模式命令模式 2022-6-2867命令模式(別名:動(dòng)作,事務(wù))命令模式(別名:動(dòng)作,事務(wù)) 將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以求對(duì)客

37、戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤消的操作。及支持可撤消的操作。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 在許多設(shè)計(jì)中,經(jīng)常涉及到一個(gè)對(duì)象請(qǐng)求另一個(gè)對(duì)在許多設(shè)計(jì)中,

38、經(jīng)常涉及到一個(gè)對(duì)象請(qǐng)求另一個(gè)對(duì)象調(diào)用其方法到達(dá)某種目的。如果請(qǐng)求者不希望或無(wú)象調(diào)用其方法到達(dá)某種目的。如果請(qǐng)求者不希望或無(wú)法直接和被請(qǐng)求者打交道,即不希望或無(wú)法含有被請(qǐng)法直接和被請(qǐng)求者打交道,即不希望或無(wú)法含有被請(qǐng)求者的引用,那么就可以使用命令模式。求者的引用,那么就可以使用命令模式。 二、二、命令模式的結(jié)構(gòu)與使用命令模式的結(jié)構(gòu)與使用 2022-6-2869模式的結(jié)構(gòu)中包括四種角色:模式的結(jié)構(gòu)中包括四種角色: 接收者(接收者(ReceiverReceiver) 命令命令(Command)(Command)接口接口 具體命令(具體命令(ConcreteCommandConcreteCommand

39、) 請(qǐng)求者(請(qǐng)求者(InvokerInvoker)2022-6-2870模式的模式的UMLUML類(lèi)圖類(lèi)圖 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、敵人我們知道如何偷襲敵人, ,保證完成任務(wù)保證完成任務(wù)); ); 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() /封裝著指揮官的請(qǐng)求封裝著指揮官的請(qǐng)求 army.sneakAttack(); army.sneakAttack(); /偷襲敵人偷襲敵人 2022-6-2874模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 4 4請(qǐng)求者(請(qǐng)求者(InvokerInvoker) ArmySuperior.java ArmySuperior.java public class ArmySuperiorpublic class ArmySuperior Command command; Command comma

43、nd; /用來(lái)存放具體命令的引用用來(lái)存放具體命令的引用 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應(yīng)用應(yīng)用 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)點(diǎn)命令模式的優(yōu)點(diǎn) 2022-6-2876 在命令模式中,請(qǐng)求者(Invoker)不直接與接收者(Receiver)交互,即請(qǐng)求者(Invoker)不包含接收者(Receiv

46、er)的引用,因此徹底消除了彼此之間的耦合。 命令模式滿(mǎn)足“開(kāi)-閉原則”。如果增加新的具體命令和該命令的接受者,不必修改調(diào)用者的代碼,調(diào)用者就可以使用新的命令對(duì)象;反之,如果增加新的調(diào)用者,不必修改現(xiàn)有的具體命令和接受者,新增加的調(diào)用者就可以使用已有的具體命令。 由于請(qǐng)求者的請(qǐng)求被封裝到了具體命令中,那么就可以將具體命令保存到持久化的媒介中,在需要的時(shí)候,重新執(zhí)行這個(gè)具體命令。因此,使用命令模式可以記錄日志。 使用命令模式可以對(duì)請(qǐng)求者的“請(qǐng)求”進(jìn)行排隊(duì)。每個(gè)請(qǐng)求都各自對(duì)應(yīng)一個(gè)具體命令,因此可以按一定順序執(zhí)行這些具體命令。第五章第五章 觀察者模式觀察者模式 2022-6-2877觀察者模式(別名

47、:依賴(lài),發(fā)布觀察者模式(別名:依賴(lài),發(fā)布-訂閱)訂閱) 定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被狀態(tài)發(fā)生變化時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新。自動(dòng)更新。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 在許多設(shè)計(jì)中,經(jīng)常涉及到多個(gè)對(duì)象在許多設(shè)計(jì)中,經(jīng)常涉及到多個(gè)對(duì)象都對(duì)一個(gè)特殊對(duì)象中的數(shù)據(jù)變化感興趣,都對(duì)一個(gè)特殊對(duì)象中的數(shù)據(jù)變化感興趣,而且這多個(gè)對(duì)象都希望跟蹤那個(gè)特殊對(duì)而且這多個(gè)對(duì)象都希望跟蹤那個(gè)特殊對(duì)象中的數(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類(lèi)圖類(lèi)圖 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、察者具體觀察者_(dá)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); /使當(dāng)前實(shí)例成為使當(dāng)前實(shí)例成為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(我是一個(gè)大學(xué)生我是一個(gè)大學(xué)生,); ,); System.out.println( System.out.println(我向文件我向文件+myFile.getName()+myFile.getName()+寫(xiě)入如下內(nèi)容寫(xiě)入如下內(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具體觀察者具體觀察者_(dá)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); /使當(dāng)前實(shí)例成為使當(dāng)前實(shí)例成為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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論