版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)學(xué)院教案課程名稱:設(shè)計(jì)模式開課部門:計(jì)算機(jī)學(xué)院開課學(xué)期:2024--2025學(xué)年第二學(xué)期授課班級(jí):23級(jí)軟件工程班任課教師:XXX教師職稱:副教授使用教材:教材主編出版社
課程導(dǎo)論與設(shè)計(jì)基石教案設(shè)計(jì)題目:課程導(dǎo)論與設(shè)計(jì)基石(設(shè)計(jì)模式概念與意義,面向?qū)ο笤O(shè)計(jì)原則SOLID,UML類圖與序列圖回顧)授課時(shí)長(zhǎng):4學(xué)時(shí)(180分鐘)授課班級(jí):23級(jí)軟件工程班主講教師:XXX學(xué)情分析1.知識(shí)基礎(chǔ):23級(jí)軟件工程專業(yè)大二下學(xué)期學(xué)生已修完《面向?qū)ο蟪绦蛟O(shè)計(jì)》(掌握類、繼承、多態(tài)等概念)、《UML與軟件建?!罚私釻ML類圖、用例圖基礎(chǔ))、《軟件工程導(dǎo)論》(熟悉軟件設(shè)計(jì)的基本目標(biāo)),具備理解設(shè)計(jì)模式與原則的前置知識(shí);
2.能力特點(diǎn):能編寫基礎(chǔ)面向?qū)ο蟠a,但對(duì)“為何需要設(shè)計(jì)模式”“如何判斷設(shè)計(jì)優(yōu)劣”缺乏系統(tǒng)認(rèn)知;能繪制簡(jiǎn)單UML圖,但對(duì)復(fù)雜場(chǎng)景(如多類協(xié)作)的圖表表達(dá)不夠熟練;
3.學(xué)習(xí)需求:處于從“編程實(shí)現(xiàn)”向“設(shè)計(jì)優(yōu)化”過(guò)渡的關(guān)鍵階段,亟需建立“設(shè)計(jì)思維”,掌握分析設(shè)計(jì)問(wèn)題、選擇解決方案的方法;
4.潛在難點(diǎn):可能因SOLID原則的抽象性產(chǎn)生理解障礙,或因UML圖與設(shè)計(jì)模式的關(guān)聯(lián)不清晰導(dǎo)致應(yīng)用困難,需通過(guò)具體案例降低抽象度。教學(xué)目標(biāo)掌握
?設(shè)計(jì)模式的定義、GoF分類(創(chuàng)建型/結(jié)構(gòu)型/行為型)及核心意義(復(fù)用性、可維護(hù)性、可擴(kuò)展性);
?SOLID五大原則的具體內(nèi)涵(單一職責(zé)、開放封閉、里氏替換、接口隔離、依賴倒置);
?UML類圖中類/接口的表示方法及繼承、關(guān)聯(lián)、聚合、組合、依賴關(guān)系的符號(hào);UML序列圖中對(duì)象、生命線、消息(同步/異步/返回)的繪制規(guī)范。
熟悉
?設(shè)計(jì)模式與SOLID原則的協(xié)同關(guān)系(如開放封閉原則是多數(shù)模式的設(shè)計(jì)指導(dǎo));
?通過(guò)代碼案例判斷是否違反SOLID原則(如“用戶管理類”同時(shí)包含數(shù)據(jù)存儲(chǔ)與界面展示方法違反單一職責(zé));
?結(jié)合簡(jiǎn)單設(shè)計(jì)場(chǎng)景(如工廠模式)繪制UML類圖與序列圖。
了解
?設(shè)計(jì)模式的歷史背景(GoF《設(shè)計(jì)模式》的出版意義);
?設(shè)計(jì)模式在開源框架中的應(yīng)用實(shí)例(如JDK迭代器模式、Spring依賴注入)。教學(xué)重點(diǎn)1.設(shè)計(jì)模式的核心概念(定義、分類、意義);
2.SOLID原則的具體內(nèi)容及應(yīng)用場(chǎng)景(如單一職責(zé)原則指導(dǎo)類的拆分);
3.UML類圖(關(guān)系類型)與序列圖(消息類型)的規(guī)范繪制。教學(xué)難點(diǎn)1.SOLID原則的抽象性與實(shí)際代碼應(yīng)用的對(duì)應(yīng)關(guān)系,學(xué)生難以在具體代碼中準(zhǔn)確判斷是否違反原則;
2.UML類圖/序列圖與設(shè)計(jì)模式結(jié)構(gòu)的映射關(guān)系,尤其是復(fù)雜模式中多類協(xié)作的動(dòng)態(tài)行為表示;
3.設(shè)計(jì)模式“解決什么問(wèn)題”的意義理解,易停留在概念層面而缺乏實(shí)際場(chǎng)景關(guān)聯(lián)。教學(xué)方法1.講授法:通過(guò)PPT動(dòng)態(tài)演示設(shè)計(jì)模式概念、SOLID原則定義及UML圖規(guī)范,結(jié)合代碼片段對(duì)比(如違反與符合SRP的代碼)幫助學(xué)生建立基礎(chǔ)認(rèn)知;
2.案例分析法:選取“電商商品展示”“日志系統(tǒng)”“在線考試題目模塊”等貼近軟件工程專業(yè)的實(shí)際案例,通過(guò)“問(wèn)題場(chǎng)景→劣質(zhì)設(shè)計(jì)→模式/原則改進(jìn)”的流程,引導(dǎo)學(xué)生理解抽象概念的應(yīng)用價(jià)值;
3.任務(wù)驅(qū)動(dòng)法:在UML圖回顧環(huán)節(jié),布置“繪制工廠模式類圖”“繪制用戶登錄序列圖”的即時(shí)任務(wù),通過(guò)課堂練習(xí)強(qiáng)化圖表繪制能力;
4.小組討論法:針對(duì)“如何判斷一個(gè)類是否違反單一職責(zé)原則”“UML序列圖中消息類型的選擇依據(jù)”等開放問(wèn)題,組織2-3人小組討論,鼓勵(lì)學(xué)生分享觀點(diǎn)并總結(jié)共性結(jié)論。板書設(shè)計(jì)課程導(dǎo)論與設(shè)計(jì)基石
一、設(shè)計(jì)模式
?定義:面向?qū)ο笤O(shè)計(jì)中常見問(wèn)題的可復(fù)用解決方案
?分類:創(chuàng)建型(對(duì)象創(chuàng)建)、結(jié)構(gòu)型(類/對(duì)象組合)、行為型(對(duì)象交互)
?意義:復(fù)用性↑、可維護(hù)性↑、可擴(kuò)展性↑
二、SOLID原則
1.單一職責(zé)(SRP):一個(gè)類僅有一個(gè)變化原因
2.開放封閉(OCP):對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉
3.里氏替換(LSP):子類可替換父類
4.接口隔離(ISP):不依賴不需要的接口
5.依賴倒置(DIP):依賴抽象而非細(xì)節(jié)
三、UML圖
?類圖:類(三層框)、接口(<<interface>>)、關(guān)系(繼承/實(shí)現(xiàn)/關(guān)聯(lián)/聚合/組合/依賴)
?序列圖:對(duì)象(矩形)、生命線(虛線)、消息(同步/異步/返回箭頭)教學(xué)過(guò)程教師活動(dòng)與教學(xué)內(nèi)容學(xué)生活動(dòng)教學(xué)意圖時(shí)間一、設(shè)計(jì)模式概念與意義
1.設(shè)計(jì)模式的定義與起源
設(shè)計(jì)模式是面向?qū)ο笤O(shè)計(jì)中針對(duì)常見問(wèn)題的可復(fù)用解決方案,本質(zhì)是“經(jīng)驗(yàn)的抽象”。1994年GoF(四人組)出版《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》,首次系統(tǒng)提出23種經(jīng)典模式,奠定了現(xiàn)代設(shè)計(jì)模式的理論基礎(chǔ)。需強(qiáng)調(diào)“模式”并非代碼模板,而是“設(shè)計(jì)思路”,需根據(jù)具體場(chǎng)景調(diào)整。
示例說(shuō)明:以“電商系統(tǒng)商品展示”場(chǎng)景為例,直接為每個(gè)商品類型編寫?yīng)毩⒋a(如手機(jī)、書籍)會(huì)導(dǎo)致代碼重復(fù),而引入“抽象產(chǎn)品”+“具體產(chǎn)品”的設(shè)計(jì)模式思路可解決此問(wèn)題。
2.設(shè)計(jì)模式的分類(GoF分類)
?創(chuàng)建型模式(5種):關(guān)注對(duì)象創(chuàng)建過(guò)程,如工廠方法、單例模式,解決“如何靈活創(chuàng)建對(duì)象”的問(wèn)題;
?結(jié)構(gòu)型模式(7種):關(guān)注類/對(duì)象組合,如適配器、裝飾器,解決“如何構(gòu)建靈活可擴(kuò)展的類結(jié)構(gòu)”的問(wèn)題;
?行為型模式(11種):關(guān)注對(duì)象間交互與職責(zé)分配,如觀察者、策略模式,解決“如何讓對(duì)象協(xié)作完成復(fù)雜行為”的問(wèn)題。
通過(guò)“咖啡店訂單系統(tǒng)”案例對(duì)比:未使用模式時(shí),新增飲品類型需修改主邏輯;使用工廠模式后,僅需擴(kuò)展工廠子類即可,體現(xiàn)創(chuàng)建型模式的優(yōu)勢(shì)。
3.設(shè)計(jì)模式的核心意義
?提高代碼復(fù)用性:避免重復(fù)造輪子,如JDK中迭代器模式統(tǒng)一集合遍歷方式;
?增強(qiáng)可維護(hù)性:模式化設(shè)計(jì)使代碼結(jié)構(gòu)清晰,如Spring框架通過(guò)依賴注入(DI,基于工廠模式)降低類間耦合;
?提升可擴(kuò)展性:符合“對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉”原則,如電商促銷活動(dòng)新增“滿減”類型時(shí),使用策略模式僅需添加新策略類。
二、面向?qū)ο笤O(shè)計(jì)原則SOLID
1.單一職責(zé)原則(SRP)
定義:一個(gè)類/模塊應(yīng)僅有一個(gè)引起變化的原因。
反例:設(shè)計(jì)“用戶管理類”時(shí),同時(shí)包含用戶數(shù)據(jù)存儲(chǔ)(與數(shù)據(jù)庫(kù)交互)、用戶信息校驗(yàn)(如郵箱格式)、用戶界面展示(如前端渲染)方法,導(dǎo)致修改數(shù)據(jù)庫(kù)結(jié)構(gòu)時(shí)可能影響界面邏輯。
正例:拆分為“UserDAO”(數(shù)據(jù)訪問(wèn))、“UserValidator”(校驗(yàn))、“UserView”(界面)三個(gè)類,職責(zé)明確,修改互不影響。
2.開放封閉原則(OCP)
定義:軟件實(shí)體(類、模塊、函數(shù))應(yīng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。
實(shí)現(xiàn)關(guān)鍵:通過(guò)抽象(接口/抽象類)隔離變化點(diǎn)。
案例:設(shè)計(jì)“圖形面積計(jì)算”系統(tǒng),初始支持圓形、矩形。若直接在主函數(shù)中通過(guò)if-else判斷圖形類型計(jì)算面積,新增三角形時(shí)需修改主函數(shù)。改進(jìn)方案:定義“Shape”接口(含“getArea()”方法),各圖形類實(shí)現(xiàn)該接口,主函數(shù)僅需調(diào)用“shape.getArea()”,新增圖形時(shí)只需添加新的實(shí)現(xiàn)類。
3.里氏替換原則(LSP)
定義:子類可以替換其父類且不影響程序正確性。
反例:設(shè)計(jì)“正方形”類繼承“矩形”類,重寫“setWidth()”和“setHeight()”方法(正方形寬高相等),導(dǎo)致使用矩形的代碼(如“設(shè)置寬10、高20”)在替換為正方形時(shí)出現(xiàn)邏輯錯(cuò)誤。
正例:正方形與矩形應(yīng)視為兄弟類,共同繼承“四邊形”抽象類,避免違反LSP。
4.接口隔離原則(ISP)
定義:客戶端不應(yīng)依賴其不需要的接口。
反例:定義“Worker”接口包含“work()”“eat()”“sleep()”方法,“RobotWorker”類實(shí)現(xiàn)該接口時(shí)需強(qiáng)制實(shí)現(xiàn)“eat()”“sleep()”(無(wú)意義方法)。
正例:拆分為“Workable”(work())、“Living”(eat(),sleep())兩個(gè)接口,“RobotWorker”僅實(shí)現(xiàn)“Workable”,“HumanWorker”實(shí)現(xiàn)兩個(gè)接口。
5.依賴倒置原則(DIP)
定義:高層模塊不依賴低層模塊,二者均依賴抽象;抽象不依賴細(xì)節(jié),細(xì)節(jié)依賴抽象。
案例:設(shè)計(jì)“日志系統(tǒng)”,高層模塊(業(yè)務(wù)邏輯)直接依賴低層模塊(FileLogger),若需切換為數(shù)據(jù)庫(kù)日志(DbLogger),需修改業(yè)務(wù)邏輯代碼。改進(jìn)方案:定義“Logger”接口(log()方法),業(yè)務(wù)邏輯依賴“Logger”,F(xiàn)ileLogger和DbLogger實(shí)現(xiàn)該接口,切換日志類型時(shí)僅需修改實(shí)例化代碼。
三、UML類圖與序列圖回顧
1.UML類圖核心元素
?類/接口表示:類用矩形框,分三層(類名、屬性、方法);接口用“<<interface>>”標(biāo)注。
?關(guān)系類型:
?繼承(泛化):空心三角箭頭+實(shí)線(類)/虛線(接口實(shí)現(xiàn));
?關(guān)聯(lián):實(shí)心箭頭(單向)或無(wú)箭頭(雙向)+實(shí)線,如“學(xué)生”關(guān)聯(lián)“課程”;
?聚合:空心菱形+實(shí)線(整體與部分可分離),如“班級(jí)”聚合“學(xué)生”;
?組合:實(shí)心菱形+實(shí)線(整體與部分不可分離),如“汽車”組合“發(fā)動(dòng)機(jī)”;
?依賴:虛線箭頭,如“駕駛員”依賴“汽車”(方法參數(shù)使用汽車)。
示例繪制:以“抽象工廠模式”結(jié)構(gòu)為例,繪制“AbstractFactory”接口、“ConcreteFactory1”“ConcreteFactory2”實(shí)現(xiàn)類,以及“ProductA”“ProductB”抽象產(chǎn)品與具體產(chǎn)品的類圖。
2.UML序列圖核心元素
?對(duì)象:矩形框標(biāo)注對(duì)象名(如“orderService:OrderService”),下方為生命線(垂直虛線);
?消息:水平箭頭表示對(duì)象間交互,同步消息(實(shí)心箭頭+實(shí)線)、異步消息(空心箭頭+實(shí)線)、返回消息(虛線箭頭);
?激活期:生命線中加粗部分,表示對(duì)象處于活動(dòng)狀態(tài)(如方法執(zhí)行中)。
示例繪制:以“用戶下單”場(chǎng)景為例,繪制“用戶界面”→“訂單服務(wù)”→“庫(kù)存服務(wù)”→“支付服務(wù)”的序列圖,展示訂單創(chuàng)建、庫(kù)存扣減、支付完成的交互過(guò)程。
四、綜合案例:設(shè)計(jì)模式與原則的協(xié)同應(yīng)用
以“在線考試系統(tǒng)”的“題目展示模塊”為例,綜合應(yīng)用SOLID原則與UML工具:
1.需求:支持單選題、多選題、判斷題三種題型,后續(xù)可能新增填空題。
2.問(wèn)題分析:初始設(shè)計(jì)將所有題型邏輯寫在一個(gè)“QuestionService”類中,新增題型需修改該類(違反OCP),且類職責(zé)過(guò)多(違反SRP)。
3.改進(jìn)方案:
?定義“Question”接口(含“display()”“checkAnswer()”方法),各題型類(SingleChoice、MultiChoice等)實(shí)現(xiàn)該接口(符合OCP、DIP);
?設(shè)計(jì)“QuestionFactory”工廠類負(fù)責(zé)創(chuàng)建具體題型對(duì)象(符合SRP);
?繪制類圖展示“Question”接口與具體題型的繼承關(guān)系,工廠類與題型的依賴關(guān)系;
?繪制序列圖展示“前端請(qǐng)求→工廠創(chuàng)建題型對(duì)象→題型對(duì)象展示題目”的交互流程。分組討論設(shè)計(jì)模式在真實(shí)項(xiàng)目中的具體應(yīng)用案例
分析SOLID原則在給定代碼實(shí)例中的體現(xiàn)程度
根據(jù)需求描述繪制對(duì)應(yīng)的UML類圖和序列圖建立設(shè)計(jì)模式的核心認(rèn)知框架并理解其工程價(jià)值
掌握面向?qū)ο笤O(shè)計(jì)的可維護(hù)性實(shí)現(xiàn)路徑
強(qiáng)化系統(tǒng)建模的標(biāo)準(zhǔn)化表達(dá)能力60分鐘
50分鐘
70分鐘課堂小結(jié)本次課程作為《設(shè)計(jì)模式》的導(dǎo)論與基石,重點(diǎn)完成三方面內(nèi)容:
1.明確設(shè)計(jì)模式是“面向?qū)ο笤O(shè)計(jì)中常見問(wèn)題的可復(fù)用解決方案”,理解其分類(創(chuàng)建型/結(jié)構(gòu)型/行為型)及核心意義(提升代碼復(fù)用性、可維護(hù)性、可擴(kuò)展性);
2.掌握SOLID五大原則的具體內(nèi)涵(單一職責(zé)、開放封閉、里氏替換、接口隔離、依賴倒置),能通過(guò)代碼案例區(qū)分違反與符合原則的設(shè)計(jì);
3.回顧UML類圖(類/接口表示、關(guān)系類型)與序列圖(對(duì)象、消息、生命線)的繪制規(guī)范,能結(jié)合簡(jiǎn)單設(shè)計(jì)場(chǎng)景完成圖表繪制。
需強(qiáng)調(diào):設(shè)計(jì)模式與SOLID原則是“設(shè)計(jì)思維”的核心工具,UML是“設(shè)計(jì)表達(dá)”的關(guān)鍵語(yǔ)言,三者協(xié)同構(gòu)成軟件設(shè)計(jì)的基石。作業(yè)布置基礎(chǔ)題(必做)
1.簡(jiǎn)述設(shè)計(jì)模式的核心意義(200字以內(nèi));
2.解釋開放封閉原則(OCP),并舉例說(shuō)明(如“圖形面積計(jì)算系統(tǒng)”)。
實(shí)踐題(必做)
1.針對(duì)“圖書館管理系統(tǒng)”中的“書籍借閱”場(chǎng)景(涉及“讀者”“圖書”“管理員”類),繪制UML類圖(需包含繼承/關(guān)聯(lián)關(guān)系);
2.繪制“用戶注冊(cè)”流程的序列圖(對(duì)象:用戶界面、注冊(cè)服務(wù)、郵件服務(wù);消息:提交注冊(cè)信息→驗(yàn)證信息→發(fā)送確認(rèn)郵件→返回成功)。
拓展題(選做)
閱讀JDK中“java.util.Iterator”接口及實(shí)現(xiàn)類(如ArrayList的迭代器),分析其符合哪些SOLID原則(至少2個(gè)),并撰寫500字分析報(bào)告。課后反思1.預(yù)設(shè)難點(diǎn)解決情況:需重點(diǎn)觀察學(xué)生對(duì)SOLID原則的理解是否停留在定義層面(如能否用自己的語(yǔ)言解釋“依賴倒置”),以及UML圖繪制中是否混淆聚合與組合關(guān)系(通過(guò)課堂練習(xí)反饋調(diào)整);
2.教學(xué)方法有效性:案例分析法是否降低了抽象概念的理解難度(如“日志系統(tǒng)”案例是否幫助學(xué)生理解DIP),小組討論是否激活了學(xué)生的主動(dòng)思考(統(tǒng)計(jì)討論參與度);
3.改進(jìn)方向:若學(xué)生對(duì)“設(shè)計(jì)模式意義”的理解較模糊,后續(xù)可補(bǔ)充更多開源框架(如Spring)的實(shí)際應(yīng)用案例;若UML圖繪制錯(cuò)誤率高,需增加“常見錯(cuò)誤示例”的專題講解;
4.學(xué)生反饋收集:通過(guò)課后問(wèn)卷收集對(duì)“案例復(fù)雜度”“圖表講解詳略”的建議,為后續(xù)課程調(diào)整提供依據(jù)。
創(chuàng)建型模式(一)教案設(shè)計(jì)題目:創(chuàng)建型模式(一)(單例模式的實(shí)現(xiàn)與陷阱,工廠方法模式,抽象工廠模式)授課時(shí)長(zhǎng):4學(xué)時(shí)(180分鐘)授課班級(jí):23級(jí)軟件工程班主講教師:XXX學(xué)情分析23級(jí)軟件工程專業(yè)(大二下學(xué)期)學(xué)生已修完《面向?qū)ο蟪绦蛟O(shè)計(jì)》《UML與軟件建?!贰盾浖こ虒?dǎo)論》,具備以下特點(diǎn):
?知識(shí)基礎(chǔ):熟悉類、對(duì)象、繼承、接口等面向?qū)ο蟾拍?,能閱讀UML類圖,但對(duì)軟件設(shè)計(jì)中的“可擴(kuò)展性”“低耦合”等目標(biāo)理解較淺。
?能力水平:具備基礎(chǔ)編程能力(如Java),但缺乏復(fù)雜系統(tǒng)設(shè)計(jì)經(jīng)驗(yàn),難以識(shí)別代碼中的“壞味道”并進(jìn)行重構(gòu)。
?學(xué)習(xí)特點(diǎn):對(duì)實(shí)際項(xiàng)目案例興趣較高,偏好通過(guò)代碼示例理解抽象概念;但對(duì)設(shè)計(jì)模式的抽象理論(如模式與設(shè)計(jì)原則的關(guān)系)可能存在理解困難。
?潛在挑戰(zhàn):抽象工廠模式中“產(chǎn)品族”的概念可能較難理解,單例模式的線程安全實(shí)現(xiàn)易混淆不同方法的適用場(chǎng)景。教學(xué)目標(biāo)教學(xué)目標(biāo)
?掌握:
?單例模式的5種實(shí)現(xiàn)方式(餓漢式、懶漢式、DCL、靜態(tài)內(nèi)部類、枚舉)及線程安全原理;
?工廠方法模式的結(jié)構(gòu)(抽象產(chǎn)品、具體產(chǎn)品、抽象工廠、具體工廠)與代碼實(shí)現(xiàn);
?抽象工廠模式的產(chǎn)品族概念、結(jié)構(gòu)及與工廠方法模式的區(qū)別。
?熟悉:
?單例模式的常見陷阱(線程不安全、反射攻擊、序列化破壞)及解決方案;
?工廠方法模式與抽象工廠模式的適用場(chǎng)景(如日志記錄、跨平臺(tái)UI);
?設(shè)計(jì)模式與“開閉原則”“依賴倒置原則”的關(guān)聯(lián)。
?了解:
?單例模式在JDK(如Runtime.getRuntime())和Spring框架中的應(yīng)用;
?工廠方法模式與抽象工廠模式在開源項(xiàng)目(如MyBatis、Hibernate)中的實(shí)際使用案例。教學(xué)重點(diǎn)1.單例模式的線程安全實(shí)現(xiàn)(DCL、靜態(tài)內(nèi)部類、枚舉);
2.工廠方法模式的結(jié)構(gòu)(抽象工廠與具體工廠的協(xié)作);
3.抽象工廠模式的產(chǎn)品族定義及與工廠方法模式的結(jié)構(gòu)差異。教學(xué)難點(diǎn)1.抽象工廠模式中抽象產(chǎn)品族的理解與實(shí)際應(yīng)用場(chǎng)景的匹配;2.單例模式在多線程環(huán)境下的線程安全實(shí)現(xiàn)及常見陷阱(如反射攻擊、序列化/反序列化破壞單例)的規(guī)避方法;3.工廠方法模式與抽象工廠模式的結(jié)構(gòu)差異及模式選擇的決策依據(jù)。教學(xué)方法1.案例分析法:通過(guò)數(shù)據(jù)庫(kù)連接池(單例)、日志記錄器(工廠方法)、跨平臺(tái)UI(抽象工廠)等實(shí)際案例,引導(dǎo)學(xué)生理解模式應(yīng)用場(chǎng)景。
2.代碼演示法:結(jié)合Java代碼示例,逐步展示單例模式的不同實(shí)現(xiàn)方式、工廠方法與抽象工廠的結(jié)構(gòu)差異,幫助學(xué)生掌握核心代碼邏輯。
3.小組討論法:組織學(xué)生討論“單例模式為何不能通過(guò)構(gòu)造方法創(chuàng)建多個(gè)實(shí)例”“工廠方法與抽象工廠的本質(zhì)區(qū)別”等問(wèn)題,深化對(duì)模式的理解。
4.任務(wù)驅(qū)動(dòng)法:布置課堂任務(wù)(如設(shè)計(jì)線程安全的單例類、用工廠方法改進(jìn)現(xiàn)有日志模塊),通過(guò)實(shí)踐鞏固理論知識(shí)。板書設(shè)計(jì)創(chuàng)建型模式(一)
一、單例模式
?核心:全局唯一實(shí)例
?實(shí)現(xiàn)方式:
餓漢式(類加載初始化)
懶漢式(延遲初始化,非線程安全)
DCL(雙重檢查鎖定+volatile)
靜態(tài)內(nèi)部類(類加載機(jī)制保證安全)
枚舉(最簡(jiǎn),防反射/序列化)
?陷阱:線程不安全、反射攻擊、序列化破壞
二、工廠方法模式
?問(wèn)題:客戶端與具體產(chǎn)品強(qiáng)耦合
?結(jié)構(gòu):
抽象產(chǎn)品(Product)→具體產(chǎn)品(ConcreteProduct)
抽象工廠(Creator)→具體工廠(ConcreteCreator)
?示例:日志記錄器(LoggerFactory→FileLoggerFactory)
三、抽象工廠模式
?問(wèn)題:創(chuàng)建產(chǎn)品族(一組相關(guān)對(duì)象)
?結(jié)構(gòu):
抽象產(chǎn)品族(Button+TextBox)→具體產(chǎn)品族(Windows/Mac組件)
抽象工廠(UIFactory)→具體工廠(WindowsUIFactory/MacUIFactory)
?與工廠方法區(qū)別:創(chuàng)建單一產(chǎn)品vs創(chuàng)建產(chǎn)品族教學(xué)過(guò)程教師活動(dòng)與教學(xué)內(nèi)容學(xué)生活動(dòng)教學(xué)意圖時(shí)間一、單例模式的實(shí)現(xiàn)與陷阱
1.單例模式的核心思想
單例模式(SingletonPattern)是創(chuàng)建型模式的一種,其核心目標(biāo)是確保一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)。適用場(chǎng)景包括需要全局唯一的資源管理器(如數(shù)據(jù)庫(kù)連接池、配置管理器)或需要嚴(yán)格控制實(shí)例數(shù)量的場(chǎng)景。
2.常見實(shí)現(xiàn)方式
?餓漢式:類加載時(shí)立即初始化實(shí)例,線程安全但可能浪費(fèi)資源。代碼示例:
java
publicclassEagerSingleton{
privatestaticfinalEagerSingletonINSTANCE=newEagerSingleton();
privateEagerSingleton(){}
publicstaticEagerSingletongetInstance(){
returnINSTANCE;
}
}
?懶漢式(非線程安全):延遲初始化,但多線程環(huán)境下可能創(chuàng)建多個(gè)實(shí)例。代碼示例:
java
publicclassLazySingleton{
privatestaticLazySingletonINSTANCE;
privateLazySingleton(){}
publicstaticLazySingletongetInstance(){
if(INSTANCE==null){
INSTANCE=newLazySingleton();//多線程此處可能重復(fù)創(chuàng)建
}
returnINSTANCE;
}
}
?雙重檢查鎖定(DCL):通過(guò)同步代碼塊和volatile關(guān)鍵字保證線程安全與性能。代碼示例:
java
publicclassDCLSingleton{
privatestaticvolatileDCLSingletonINSTANCE;
privateDCLSingleton(){}
publicstaticDCLSingletongetInstance(){
if(INSTANCE==null){
synchronized(DCLSingleton.class){
if(INSTANCE==null){
INSTANCE=newDCLSingleton();
}
}
}
returnINSTANCE;
}
}
?靜態(tài)內(nèi)部類:利用類加載機(jī)制保證線程安全,延遲初始化。代碼示例:
java
publicclassInnerClassSingleton{
privateInnerClassSingleton(){}
privatestaticclassHolder{
staticfinalInnerClassSingletonINSTANCE=newInnerClassSingleton();
}
publicstaticInnerClassSingletongetInstance(){
returnHolder.INSTANCE;
}
}
?枚舉:Java推薦的最簡(jiǎn)方式,天然防反射攻擊和序列化破壞。代碼示例:
java
publicenumEnumSingleton{
INSTANCE;
publicvoiddoSomething(){}
}
3.常見陷阱與解決方案
?線程不安全:懶漢式在多線程下可能創(chuàng)建多個(gè)實(shí)例,需使用DCL或靜態(tài)內(nèi)部類。
?反射攻擊:通過(guò)反射調(diào)用私有構(gòu)造方法創(chuàng)建新實(shí)例,可在構(gòu)造方法中添加實(shí)例存在檢查。
?序列化/反序列化破壞:反序列化時(shí)會(huì)創(chuàng)建新實(shí)例,需重寫readResolve()方法返回已有實(shí)例。
二、工廠方法模式
1.問(wèn)題引入
假設(shè)需要設(shè)計(jì)一個(gè)日志記錄器,支持文件日志、數(shù)據(jù)庫(kù)日志等多種類型。若直接通過(guò)new創(chuàng)建具體日志對(duì)象,會(huì)導(dǎo)致客戶端與具體類強(qiáng)耦合,違反“開閉原則”。工廠方法模式通過(guò)將對(duì)象創(chuàng)建延遲到子類解決此問(wèn)題。
2.模式結(jié)構(gòu)
?抽象產(chǎn)品(Product):定義產(chǎn)品的公共接口(如Logger接口)。
?具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)抽象產(chǎn)品接口的具體類(如FileLogger、DatabaseLogger)。
?抽象工廠(Creator):聲明創(chuàng)建產(chǎn)品的工廠方法(如createLogger())。
?具體工廠(ConcreteCreator):實(shí)現(xiàn)工廠方法,返回具體產(chǎn)品實(shí)例(如FileLoggerFactory、DatabaseLoggerFactory)。
3.實(shí)現(xiàn)示例
定義Logger接口:
java
publicinterfaceLogger{
voidlog(Stringmessage);
}
具體產(chǎn)品FileLogger和DatabaseLogger實(shí)現(xiàn)該接口。抽象工廠LoggerFactory聲明createLogger()方法,具體工廠FileLoggerFactory和DatabaseLoggerFactory分別實(shí)現(xiàn)該方法返回對(duì)應(yīng)產(chǎn)品??蛻舳送ㄟ^(guò)具體工廠獲取日志對(duì)象,無(wú)需依賴具體產(chǎn)品類。
三、抽象工廠模式
1.產(chǎn)品族與問(wèn)題擴(kuò)展
當(dāng)需要?jiǎng)?chuàng)建一組相關(guān)或依賴的對(duì)象(如跨平臺(tái)UI組件:Windows按鈕+文本框、Mac按鈕+文本框),工廠方法模式僅能創(chuàng)建單一產(chǎn)品,無(wú)法滿足多產(chǎn)品族需求,抽象工廠模式應(yīng)運(yùn)而生。
2.模式結(jié)構(gòu)
?抽象產(chǎn)品族(AbstractProductFamily):定義一組產(chǎn)品的接口(如Button、TextBox接口)。
?具體產(chǎn)品族(ConcreteProductFamily):實(shí)現(xiàn)各抽象產(chǎn)品接口的具體類(如WindowsButton、WindowsTextBox、MacButton、MacTextBox)。
?抽象工廠(AbstractFactory):聲明創(chuàng)建產(chǎn)品族中所有產(chǎn)品的方法(如createButton()、createTextBox())。
?具體工廠(ConcreteFactory):實(shí)現(xiàn)抽象工廠方法,返回具體產(chǎn)品族實(shí)例(如WindowsUIFactory、MacUIFactory)。
3.實(shí)現(xiàn)示例
定義Button和TextBox接口:
java
publicinterfaceButton{
voidclick();
}
publicinterfaceTextBox{
voidinput(Stringtext);
}
具體產(chǎn)品WindowsButton、WindowsTextBox、MacButton、MacTextBox實(shí)現(xiàn)對(duì)應(yīng)接口。抽象工廠UIFactory聲明createButton()和createTextBox()方法,具體工廠WindowsUIFactory和MacUIFactory分別實(shí)現(xiàn)這兩個(gè)方法,返回對(duì)應(yīng)平臺(tái)的組件??蛻舳送ㄟ^(guò)具體工廠獲取一組UI組件,確保組件風(fēng)格一致。
四、三種模式對(duì)比與應(yīng)用場(chǎng)景
?單例模式:適用于需要全局唯一實(shí)例的場(chǎng)景(如配置管理器)。
?工廠方法模式:適用于創(chuàng)建單一產(chǎn)品,且產(chǎn)品類型需擴(kuò)展的場(chǎng)景(如日志記錄器)。
?抽象工廠模式:適用于創(chuàng)建產(chǎn)品族(一組相關(guān)對(duì)象),且需切換整個(gè)產(chǎn)品族的場(chǎng)景(如跨平臺(tái)UI組件)。分析單例模式代碼案例并討論線程安全問(wèn)題
分組設(shè)計(jì)工廠方法模式實(shí)例并繪制類圖
角色扮演抽象工廠模式中不同產(chǎn)品族的創(chuàng)建過(guò)程掌握單例模式的多種實(shí)現(xiàn)方式及線程安全陷阱
理解工廠方法模式解耦對(duì)象創(chuàng)建與使用的設(shè)計(jì)思想
掌握抽象工廠模式對(duì)產(chǎn)品族系列對(duì)象的創(chuàng)建管理70分鐘
55分鐘
55分鐘課堂小結(jié)本次課程圍繞創(chuàng)建型模式中的單例模式、工廠方法模式、抽象工廠模式展開:
?單例模式核心是保證全局唯一實(shí)例,需掌握多種實(shí)現(xiàn)方式及陷阱規(guī)避;
?工廠方法模式通過(guò)子類化解決單一產(chǎn)品的創(chuàng)建問(wèn)題,降低客戶端與具體類的耦合;
?抽象工廠模式用于創(chuàng)建產(chǎn)品族,支持整體切換產(chǎn)品類型。
重點(diǎn)需理解三種模式的結(jié)構(gòu)差異與適用場(chǎng)景,為后續(xù)模式學(xué)習(xí)及實(shí)際項(xiàng)目開發(fā)奠定基礎(chǔ)。作業(yè)布置課后作業(yè)
1.基礎(chǔ)題(必做):
?編寫一個(gè)線程安全的單例類(要求使用靜態(tài)內(nèi)部類實(shí)現(xiàn)),并編寫測(cè)試代碼驗(yàn)證其單例特性;
?設(shè)計(jì)一個(gè)工廠方法模式,用于創(chuàng)建不同類型的圖表(如柱狀圖、折線圖),要求畫出UML類圖并編寫Java代碼。
2.提高題(選做):
?使用抽象工廠模式設(shè)計(jì)一個(gè)跨平臺(tái)的文件操作工具(支持Windows和Linux系統(tǒng),需包含文件讀取、寫入功能),要求用UML類圖描述結(jié)構(gòu)并實(shí)現(xiàn)核心代碼;
?查閱Spring框架源碼,找出其中使用工廠模式的一個(gè)實(shí)例(如BeanFactory),分析其實(shí)現(xiàn)方式并撰寫500字分析報(bào)告。
3.思考題:
?為什么枚舉實(shí)現(xiàn)的單例是Java中推薦的方式?它如何解決反射攻擊和序列化問(wèn)題?
?工廠方法模式中,抽象工廠是否可以沒(méi)有抽象產(chǎn)品?為什么?課后反思本次課需重點(diǎn)關(guān)注以下問(wèn)題:
?學(xué)生理解情況:抽象工廠模式的“產(chǎn)品族”概念可能部分學(xué)生理解困難,需通過(guò)更多跨平臺(tái)案例(如數(shù)據(jù)庫(kù)驅(qū)動(dòng)+連接池)強(qiáng)化;
?實(shí)踐效果:課堂任務(wù)中,部分學(xué)生在實(shí)現(xiàn)DCL單例時(shí)可能遺漏volatile關(guān)鍵字,需強(qiáng)調(diào)其作用(禁止指令重排序);
?互動(dòng)反饋:小組討論環(huán)節(jié)需觀察學(xué)生參與度,對(duì)沉默學(xué)生可通過(guò)提問(wèn)引導(dǎo);
?改進(jìn)方向:下次課可增加模式對(duì)比表格(如適用場(chǎng)景、結(jié)構(gòu)復(fù)雜度),幫助學(xué)生系統(tǒng)記憶;同時(shí)補(bǔ)充開源框架中的實(shí)際應(yīng)用案例(如Spring的BeanFactory),增強(qiáng)學(xué)生對(duì)模式價(jià)值的直觀認(rèn)知。
創(chuàng)建型模式(二)與結(jié)構(gòu)型模式(適配)教案設(shè)計(jì)題目:創(chuàng)建型模式(二)與結(jié)構(gòu)型模式(適配)(建造者模式,原型模式,適配器模式)授課時(shí)長(zhǎng):4學(xué)時(shí)(180分鐘)授課班級(jí):23級(jí)軟件工程班主講教師:XXX學(xué)情分析23級(jí)軟件工程專業(yè)大二下學(xué)期學(xué)生已完成《面向?qū)ο蟪绦蛟O(shè)計(jì)》《UML與軟件建模》等先修課程,具備以下特點(diǎn):
?知識(shí)基礎(chǔ):掌握類、對(duì)象、繼承、多態(tài)等面向?qū)ο蠛诵母拍?,能閱讀UML類圖,熟悉基本代碼編寫。
?能力特點(diǎn):具備一定的問(wèn)題分析能力,但對(duì)復(fù)雜設(shè)計(jì)問(wèn)題的抽象能力較弱;能編寫功能代碼,但對(duì)代碼的可維護(hù)性、可擴(kuò)展性關(guān)注不足。
?學(xué)習(xí)需求:對(duì)設(shè)計(jì)模式的實(shí)際應(yīng)用場(chǎng)景和價(jià)值認(rèn)知模糊,需要通過(guò)具體案例理解模式如何解決實(shí)際問(wèn)題;對(duì)模式間的區(qū)別(如建造者vs工廠模式)易混淆,需加強(qiáng)對(duì)比分析。
?潛在困難:可能因模式抽象性產(chǎn)生畏難情緒,需通過(guò)“問(wèn)題-解決方案”的引導(dǎo)式教學(xué)降低理解門檻;部分學(xué)生對(duì)深拷貝、接口轉(zhuǎn)換等細(xì)節(jié)實(shí)現(xiàn)存在困難,需結(jié)合代碼示例逐步講解。教學(xué)目標(biāo)教學(xué)目標(biāo)
掌握
?建造者模式、原型模式、適配器模式的核心結(jié)構(gòu)(類圖)、關(guān)鍵參與者及代碼實(shí)現(xiàn)(Java示例)。
?根據(jù)具體需求選擇建造者模式(多參數(shù)對(duì)象構(gòu)建)、原型模式(高效復(fù)制相似對(duì)象)或適配器模式(接口不兼容)的判斷方法。
?模式應(yīng)用中的常見陷阱(如建造者模式的過(guò)度設(shè)計(jì)、原型模式的淺拷貝導(dǎo)致數(shù)據(jù)污染)及規(guī)避策略。
熟悉
?三個(gè)模式與設(shè)計(jì)原則(單一職責(zé)、開閉原則、迪米特法則)的關(guān)聯(lián)(如建造者模式符合單一職責(zé)原則,適配器模式符合開閉原則)。
?模式在JDK(如StringBuilder是建造者模式的簡(jiǎn)化版)、Spring(如SpringMVC的HandlerAdapter是適配器模式)等框架中的實(shí)際應(yīng)用案例。
了解
?模式的擴(kuò)展變體(如fluentbuilder模式、帶注冊(cè)表的原型模式)。
?反模式(如為用模式而強(qiáng)行使用,導(dǎo)致代碼復(fù)雜度上升)的識(shí)別方法。教學(xué)重點(diǎn)1.三個(gè)模式的核心結(jié)構(gòu)與代碼實(shí)現(xiàn):建造者的Builder類設(shè)計(jì)、原型的clone()方法(淺/深拷貝)、適配器的接口轉(zhuǎn)換邏輯。
2.模式的適用場(chǎng)景判斷:建造者(多參數(shù)分步構(gòu)建)、原型(高效復(fù)制相似對(duì)象)、適配器(接口不兼容)。
3.模式與設(shè)計(jì)原則的關(guān)聯(lián):通過(guò)模式應(yīng)用提升代碼的可維護(hù)性、可擴(kuò)展性(如適配器模式通過(guò)封裝接口轉(zhuǎn)換符合開閉原則)。教學(xué)難點(diǎn)1.模式選擇依據(jù):學(xué)生難以根據(jù)具體需求準(zhǔn)確選擇建造者模式、原型模式或適配器模式,需理解模式間的核心差異與適用場(chǎng)景的邊界條件。
2.模式與設(shè)計(jì)原則的結(jié)合:如何通過(guò)單一職責(zé)原則、開閉原則等指導(dǎo)模式的應(yīng)用,避免為用模式而用模式的過(guò)度設(shè)計(jì)問(wèn)題。
3.復(fù)雜場(chǎng)景下的模式協(xié)作:例如在對(duì)象創(chuàng)建與接口適配的聯(lián)合場(chǎng)景中,如何協(xié)調(diào)建造者模式與適配器模式的交互邏輯。教學(xué)方法1.案例驅(qū)動(dòng)教學(xué)法:通過(guò)數(shù)據(jù)庫(kù)配置構(gòu)建、游戲角色復(fù)制、日志系統(tǒng)適配等真實(shí)開發(fā)場(chǎng)景案例,引導(dǎo)學(xué)生從問(wèn)題出發(fā)理解模式價(jià)值。
2.代碼重構(gòu)對(duì)比法:展示“無(wú)模式”的劣質(zhì)設(shè)計(jì)(如多參數(shù)構(gòu)造函數(shù)、重復(fù)初始化代碼、接口硬編碼),逐步重構(gòu)為模式實(shí)現(xiàn),直觀體現(xiàn)模式優(yōu)勢(shì)。
3.小組討論法:設(shè)置討論題(如“為電商商品詳情頁(yè)選擇構(gòu)建模式:建造者vs直接構(gòu)造?”“游戲角色復(fù)制用原型模式還是工廠模式?”),促進(jìn)學(xué)生主動(dòng)思考模式適用場(chǎng)景。
4.UML圖示法:通過(guò)類圖、時(shí)序圖展示模式結(jié)構(gòu)與協(xié)作過(guò)程,輔助學(xué)生理解抽象概念。
5.實(shí)踐編碼法:課堂穿插5-10分鐘小練習(xí)(如用建造者模式實(shí)現(xiàn)訂單類、用原型模式復(fù)制用戶信息對(duì)象),即時(shí)鞏固知識(shí)。板書設(shè)計(jì)板書設(shè)計(jì)(思維導(dǎo)圖形式)
創(chuàng)建型模式(二)與結(jié)構(gòu)型模式(適配)
├─一、建造者模式
│├─意圖:分離構(gòu)建與表示
│├─結(jié)構(gòu):Product、Builder、ConcreteBuilder、Director
│├─代碼關(guān)鍵:Builder靜態(tài)內(nèi)部類、鏈?zhǔn)秸{(diào)用
│└─場(chǎng)景:多參數(shù)對(duì)象(配置類、訂單類)
├─二、原型模式
│├─意圖:復(fù)制原型創(chuàng)建對(duì)象
│├─結(jié)構(gòu):Prototype接口、ConcretePrototype
│├─關(guān)鍵:淺拷貝vs深拷貝(引用類型處理)
│└─場(chǎng)景:高成本對(duì)象(游戲角色、模板)
├─三、適配器模式
│├─意圖:轉(zhuǎn)換接口兼容
│├─結(jié)構(gòu):Target、Adaptee、Adapter(類/對(duì)象適配器)
│├─關(guān)鍵:組合或繼承實(shí)現(xiàn)接口轉(zhuǎn)換
│└─場(chǎng)景:新舊系統(tǒng)對(duì)接、第三方庫(kù)適配
└─四、模式對(duì)比
├─類型:創(chuàng)建型(建、原)vs結(jié)構(gòu)型(適)
├─核心:對(duì)象創(chuàng)建方式vs類/對(duì)象組合
└─場(chǎng)景:構(gòu)建/復(fù)制/適配
教學(xué)過(guò)程教師活動(dòng)與教學(xué)內(nèi)容學(xué)生活動(dòng)教學(xué)意圖時(shí)間一、課程導(dǎo)入(問(wèn)題驅(qū)動(dòng))
通過(guò)典型軟件設(shè)計(jì)問(wèn)題引入:
?問(wèn)題1:設(shè)計(jì)一個(gè)配置類,需支持多參數(shù)(如數(shù)據(jù)庫(kù)連接配置:URL、用戶名、密碼、超時(shí)時(shí)間等)的靈活構(gòu)建,且部分參數(shù)可選。直接通過(guò)構(gòu)造函數(shù)或setter方法可能導(dǎo)致代碼冗余或參數(shù)混亂。
?問(wèn)題2:系統(tǒng)需動(dòng)態(tài)生成大量相似對(duì)象(如游戲角色模板復(fù)制),直接new操作可能導(dǎo)致性能瓶頸或重復(fù)初始化代碼。
?問(wèn)題3:新模塊需調(diào)用遺留系統(tǒng)的接口,但兩者接口不兼容(如舊接口返回XML,新接口需JSON),如何實(shí)現(xiàn)無(wú)縫對(duì)接?
引導(dǎo)學(xué)生思考現(xiàn)有解決方案的不足,引出創(chuàng)建型模式(建造者、原型)與結(jié)構(gòu)型模式(適配器)的必要性。
二、建造者模式(BuilderPattern)
1.模式意圖
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。核心解決“多參數(shù)對(duì)象的分步構(gòu)建”問(wèn)題。
2.模式結(jié)構(gòu)
?產(chǎn)品(Product):待構(gòu)建的復(fù)雜對(duì)象(如配置類)。
?抽象建造者(Builder):定義構(gòu)建產(chǎn)品各部分的接口(如buildURL()、buildTimeout())。
?具體建造者(ConcreteBuilder):實(shí)現(xiàn)抽象建造者,完成具體構(gòu)建步驟,并返回產(chǎn)品實(shí)例。
?指揮者(Director):調(diào)用建造者接口,控制構(gòu)建流程(可選,簡(jiǎn)化版可省略)。
3.代碼示例
以數(shù)據(jù)庫(kù)連接配置類為例,展示傳統(tǒng)構(gòu)造函數(shù)的缺陷(參數(shù)順序易出錯(cuò)、可選參數(shù)需重載多個(gè)構(gòu)造函數(shù)),逐步重構(gòu)為建造者模式:
java
//產(chǎn)品類
classDBConfig{
privateStringurl;
privateStringusername;
privateStringpassword;
privateinttimeout;
//私有構(gòu)造函數(shù),僅通過(guò)Builder創(chuàng)建
privateDBConfig(Builderbuilder){...}
//Builder靜態(tài)內(nèi)部類
staticclassBuilder{
privateStringurl;
privateStringusername;
privateStringpassword="";//默認(rèn)空
privateinttimeout=3000;//默認(rèn)3秒
publicBuilderurl(Stringurl){...}
publicBuilderusername(Stringusername){...}
publicDBConfigbuild(){returnnewDBConfig(this);}
}
}
//使用示例:
DBConfigconfig=newDBConfig.Builder()
.url("jdbc:mysql://localhost:3306/db")
.username("root")
.timeout(5000)
.build();
4.適用場(chǎng)景
?對(duì)象需多個(gè)可選參數(shù)或步驟化構(gòu)建(如GUI組件布局、SQL查詢構(gòu)造)。
?需隱藏對(duì)象創(chuàng)建細(xì)節(jié),提供統(tǒng)一構(gòu)建接口。
三、原型模式(PrototypePattern)
1.模式意圖
通過(guò)復(fù)制現(xiàn)有對(duì)象(原型)創(chuàng)建新對(duì)象,避免重復(fù)初始化過(guò)程,提升性能。核心解決“相似對(duì)象的高效創(chuàng)建”問(wèn)題。
2.模式結(jié)構(gòu)
?原型接口(Prototype):聲明克隆方法(clone())。
?具體原型(ConcretePrototype):實(shí)現(xiàn)克隆方法,支持淺拷貝(復(fù)制基本類型和引用)或深拷貝(遞歸復(fù)制引用對(duì)象)。
3.代碼示例
以游戲角色模板復(fù)制為例,展示直接new與原型模式的對(duì)比:
java
//原型接口
interfacePrototype{
Prototypeclone();
}
//具體原型(游戲角色)
classGameCharacterimplementsPrototype{
privateStringname;
privateintlevel;
privateList<String>skills;//技能列表
//深拷貝實(shí)現(xiàn)(需處理引用類型)
@Override
publicGameCharacterclone(){
GameCharacterclone=newGameCharacter();
=;
clone.level=this.level;
clone.skills=newArrayList<>(this.skills);//復(fù)制列表
returnclone;
}
}
//使用示例:
GameCharactertemplate=newGameCharacter();
//初始化模板技能
GameCharacterplayer1=template.clone();
GameCharacterplayer2=template.clone();
4.適用場(chǎng)景
?對(duì)象初始化成本高(如需要讀取文件、數(shù)據(jù)庫(kù)或執(zhí)行復(fù)雜計(jì)算)。
?對(duì)象間差異小,可通過(guò)復(fù)制后修改部分屬性生成新對(duì)象(如Excel模板復(fù)制)。
四、適配器模式(AdapterPattern)
1.模式意圖
將一個(gè)類的接口轉(zhuǎn)換成客戶期望的另一個(gè)接口,使原本接口不兼容的類能一起工作。核心解決“新舊接口適配”問(wèn)題。
2.模式結(jié)構(gòu)
?目標(biāo)接口(Target):客戶期望的接口(如需要JSON輸出)。
?適配者(Adaptee):現(xiàn)有不兼容的接口(如返回XML的舊接口)。
?適配器(Adapter):通過(guò)組合或繼承適配者,實(shí)現(xiàn)目標(biāo)接口(類適配器模式用繼承,對(duì)象適配器模式用組合)。
3.代碼示例
以新舊日志系統(tǒng)對(duì)接為例(舊系統(tǒng)輸出XML,新系統(tǒng)需JSON),展示對(duì)象適配器模式:
java
//目標(biāo)接口(新系統(tǒng)需要的JSON日志)
interfaceJsonLogger{
voidlog(Stringmessage);
}
//適配者(舊系統(tǒng)的XML日志)
classXmlLogger{
publicvoidlogXml(Stringmessage){
System.out.println("<log>"+message+"</log>");
}
}
//對(duì)象適配器
classXmlToJsonAdapterimplementsJsonLogger{
privateXmlLoggeradaptee;
publicXmlToJsonAdapter(XmlLoggeradaptee){
this.adaptee=adaptee;
}
@Override
publicvoidlog(Stringmessage){
//將JSON轉(zhuǎn)換為XML邏輯(簡(jiǎn)化示例)
StringxmlMessage="{\"message\":\""+message+"\"}";
adaptee.logXml(xmlMessage);
}
}
//使用示例:
XmlLoggeroldLogger=newXmlLogger();
JsonLoggernewLogger=newXmlToJsonAdapter(oldLogger);
newLogger.log("系統(tǒng)啟動(dòng)成功");//輸出<log>{"message":"系統(tǒng)啟動(dòng)成功"}</log>
4.適用場(chǎng)景
?復(fù)用遺留系統(tǒng)或第三方庫(kù)的功能,但接口不兼容。
?統(tǒng)一多個(gè)不兼容接口(如多格式文件讀取適配器)。
五、模式對(duì)比與總結(jié)
通過(guò)表格對(duì)比三個(gè)模式的核心差異:
|模式|類型|解決問(wèn)題|關(guān)鍵實(shí)現(xiàn)方式|典型應(yīng)用場(chǎng)景|
||||||
|建造者模式|創(chuàng)建型|復(fù)雜對(duì)象的分步構(gòu)建|分離構(gòu)建與表示,Builder類|多參數(shù)對(duì)象、步驟化構(gòu)建|
|原型模式|創(chuàng)建型|相似對(duì)象的高效復(fù)制|克隆方法(淺/深拷貝)|高成本對(duì)象初始化、模板復(fù)制|
|適配器模式|結(jié)構(gòu)型|接口不兼容問(wèn)題|轉(zhuǎn)換接口(組合/繼承)|新舊系統(tǒng)對(duì)接、多接口適配|
強(qiáng)調(diào):創(chuàng)建型模式關(guān)注“對(duì)象如何創(chuàng)建”,結(jié)構(gòu)型模式關(guān)注“類/對(duì)象如何組合”。學(xué)生分組分析建造者模式的案例應(yīng)用場(chǎng)景
學(xué)生通過(guò)原型模式實(shí)現(xiàn)對(duì)象克隆的代碼實(shí)踐
學(xué)生改造現(xiàn)有代碼實(shí)現(xiàn)適配器模式接口轉(zhuǎn)換理解建造者模式分離復(fù)雜對(duì)象構(gòu)造過(guò)程的核心價(jià)值
掌握原型模式實(shí)現(xiàn)對(duì)象高效復(fù)制的克隆機(jī)制
培養(yǎng)適配器模式解決接口不兼容問(wèn)題的實(shí)踐能力60分鐘
50分鐘
70分鐘課堂小結(jié)本次課程圍繞創(chuàng)建型模式(建造者、原型)與結(jié)構(gòu)型模式(適配器)展開,核心內(nèi)容總結(jié)如下:
?建造者模式:通過(guò)分離對(duì)象構(gòu)建與表示,解決多參數(shù)對(duì)象的靈活構(gòu)建問(wèn)題,關(guān)鍵在于Builder類的設(shè)計(jì)。
?原型模式:通過(guò)克隆現(xiàn)有對(duì)象,避免重復(fù)初始化,重點(diǎn)掌握淺拷貝與深拷貝的區(qū)別及實(shí)現(xiàn)。
?適配器模式:通過(guò)接口轉(zhuǎn)換,解決新舊系統(tǒng)或第三方庫(kù)的接口不兼容問(wèn)題,對(duì)象適配器(組合)比類適配器(繼承)更靈活。
需重點(diǎn)關(guān)注:模式的適用場(chǎng)景判斷、代碼實(shí)現(xiàn)細(xì)節(jié)(如建造者的鏈?zhǔn)秸{(diào)用、原型的深拷貝處理)、模式與設(shè)計(jì)原則(如單一職責(zé)、開閉原則)的契合性。作業(yè)布置課后作業(yè)
基礎(chǔ)題(必做)
1.用建造者模式實(shí)現(xiàn)一個(gè)“用戶信息類”(包含姓名、年齡、性別(可選)、聯(lián)系方式(可選)),要求支持鏈?zhǔn)秸{(diào)用構(gòu)建。
2.用原型模式實(shí)現(xiàn)一個(gè)“文檔模板類”(包含標(biāo)題、作者、正文模板),要求實(shí)現(xiàn)深拷貝(正文模板為L(zhǎng)ist<String>類型)。
3.用對(duì)象適配器模式將“舊支付接口”(方法:voidpayByCash(doubleamount))轉(zhuǎn)換為“新支付接口”(方法:Stringpay(doubleamount),返回JSON格式支付結(jié)果)。
提高題(選做)
分析Spring框架中BeanFactory(工廠模式)與ApplicationContext(包含適配器模式思想)的設(shè)計(jì),撰寫500字分析報(bào)告,說(shuō)明其中涉及的設(shè)計(jì)模式及應(yīng)用場(chǎng)景。
拓展題(興趣可選)
閱讀JDK源碼,找出ArrayList的clone()方法(淺拷貝)與HashMap的clone()方法(部分深拷貝)的實(shí)現(xiàn)差異,總結(jié)淺拷貝的適用條件。課后反思1.預(yù)設(shè)難點(diǎn)應(yīng)對(duì):預(yù)計(jì)學(xué)生對(duì)“模式選擇依據(jù)”理解困難,需在課堂討論環(huán)節(jié)通過(guò)具體場(chǎng)景(如“用戶注冊(cè)信息構(gòu)建用建造者還是工廠?”)強(qiáng)化判斷邏輯;對(duì)“深拷貝實(shí)現(xiàn)”易出錯(cuò),需在代碼示例中重點(diǎn)標(biāo)注引用類型的處理(如集合類的newArrayList<>(list))。
2.實(shí)踐環(huán)節(jié)效果:課堂小練習(xí)需控制難度,避免因代碼復(fù)雜影響參與度;可提前提供部分代碼框架(如原型模式的Prototype接口),降低學(xué)生編碼門檻。
3.反饋改進(jìn)方向:課后通過(guò)作業(yè)批改和小組討論收集學(xué)生疑問(wèn),針對(duì)高頻問(wèn)題(如適配器模式的類適配器與對(duì)象適配器的選擇)錄制微視頻補(bǔ)充講解;在下節(jié)課前5分鐘進(jìn)行“模式快問(wèn)快答”,鞏固核心知識(shí)點(diǎn)。
4.教學(xué)資源優(yōu)化:后續(xù)可引入更多行業(yè)案例(如電商系統(tǒng)的商品詳情頁(yè)構(gòu)建用建造者模式、日志框架的多格式輸出用適配器模式),增強(qiáng)學(xué)生對(duì)模式實(shí)用性的感知。
結(jié)構(gòu)型模式(一)教案設(shè)計(jì)題目:結(jié)構(gòu)型模式(一)(橋接模式,組合模式,裝飾器模式)授課時(shí)長(zhǎng):4學(xué)時(shí)(180分鐘)授課班級(jí):23級(jí)軟件工程班主講教師:XXX學(xué)情分析23級(jí)軟件工程專業(yè)大二下學(xué)期學(xué)生已完成《面向?qū)ο蟪绦蛟O(shè)計(jì)》《UML與軟件建?!返认刃拚n程,具備以下特點(diǎn):
?知識(shí)基礎(chǔ):熟悉類、繼承、接口等面向?qū)ο蟾拍?,能繪制簡(jiǎn)單UML類圖;了解代碼“壞味道”(如重復(fù)代碼、緊耦合),但缺乏系統(tǒng)的設(shè)計(jì)改進(jìn)方法。
?學(xué)習(xí)需求:處于從“實(shí)現(xiàn)功能”向“優(yōu)化設(shè)計(jì)”過(guò)渡階段,渴望掌握可復(fù)用、可擴(kuò)展的設(shè)計(jì)方法,但對(duì)設(shè)計(jì)模式的抽象概念易產(chǎn)生畏難情緒。
?能力短板:對(duì)模式的實(shí)際應(yīng)用場(chǎng)景判斷能力較弱(如何時(shí)用橋接而非適配器),代碼設(shè)計(jì)時(shí)易陷入“為用模式而用模式”的誤區(qū)。
?學(xué)習(xí)特點(diǎn):偏好具象案例(如框架源碼中的模式應(yīng)用),對(duì)純理論講解興趣較低;小組協(xié)作能力較強(qiáng),適合通過(guò)討論加深理解。教學(xué)目標(biāo)教學(xué)目標(biāo)
掌握
?橋接模式、組合模式、裝飾器模式的核心意圖、類圖結(jié)構(gòu)及關(guān)鍵代碼實(shí)現(xiàn)(如橋接的抽象類與實(shí)現(xiàn)類分離、組合的組件接口設(shè)計(jì)、裝飾器的包裝邏輯)。
?三個(gè)模式的典型應(yīng)用場(chǎng)景(如橋接用于跨平臺(tái)適配、組合用于樹形結(jié)構(gòu)管理、裝飾器用于功能動(dòng)態(tài)擴(kuò)展)。
熟悉
?三個(gè)模式與設(shè)計(jì)原則的關(guān)聯(lián)(如橋接符合依賴倒置原則、裝飾器符合開閉原則、組合符合里氏替換原則)。
?模式間的區(qū)別(如橋接關(guān)注分離抽象與實(shí)現(xiàn),裝飾器關(guān)注功能擴(kuò)展)。
了解
?設(shè)計(jì)模式在開源框架中的應(yīng)用(如JavaIO中的裝飾器模式、SpringAOP中的橋接思想)。
?過(guò)度使用模式的潛在問(wèn)題(如增加代碼復(fù)雜度、降低可讀性)。教學(xué)重點(diǎn)1.橋接模式的核心:抽象(Abstraction)與實(shí)現(xiàn)(Implementor)的分離設(shè)計(jì),通過(guò)組合替代繼承。
2.組合模式的核心:統(tǒng)一葉子節(jié)點(diǎn)(Leaf)與容器節(jié)點(diǎn)(Composite)的接口,支持遞歸操作。
3.裝飾器模式的核心:通過(guò)包裝對(duì)象(Decorator)動(dòng)態(tài)擴(kuò)展功能,保持接口一致性。
4.模式的典型應(yīng)用場(chǎng)景:橋接(多維度擴(kuò)展)、組合(樹形結(jié)構(gòu))、裝飾器(功能疊加)。教學(xué)難點(diǎn)1.模式間的區(qū)別與選擇:學(xué)生容易混淆橋接模式(分離抽象與實(shí)現(xiàn))、組合模式(樹形結(jié)構(gòu)管理)、裝飾器模式(動(dòng)態(tài)擴(kuò)展功能)的核心意圖,需通過(guò)對(duì)比案例強(qiáng)化理解。
2.實(shí)際場(chǎng)景的合理應(yīng)用:學(xué)生可能過(guò)度使用模式或誤用場(chǎng)景(如用裝飾器替代繼承),需引導(dǎo)其結(jié)合單一職責(zé)、開閉原則判斷適用性。
3.復(fù)雜類圖的解析與設(shè)計(jì):三個(gè)模式均涉及多類協(xié)作(如橋接的抽象類與實(shí)現(xiàn)類、組合的容器與葉子、裝飾器的組件與裝飾者),學(xué)生繪制UML類圖時(shí)易遺漏關(guān)聯(lián)關(guān)系。教學(xué)方法1.案例驅(qū)動(dòng)法:通過(guò)跨平臺(tái)圖形庫(kù)、文件系統(tǒng)、咖啡定制等真實(shí)場(chǎng)景問(wèn)題,引導(dǎo)學(xué)生發(fā)現(xiàn)設(shè)計(jì)痛點(diǎn),激發(fā)學(xué)習(xí)興趣。
2.UML可視化教學(xué):結(jié)合類圖、時(shí)序圖動(dòng)態(tài)演示模式結(jié)構(gòu)(如橋接的抽象-實(shí)現(xiàn)分離、組合的樹形遞歸調(diào)用),降低理解難度。
3.對(duì)比分析法:通過(guò)表格對(duì)比三個(gè)模式的意圖、結(jié)構(gòu)、適用場(chǎng)景,幫助學(xué)生建立模式間的區(qū)分邏輯。
4.代碼實(shí)踐引導(dǎo):展示關(guān)鍵代碼片段(如橋接的DrawAPI接口實(shí)現(xiàn)、組合的Folder遞歸計(jì)算大?。?,講解設(shè)計(jì)細(xì)節(jié)(如抽象類與接口的選擇)。
5.小組討論:拋出“裝飾器與繼承的優(yōu)缺點(diǎn)”“組合模式中葉子節(jié)點(diǎn)是否需要實(shí)現(xiàn)add()方法”等問(wèn)題,鼓勵(lì)學(xué)生結(jié)合先修知識(shí)(面向?qū)ο笤瓌t)展開討論。板書設(shè)計(jì)結(jié)構(gòu)型模式(一):橋接、組合、裝飾器
一、核心概念
結(jié)構(gòu)型模式:通過(guò)類/對(duì)象組合,構(gòu)建靈活、可復(fù)用的結(jié)構(gòu)。
二、模式對(duì)比
|模式|意圖|關(guān)鍵結(jié)構(gòu)|場(chǎng)景示例|
|||||
|橋接|分離抽象與實(shí)現(xiàn)|Abstraction→Implementor|跨平臺(tái)圖形庫(kù)|
|組合|統(tǒng)一部分與整體操作|Component(Leaf/Composite)|文件系統(tǒng)|
|裝飾器|動(dòng)態(tài)擴(kuò)展功能|Decorator→Component|咖啡定制|
三、關(guān)鍵代碼片段
?橋接:Shape類持有DrawAPI接口,調(diào)用draw()方法。
?組合:Folder類維護(hù)List<FileSystemComponent>,遞歸計(jì)算大小。
?裝飾器:MilkDecorator繼承CoffeeDecorator,重寫cost()方法。
四、設(shè)計(jì)原則關(guān)聯(lián)
橋接(依賴倒置)、組合(里氏替換)、裝飾器(開閉)。教學(xué)過(guò)程教師活動(dòng)與教學(xué)內(nèi)容學(xué)生活動(dòng)教學(xué)意圖時(shí)間一、課程導(dǎo)入(問(wèn)題驅(qū)動(dòng))
展示三個(gè)典型軟件設(shè)計(jì)問(wèn)題:
?問(wèn)題1:開發(fā)跨平臺(tái)圖形庫(kù)(Windows/macOS),需支持矩形、圓形繪制,傳統(tǒng)繼承導(dǎo)致類爆炸(如WindowsRectangle、macOSRectangle等)。
?問(wèn)題2:設(shè)計(jì)文件系統(tǒng)(文件/文件夾),需統(tǒng)一操作(如計(jì)算總大?。苯舆f歸調(diào)用易導(dǎo)致代碼重復(fù)。
?問(wèn)題3:實(shí)現(xiàn)咖啡定制(基礎(chǔ)咖啡+加奶/加糖/加奶油),若用繼承會(huì)因組合過(guò)多產(chǎn)生“類爆炸”(如MilkCoffee、SugarCoffee等)。
引導(dǎo)學(xué)生思考:如何通過(guò)設(shè)計(jì)模式解決上述問(wèn)題?引出“結(jié)構(gòu)型模式”主題。
二、橋接模式(BridgePattern)
1.模式意圖
將抽象部分與實(shí)現(xiàn)部分分離,使它們可以獨(dú)立變化。核心是“解耦抽象與實(shí)現(xiàn)”,避免繼承導(dǎo)致的強(qiáng)綁定。
2.結(jié)構(gòu)分析
?抽象類(Abstraction):定義高層接口(如Shape),持有實(shí)現(xiàn)類(Implementor)的引用。
?擴(kuò)展抽象類(RefinedAbstraction):抽象類的子類(如Circle、Rectangle),細(xì)化接口。
?實(shí)現(xiàn)類接口(Implementor):定義實(shí)現(xiàn)部分的接口(如DrawAPI)。
?具體實(shí)現(xiàn)類(ConcreteImplementor):實(shí)現(xiàn)類接口的具體子類(如WindowsDrawAPI、MacOSDrawAPI)。
3.代碼示例
以跨平臺(tái)圖形庫(kù)為例,展示Shape(抽象類)與DrawAPI(實(shí)現(xiàn)類接口)的分離設(shè)計(jì)。通過(guò)UML類圖演示Shape調(diào)用DrawAPI的繪制方法,不同平臺(tái)的DrawAPI實(shí)現(xiàn)具體繪制邏輯。
4.適用場(chǎng)景
?當(dāng)抽象與其實(shí)現(xiàn)需要獨(dú)立擴(kuò)展時(shí)(如多平臺(tái)適配)。
?避免繼承導(dǎo)致的類數(shù)量指數(shù)級(jí)增長(zhǎng)時(shí)(如“平臺(tái)+圖形類型”組合)。
三、組合模式(CompositePattern)
1.模式意圖
將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使客戶端對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。核心是“統(tǒng)一葉子節(jié)點(diǎn)與容器節(jié)點(diǎn)的操作”。
2.結(jié)構(gòu)分析
?組件(Component):定義葉子節(jié)點(diǎn)和容器節(jié)點(diǎn)的公共接口(如FileSystemComponent),包含add()、remove()、getSize()等方法。
?葉子節(jié)點(diǎn)(Leaf):無(wú)子節(jié)點(diǎn)的組件(如File),實(shí)現(xiàn)具體操作(如計(jì)算文件大?。?/p>
?容器節(jié)點(diǎn)(Composite):包含子組件的組件(如Folder),管理子組件并實(shí)現(xiàn)遞歸操作(如計(jì)算文件夾總大?。?。
3.代碼示例
以文件系統(tǒng)為例,定義FileSystemComponent接口,F(xiàn)ile類(葉子)實(shí)現(xiàn)getSize()返回自身大小,F(xiàn)older類(容器)維護(hù)子組件列表,getSize()方法遍歷子組件并累加大小。通過(guò)遞歸調(diào)用演示“統(tǒng)一操作”特性。
4.適用場(chǎng)景
?表示對(duì)象的部分-整體層次結(jié)構(gòu)(如組織架構(gòu)、菜單系統(tǒng))。
?需要統(tǒng)一處理單個(gè)對(duì)象和組合對(duì)象(如批量刪除、統(tǒng)計(jì))。
四、裝飾器模式(DecoratorPattern)
1.模式意圖
動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),相比繼承更靈活。核心是“組合優(yōu)于繼承”,通過(guò)包裝對(duì)象實(shí)現(xiàn)功能擴(kuò)展。
2.結(jié)構(gòu)分析
?組件(Component):定義對(duì)象的核心接口(如Coffee)。
?具體組件(ConcreteComponent):組件的基礎(chǔ)實(shí)現(xiàn)(如BasicCoffee)。
?裝飾器(Decorator):持有組件引用,實(shí)現(xiàn)與組件相同的接口(如CoffeeDecorator)。
?具體裝飾器(ConcreteDecorator):裝飾器的子類(如MilkDecorator、SugarDecorator),添加額外功能(如加奶后調(diào)整價(jià)格)。
3.代碼示例
以咖啡定制為例,BasicCoffee實(shí)現(xiàn)cost()返回基礎(chǔ)價(jià)格。MilkDecorator繼承CoffeeDecorator,重寫cost()方法返回“基礎(chǔ)價(jià)格+奶的價(jià)格”。通過(guò)鏈?zhǔn)秸{(diào)用(如newMilkDecorator(newSugarDecorator(newBasicCoffee())))演示動(dòng)態(tài)擴(kuò)展。
4.適用場(chǎng)景
?需要?jiǎng)討B(tài)、透明地為對(duì)象添加職責(zé)(如日志記錄、權(quán)限驗(yàn)證)。
?避免因功能組合導(dǎo)致的子類爆炸(如“咖啡+奶+糖”的多種組合)。
五、模式對(duì)比與總結(jié)
通過(guò)表格對(duì)比三個(gè)模式的核心差異:
|模式|核心意圖|結(jié)構(gòu)特點(diǎn)|典型應(yīng)用場(chǎng)景|
|||||
|橋接模式|分離抽象與實(shí)現(xiàn)|抽象類持有實(shí)現(xiàn)類引用|跨平臺(tái)適配、多維度擴(kuò)展|
|組合模式|統(tǒng)一部分與整體操作|樹形結(jié)構(gòu),組件接口統(tǒng)一|文件系統(tǒng)、組織架構(gòu)|
|裝飾器模式|動(dòng)態(tài)擴(kuò)展對(duì)象功能|裝飾器與組件接口一致|功能疊加、運(yùn)行時(shí)擴(kuò)展|
強(qiáng)調(diào):結(jié)構(gòu)型模式的本質(zhì)是“通過(guò)類/對(duì)象組合,構(gòu)建更靈活的結(jié)構(gòu)”,需結(jié)合SOLID原則(如開閉原則、依賴倒置)選擇模式。分析橋接模式在跨平臺(tái)應(yīng)用中的案例實(shí)現(xiàn)
通過(guò)UML圖繪制組合模式的文件系統(tǒng)案例
用裝飾器模式改造現(xiàn)有咖啡訂單代碼掌握抽象與實(shí)現(xiàn)解耦的核心思想
理解樹形結(jié)構(gòu)中的部分-整體關(guān)系處理
掌握動(dòng)態(tài)擴(kuò)展對(duì)象功能的實(shí)現(xiàn)方式70分鐘
70分鐘
40分鐘課堂小結(jié)本次課圍繞結(jié)構(gòu)型模式中的橋接模式、組合模式、裝飾器模式展開:
?橋接模式通過(guò)分離抽象與實(shí)現(xiàn),解決多維度擴(kuò)展導(dǎo)致的類爆炸問(wèn)題(如跨平臺(tái)適配)。
?組合模式通過(guò)統(tǒng)一葉子節(jié)點(diǎn)與容器節(jié)點(diǎn)的接口,簡(jiǎn)化樹形結(jié)構(gòu)的操作(如文件系統(tǒng)管理)。
?裝飾器模式通過(guò)動(dòng)態(tài)包裝對(duì)象,靈活擴(kuò)展功能(如咖啡定制)。
重點(diǎn)需掌握三個(gè)模式的結(jié)構(gòu)、核心意圖及典型場(chǎng)景,難點(diǎn)在于模式間的區(qū)別與實(shí)際項(xiàng)目中的合理選擇。后續(xù)需通過(guò)實(shí)驗(yàn)(如用橋接模式重構(gòu)圖形庫(kù))強(qiáng)化應(yīng)用能力。作業(yè)布置課后作業(yè)
基礎(chǔ)題(必做)
1.繪制橋接模式、組合模式、裝飾器模式的UML類圖(要求包含所有參與者及關(guān)聯(lián)關(guān)系)。
2.簡(jiǎn)述三個(gè)模式的核心區(qū)別(從意圖、結(jié)構(gòu)、適用場(chǎng)景三方面)。
實(shí)踐題(選做1題)
?題1:使用橋接模式重構(gòu)“跨平臺(tái)按鈕組件”(支持Windows/macOS,按鈕類型包括普通按鈕、圖標(biāo)按鈕)。
?題2:使用組合模式設(shè)計(jì)“電商商品分類系統(tǒng)”(支持商品(葉子)和分類(容器),需實(shí)現(xiàn)“計(jì)算分類總商品數(shù)”功能)。
?題3:使用裝飾器模式實(shí)現(xiàn)“視頻播放器功能擴(kuò)展”(基礎(chǔ)功能:播放;擴(kuò)展功能:倍速、彈幕、下載)。
拓展題(可選)
查閱JavaIO源碼(如FileInputStream、BufferedInputStream),分析其中裝飾器模式的應(yīng)用,撰寫500字分析報(bào)告。課后反思1.預(yù)設(shè)難點(diǎn)應(yīng)對(duì):學(xué)生可能混淆裝飾器與適配器(均涉及包裝),需在下次課增加對(duì)比案例(如適配器修改接口,裝飾器擴(kuò)展功能)。
2.案例有效性:跨平臺(tái)圖形庫(kù)、文件系統(tǒng)等案例貼近學(xué)生認(rèn)知,但部分學(xué)生對(duì)“模式如何解決實(shí)際問(wèn)題”的理解仍需加強(qiáng),后續(xù)可增加“劣質(zhì)設(shè)計(jì)→模式改進(jìn)”的代碼對(duì)比演示。
3.互動(dòng)效果:小組討論中部分學(xué)生參與度不足,需優(yōu)化問(wèn)題設(shè)計(jì)(如結(jié)合學(xué)生熟悉的游戲系統(tǒng)設(shè)計(jì)問(wèn)題),提升興趣。
4.實(shí)踐反饋:觀察實(shí)驗(yàn)作業(yè)完成情況,若發(fā)現(xiàn)多數(shù)學(xué)生在繪制類圖時(shí)遺漏關(guān)聯(lián)關(guān)系,需補(bǔ)充UML繪圖規(guī)范的針對(duì)性講解。
結(jié)構(gòu)型模式(二)與行為型模式(命令)教案設(shè)計(jì)題目:結(jié)構(gòu)型模式(二)與行為型模式(命令)(外觀模式,享元模式,代理模式,命令模式)授課時(shí)長(zhǎng):4學(xué)時(shí)(180分鐘)授課班級(jí):23級(jí)軟件工程班主講教師:XXX學(xué)情分析23級(jí)軟件工程專業(yè)(大二下學(xué)期)學(xué)生已完成《面向?qū)ο蟪绦蛟O(shè)計(jì)》《UML與軟件建模》等先修課程,具備以下特點(diǎn):
?知識(shí)基礎(chǔ):熟悉類、接口、繼承等面向?qū)ο蟾拍?,能閱讀UML類圖,掌握基礎(chǔ)Java編程(如集合、反射)。
?能力現(xiàn)狀:具備簡(jiǎn)單系統(tǒng)的設(shè)計(jì)能力,但對(duì)復(fù)雜系統(tǒng)的模塊化、可擴(kuò)展性設(shè)計(jì)經(jīng)驗(yàn)不足;能編寫功能代碼,但對(duì)“壞代碼”(如重復(fù)代碼、緊耦合)的敏感度較低。
?學(xué)習(xí)需求:渴望通過(guò)設(shè)計(jì)模式提升代碼質(zhì)量,但易混淆模式間的差異(如代理模式與外觀模式的區(qū)別);對(duì)模式的實(shí)際應(yīng)用(如框架中的使用)興趣濃厚,但缺乏源碼分析經(jīng)驗(yàn)。
?學(xué)習(xí)特點(diǎn):邏輯思維較強(qiáng),偏好“案例+代碼”的直觀教學(xué);小組協(xié)作能力較好,適合通過(guò)討論加深理解。教學(xué)目標(biāo)教學(xué)目標(biāo)
掌握(核心目標(biāo))
?掌握外觀模式、享元模式、代理模式、命令模式的結(jié)構(gòu)(類圖)、核心角色(如享元工廠、命令接口)及適用場(chǎng)景。
?掌握四種模式的代碼實(shí)現(xiàn)方法(如代理模式的靜態(tài)代理編寫、命令模式的撤銷功能實(shí)現(xiàn))。
?掌握模式與設(shè)計(jì)原則的對(duì)應(yīng)關(guān)系(如外觀模式符合迪米特法則)。
熟悉(進(jìn)階目標(biāo))
?熟悉模式在實(shí)際框架中的應(yīng)用(如Spring的JdbcTemplate對(duì)應(yīng)外觀模式)。
?熟悉多模式組合應(yīng)用的場(chǎng)景(如代理模式與命令模式結(jié)合實(shí)現(xiàn)操作日志記錄)。
了解(擴(kuò)展目標(biāo))
?了解享元模式的性能優(yōu)化邊界(如對(duì)象共享的內(nèi)存成本與計(jì)算成本權(quán)衡)。
?了解動(dòng)態(tài)代理(如CGLIB)與JDK動(dòng)態(tài)代理的差異(如是否需要接口)。教學(xué)重點(diǎn)1.外觀模式的核心:通過(guò)統(tǒng)一接口封裝子系統(tǒng),降低客戶端復(fù)雜度。
2.享元模式的核心:區(qū)分內(nèi)部狀態(tài)(共享)與外部狀態(tài)(傳入),通過(guò)工廠管理共享池。
3.代理模式的核心:控制對(duì)真實(shí)對(duì)象的訪問(wèn),擴(kuò)展額外功能(如日志、權(quán)限)。
4.命令模式的核心:將請(qǐng)求封裝為對(duì)象,解耦調(diào)用者與接收者,支持撤銷/重做。
5.模式適用場(chǎng)景:各模式解決的典型問(wèn)題(如代理模式用于遠(yuǎn)程調(diào)用,命令模式用于撤銷操作)。教學(xué)難點(diǎn)1.享元模式中內(nèi)部狀態(tài)與外部狀態(tài)的區(qū)分及共享對(duì)象的管理策略;2.代理模式中動(dòng)態(tài)代理(如JDK動(dòng)態(tài)代理與CGLIB代理)的實(shí)現(xiàn)原理及與靜態(tài)代理的差異;3.命令模式中請(qǐng)求封裝的靈活性設(shè)計(jì)(如宏命令、撤銷操作)與調(diào)用者-接收者的解耦邏輯;4.多模式組合應(yīng)用時(shí)的場(chǎng)景適配(如代理模式與外觀模式的協(xié)同使用)。教學(xué)方法1.案例驅(qū)動(dòng)法:通過(guò)“文件處理系統(tǒng)”“文本編輯器”等貼近軟件工程實(shí)踐的案例,演示模式的應(yīng)用流程(問(wèn)題→劣質(zhì)設(shè)計(jì)→模式改進(jìn))。
2.代碼對(duì)比分析法:展示未使用模式的冗余代碼與使用模式后的簡(jiǎn)潔代碼,對(duì)比講解模式優(yōu)勢(shì)(如代理模式的靜態(tài)代理與動(dòng)態(tài)代理代碼對(duì)比)。
3.小組討論法:組織討論“享元模式在游戲場(chǎng)景中的應(yīng)用”“命令模式如何實(shí)現(xiàn)撤銷功能”,引導(dǎo)學(xué)生自主分析模式結(jié)構(gòu)。
4.UML圖示法:通過(guò)類圖、序列圖直觀展示模式結(jié)構(gòu)(如命令模式的調(diào)用者-命令-接收者協(xié)作關(guān)系)。
5.框架源碼解析法:結(jié)合Spring的JdbcTemplate(外觀模式)、MyBatis的Mapper代理(代理模式),分析模式在工業(yè)級(jí)框架中的實(shí)際應(yīng)用。板書設(shè)計(jì)板書設(shè)計(jì)
主標(biāo)題:結(jié)構(gòu)型模式(二)與行為型模式(命令)
一、結(jié)構(gòu)型模式
1.外觀模式
?意圖:簡(jiǎn)化子系統(tǒng)調(diào)用
?結(jié)構(gòu):Facade→Subsystem1~n
?示例:FileFacade→Compressor/Encryptor/FileSaver
2.享元模式
?意圖:復(fù)用細(xì)粒度對(duì)象
?關(guān)鍵:內(nèi)部狀態(tài)(共享)vs外部狀態(tài)(傳入)
?結(jié)構(gòu):FlyweightFactory(Map<Key,Flyweight>)
?示例:CharacterFactory→'A'/'B'字符對(duì)象
3.代理模式
?意圖:控制訪問(wèn),擴(kuò)展功能
?分類:靜態(tài)代理(編譯期)vs動(dòng)態(tài)代理(運(yùn)行時(shí))
?結(jié)構(gòu):Proxy→RealSubject
?示例:UserServiceProxy→UserServiceImpl
二、行為型模式
4.命令模式
?意圖:封裝請(qǐng)求,解耦調(diào)用者與接收者
?結(jié)構(gòu):Invoker→Command→Receiver
?關(guān)鍵方法:execute()/undo()
?示例:Button→InsertCommand→TextEditor
三、模式對(duì)比
|模式|核心解決問(wèn)題|典型應(yīng)用場(chǎng)景|
||||
|外觀模式|子系統(tǒng)調(diào)用簡(jiǎn)化|分層架構(gòu)接口封裝|
|享元模式|對(duì)象內(nèi)存優(yōu)化|大量相似對(duì)象場(chǎng)景|
|代理模式|訪問(wèn)控制與擴(kuò)展|遠(yuǎn)程調(diào)用、權(quán)限校驗(yàn)|
|命令模式|請(qǐng)求解耦與撤銷|編輯器撤銷、任務(wù)隊(duì)列|教學(xué)過(guò)程教師活動(dòng)與教學(xué)內(nèi)容學(xué)生活動(dòng)教學(xué)意圖時(shí)間一、結(jié)構(gòu)型模式(二)
1.外觀模式(FacadePattern)
定義:為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的高層接口,使得子系統(tǒng)更易使用。
核心結(jié)構(gòu):包含外觀角色(提供統(tǒng)一接口)、子系統(tǒng)角色(具體功能實(shí)現(xiàn)類)。
適用場(chǎng)景:當(dāng)需要簡(jiǎn)化復(fù)雜子系統(tǒng)的調(diào)用流程(如文件管理系統(tǒng)中集成壓縮、加密、存儲(chǔ)模塊);當(dāng)需要分層設(shè)計(jì),為外層提供穩(wěn)定接口(如MVC架構(gòu)中Service層對(duì)DAO層的封裝)。
代碼示例:以“文件處理子系統(tǒng)”為例,定義Compressor(壓縮)、Encryptor(加密)、FileSaver(存儲(chǔ))三個(gè)子系統(tǒng)類,通過(guò)FileFacade外觀類整合processFile()方法,客戶端僅需調(diào)用cessFile()即可完成“壓縮→加密→存儲(chǔ)”全流程。
實(shí)際應(yīng)用:Spring框架中的JdbcTemplate(封裝JDBC連接、執(zhí)行、關(guān)閉等復(fù)雜操作);Android開發(fā)中的MediaPlayer(封裝音頻播放的底層API)。
2.享元模式(FlyweightPattern)
定義:通過(guò)共享技術(shù)有效支持大量細(xì)粒度對(duì)象的復(fù)用,減少內(nèi)存占用。
核心概念:內(nèi)部狀態(tài)(不變,存儲(chǔ)于享元對(duì)象中)、外部狀態(tài)(可變,由客戶端傳入)。
結(jié)構(gòu):抽象享元(定義接口)、具體享元(實(shí)現(xiàn)內(nèi)部狀態(tài))、享元工廠(管理共享池)。
適用場(chǎng)景:系統(tǒng)中存在大量相似對(duì)象(如文本編輯器的字符對(duì)象);對(duì)象的大部分狀態(tài)可外部化(如游戲中的棋子顏色固定,位置可變)。
代碼示例:以“字符渲染系統(tǒng)”為例,定義CharacterFlyweight接口,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水發(fā)燃?xì)饧瘓F(tuán)2026秋季校園招聘8人備考筆試題庫(kù)及答案解析
- 2026中國(guó)礦產(chǎn)資源集團(tuán)校園招聘和所屬單位社會(huì)招聘?jìng)淇脊P試題庫(kù)及答案解析
- 深度解析(2026)《GBT 25915.6-2010潔凈室及相關(guān)受控環(huán)境 第6部分:詞匯》
- 深度解析(2026)《GBT 25889-2010機(jī)器狀態(tài)監(jiān)測(cè)與診斷 聲發(fā)射》(2026年)深度解析
- 2025甘肅中醫(yī)藥大學(xué)招聘博士研究生5人(第二期)模擬筆試試題及答案解析
- 深度解析(2026)GBT 25757-2010無(wú)損檢測(cè) 鋼管自動(dòng)漏磁檢測(cè)系統(tǒng)綜合性能測(cè)試方法
- 深度解析(2026)《GBT 25710-2010礦用斜巷行人助行裝置》(2026年)深度解析
- 2025安徽江淮汽車集團(tuán)股份有限公司招聘1人模擬筆試試題及答案解析
- 2025山東日照市五蓮縣教體系統(tǒng)招聘博士研究生2人參考考試題庫(kù)及答案解析
- 戈夫曼“前臺(tái)-后臺(tái)”對(duì)教師專業(yè)表演的分析-基于《日常生活中的自我呈現(xiàn)》
- 2025天津大學(xué)管理崗位集中招聘15人筆試備考重點(diǎn)題庫(kù)及答案解析
- 供應(yīng)飯菜應(yīng)急預(yù)案(3篇)
- 2026年遼寧理工職業(yè)大學(xué)單招職業(yè)適應(yīng)性測(cè)試題庫(kù)及參考答案詳解
- 接地線課件教學(xué)課件
- 2025西部科學(xué)城重慶高新區(qū)招聘急需緊缺人才35人考試筆試模擬試題及答案解析
- 2026蘇州大學(xué)附屬第二醫(yī)院(核工業(yè)總醫(yī)院)護(hù)理人員招聘100人(公共基礎(chǔ)知識(shí))測(cè)試題帶答案解析
- 2025水發(fā)集團(tuán)社會(huì)招聘269人參考筆試題庫(kù)及答案解析
- 2024江蘇南京市鼓樓區(qū)司法局社區(qū)矯正社會(huì)工作者招聘1人備考題庫(kù)及答案解析(奪冠)
- 中國(guó)定制客運(yùn)發(fā)展報(bào)告(2024)-
- 2026中國(guó)儲(chǔ)備糧管理集團(tuán)有限公司湖北分公司招聘33人筆試歷年題庫(kù)及答案解析(奪冠)
- 2026年春湘教版地理八年級(jí)下冊(cè)第九章 第九章 建設(shè)永續(xù)發(fā)展的美麗中國(guó)課件
評(píng)論
0/150
提交評(píng)論