04設(shè)計(jì)模式專(zhuān)題策略模式原型_第1頁(yè)
04設(shè)計(jì)模式專(zhuān)題策略模式原型_第2頁(yè)
04設(shè)計(jì)模式專(zhuān)題策略模式原型_第3頁(yè)
04設(shè)計(jì)模式專(zhuān)題策略模式原型_第4頁(yè)
04設(shè)計(jì)模式專(zhuān)題策略模式原型_第5頁(yè)
已閱讀5頁(yè),還剩38頁(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、上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598反射機(jī)制什么是 Java 反射就是正在運(yùn)行,動(dòng)態(tài)獲取這個(gè)類(lèi)的所有信息。反射機(jī)制的作用1,反編譯:.class->.java2通過(guò)反射機(jī)制java 對(duì)象的屬性,方法,構(gòu)造方法等;反射機(jī)制的應(yīng)用場(chǎng)景Jdbc 加載驅(qū)動(dòng)-Spring IOC框架反射機(jī)制獲取類(lèi)有三種方法反射創(chuàng)建對(duì)象的方式實(shí)例化有參構(gòu)造函數(shù)Class<?> forName = Class.forName("com.itmayiedu.entity.User");/ 創(chuàng)建此Class 對(duì)象所表示的類(lèi)的一個(gè)新實(shí)例 調(diào)用了User

2、的無(wú)參數(shù)構(gòu)造方法. Object newInstance = forName.newInstance();/第式:Classc1 = Class.forName("Employee");/第二種方式:/java中每個(gè)類(lèi)型都有class 屬性. Classc2 = Employee.class;/第三種方式:/java語(yǔ)言中任何一個(gè)java對(duì)象都有g(shù)etClass 方法Employeee = new Employee();Classc3 = e.getClass(); /c3 是運(yùn)行時(shí)類(lèi) (e 的運(yùn)行時(shí)類(lèi)是 Employee)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余

3、粉絲群 116295598反射創(chuàng)建 api使用反射為類(lèi)私有屬性賦值JDBC 反射加載驅(qū)動(dòng)public class DemoJDBC public static void main(String args) throws Exception / 加載驅(qū)動(dòng)類(lèi)/ 為user對(duì)象私有屬性賦值Class<?> classUser = Class.forName("com.itmayiedu.entity.User");/ 獲取到當(dāng)前的所有屬性Field fields = classUser.getDeclaredFields(); for (Field field : f

4、ields) System.out.println(field.getName();/ 獲取當(dāng)前所有的方法Method declaredMethods = classUser.getDeclaredMethods(); for (Method method : declaredMethods) System.out.println(method.getName();/ 初始化對(duì)象User user = (User) classUser.newInstance();Field declaredField = classUser.getDeclaredField("id");/

5、 標(biāo)記為true反射賦值declaredField.setAccessible(true); declaredField.set(user, "20");System.out.println("使用反射機(jī)制給 id 賦值為:"+user.getId();方法名稱(chēng)作用getDeclaredMethods 獲取該類(lèi)的所有方法getReturnType()獲取該類(lèi)的返回值getParameterTypes()獲取傳入?yún)?shù)getDeclaredFields()獲取該類(lèi)的所有字段setAccessible私有成員Class<?> forName = C

6、lass.forName("com.itmayiedu.entity.User"); Constructor<?> constructor = forName.getConstructor(String.class,String.class);User newInstance = (User) constructor.newInstance("123", "123");上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598使用反射機(jī)制初始化將構(gòu)造函數(shù)為設(shè)計(jì)模式設(shè)計(jì)模式分類(lèi)創(chuàng)建型模式,共五種:工廠方法模

7、式、抽象工廠模式、單例模式、建造者模式、原型模式。Class.forName("com.mysql.jdbc.Driver");/ 通過(guò)DriverManager獲取數(shù)據(jù)庫(kù)連接String url = "jdbc:mysql:/50/test" String user = "teamtalk"String password = "123456"Connection connection = (Connection) DriverManager.getConnection( url, user,

8、 password);PreparedStatement statement = (PreparedStatement) connection.prepareStatement( "insert persion (name, age) value (?, ?)");statement.setString(1, "hdu"); statement.setInt(2, 21); statement.executeUpdate();ResultSet resultSet = statement.executeQuery("select * from

9、persion");/ 操作ResultSet結(jié)果集while (resultSet.next() / 第一種獲取字段方式System.out.println(resultSet.getString(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3);/ 關(guān)閉數(shù)據(jù)庫(kù)連接resultSet.close(); statement.close(); connection.close();上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598結(jié)構(gòu)型模式,

10、共七種:適配器模式、裝飾器模式、模式、外觀模式、橋接模式、組合模式、模式。行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責(zé)任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、者模式、中介者模式、解釋器模式。設(shè)計(jì)模式的六大原則開(kāi)閉原則(Open Close Principle)開(kāi)閉原則就是說(shuō)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼,實(shí)現(xiàn)一個(gè)熱插拔的效果。所以一句話(huà)概括就是:為了使程序的擴(kuò)展性好,易于維護(hù)和升級(jí)。想要達(dá)到這樣的效果,我們需要使用接口和抽象類(lèi),后面的具體設(shè)計(jì)中我們會(huì)提到這點(diǎn)。里氏代換原則(Liskov Substitution Princi

11、ple)里氏代換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。 里氏代換原則中說(shuō),任何基類(lèi)可以出現(xiàn)的地方,子類(lèi)一定可以出現(xiàn)。 LSP 是繼承復(fù)用的基石,只有當(dāng)衍生類(lèi)可以替換掉基類(lèi),軟件的功能不受到影響時(shí),基類(lèi)才能真正被復(fù)用,而衍生類(lèi)也能夠在基類(lèi)的基礎(chǔ)上增加新的行為。里氏代換原則是對(duì)“開(kāi)-閉”原則的補(bǔ)充。實(shí)現(xiàn)“開(kāi)-閉” 原則的關(guān)鍵步驟就是抽象化。而基類(lèi)與子類(lèi)的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。 From Baidu 百科依賴(lài)倒轉(zhuǎn)原則(Dependence Inversion Principle)這

12、個(gè)是開(kāi)閉原則的基礎(chǔ),具體內(nèi)容:真對(duì)接口編程,依賴(lài)于抽象而不依賴(lài)于具體。接口原則(Interface Segregation Principle)這個(gè)原則的意思是:使用多個(gè)的接口,比使用單個(gè)接口要好。還是一個(gè)降低類(lèi)之間的耦合度的意思,從這兒我們看出,其實(shí)設(shè)計(jì)模式就是一個(gè)軟件的設(shè)計(jì)思想,從大型軟件架構(gòu)出發(fā),為了升級(jí)和維護(hù)方便。所以上文中多次出現(xiàn):降低依賴(lài),降低耦合。法則(最少知道原則)(Demeter Principle)為什么叫最少知道原則,就是說(shuō):一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對(duì)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598復(fù)

13、用原則(Composite Reuse Principle)原則是盡量使用/聚合的方式,而不是使用繼承。單例模式什么是單例保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并且提供一個(gè)該全局點(diǎn)單例應(yīng)用場(chǎng)景1. Windows 的 Task Manager(任務(wù)管理器)就是很典型的單例模式(這個(gè)很熟悉吧),想想看,是不是呢,你能打開(kāi)兩個(gè) windows task manager 嗎? 不信你試試看哦2. windows 的 Recycle Bin(回收站)也是典型的單例應(yīng)用。在整個(gè)系統(tǒng)運(yùn)行過(guò)程中,回收站一直維護(hù)著僅有的一個(gè)實(shí)例。3.的計(jì)數(shù)器,一般也是采用單例模式實(shí)現(xiàn),否則難以同步。4. 應(yīng)用程序的日志應(yīng)用,一般都何用單例

14、模式實(shí)現(xiàn),這一般是由于共享的日志文件一直處于打開(kāi)狀態(tài),因?yàn)橹荒苡幸粋€(gè)實(shí)例去操作,否則內(nèi)容不好追加。5. Web 應(yīng)用的配置對(duì)象的,一般也應(yīng)用單例模式,這個(gè)是由于配置文件是共享的。6. 數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)一般也是采用單例模式,因?yàn)閿?shù)據(jù)庫(kù)連接是一種數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)軟件系統(tǒng)中使用數(shù)據(jù)庫(kù)連接池,主要是節(jié)省打開(kāi)或者關(guān)閉數(shù)據(jù)庫(kù)連接所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因?yàn)楹斡脝卫J絹?lái)維護(hù),就可以大大降低這種損耗。7.行8.多線(xiàn)程的線(xiàn)程池的設(shè)計(jì)一般也是采用單例模式,這是由于線(xiàn)程池要方便對(duì)池中的線(xiàn)程進(jìn)。操作系統(tǒng)的文件系統(tǒng),也是大的單例模式實(shí)現(xiàn)的具體例子,一個(gè)操作系統(tǒng)只能有一個(gè)文件系統(tǒng)。9. Htt

15、pApplication 也是例的典型應(yīng)用。熟悉 ASP.Net(IIS)的整個(gè)請(qǐng)求生命周期的人應(yīng)該知道 HttpApplication 也是單例模式,所有的 HttpModule 都共享一個(gè) HttpApplication實(shí)例.單例優(yōu)缺點(diǎn)優(yōu)點(diǎn):1.在單例模式中,活動(dòng)的單例只有一個(gè)實(shí)例,對(duì)單例類(lèi)的所有實(shí)例化得到的都是相同的一個(gè)實(shí)例。這樣就 防止其它對(duì)象對(duì)的實(shí)例化,確保所有的對(duì)象都一個(gè)實(shí)例2.單例模式具有一定的伸縮性,類(lèi)來(lái)實(shí)例化進(jìn)程,類(lèi)就在改變實(shí)例化進(jìn)程上有上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598相應(yīng)的伸縮性。3.提供了對(duì)唯一實(shí)例的受控。4.由系統(tǒng)內(nèi)存中只存在

16、一個(gè)對(duì)象,因此可以 節(jié)約系統(tǒng),當(dāng) 需要頻繁創(chuàng)建和銷(xiāo)毀的對(duì)象時(shí)單例模式無(wú)疑可以提高系統(tǒng)的性能。5.可變數(shù)目的實(shí)例。6.避免對(duì)共享缺點(diǎn):的多重占用。1.不適用于變化的對(duì)象,如果同一類(lèi)型的對(duì)象總是要在不同的用例場(chǎng)景發(fā)生變化,單例就會(huì)引起數(shù)據(jù)的錯(cuò)誤,不能保存彼此的狀態(tài)。2.由于單利模式中沒(méi)有抽象層,因此單例類(lèi)的擴(kuò)展有很大的。3.單例類(lèi)的職責(zé)過(guò)重,在一定程度上違背了“單一職責(zé)原則”。4.單例將帶來(lái)一些問(wèn)題,如為了節(jié)省將數(shù)據(jù)庫(kù)連接池對(duì)象設(shè)計(jì)為的單例類(lèi),可能會(huì)導(dǎo)致共享連接池對(duì)象的程序過(guò)多而出現(xiàn)連接池溢出;如果實(shí)例化的對(duì)象長(zhǎng)時(shí)間不被利用,系統(tǒng)會(huì)認(rèn)為是而被回收,這將導(dǎo)致對(duì)象狀態(tài)的丟失。單例創(chuàng)建方式1.2.餓漢式

17、:類(lèi)初始化時(shí),會(huì)立即加載該對(duì)象,線(xiàn)程天生安全,調(diào)用效率高。懶漢式: 類(lèi)初始化時(shí),加載功能。初始化該對(duì)象,真正需要使用的時(shí)候才會(huì)創(chuàng)建該對(duì)象,具備懶3.靜態(tài)內(nèi)部方式:結(jié)合了懶漢式和餓漢式各自的優(yōu)點(diǎn),真正需要對(duì)象的時(shí)候才會(huì)加載,加載類(lèi)是線(xiàn)程安全的。枚舉單例: 使用枚舉實(shí)現(xiàn)單例模式 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單、調(diào)用效率高,枚舉本身就是單例,由 jvm 從根本上提供保障!避免通過(guò)反射和反序列化的漏洞, 缺點(diǎn)沒(méi)有延遲加載。4.5.雙重檢測(cè)鎖方式 (因?yàn)?JVM 本質(zhì)重排序的,可能會(huì)初始化多次,不推薦使用)餓漢式上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598懶漢式上海每特教育科技(螞蟻課堂

18、&每特學(xué)院) 余粉絲群 116295598靜態(tài)內(nèi)部類(lèi)優(yōu)勢(shì):兼顧了懶漢模式的內(nèi)存優(yōu)化(使用時(shí)才初始化)以及餓漢模式的安全性(被反射)。劣勢(shì):需要兩個(gè)類(lèi)去做到這一點(diǎn),雖然創(chuàng)建靜態(tài)內(nèi)部類(lèi)的對(duì)象,但是其 Class對(duì)象還是會(huì)被創(chuàng)建,而且是屬于帶的對(duì)象。枚舉方式什么是枚舉枚舉本身是單例的,一般用于項(xiàng)目中定義常量。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598雙重檢測(cè)鎖上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598單例防止反射漏洞在構(gòu)造函數(shù)中,只能初始化化一次即可

19、。如何選擇單例創(chuàng)建方式如果不需要延遲加載單例,可以使用枚舉或者餓漢式,相對(duì)來(lái)說(shuō)枚舉性好于餓漢式。如果需要延遲加載,可以使用靜態(tài)內(nèi)部類(lèi)或者懶漢式,相對(duì)來(lái)說(shuō)靜態(tài)內(nèi)部類(lèi)好于懶最好使用餓漢式。UML 使用Unified Ming Language (UML)又稱(chēng)統(tǒng)模語(yǔ)言或標(biāo)準(zhǔn)建模語(yǔ)言,是始于 1997 年一個(gè) OMG 標(biāo)準(zhǔn),它是一個(gè)支持模型化和軟件系統(tǒng)開(kāi)發(fā)的圖形化語(yǔ)言,為軟件開(kāi)發(fā)的所有階段提供模型化和可視化支持,包括由需求分析到規(guī)格,到構(gòu)造和配置。 面向?qū)ο蟮姆治雠c設(shè)計(jì)(OOA&D,OOAD)方法的發(fā)展在 80 年代末至 90 年代中出現(xiàn)了一個(gè),UML 是這個(gè)的產(chǎn)物。它不僅統(tǒng)一了 Booch、

20、Rumbaugh 和 Jacobson 的表示方法,而且對(duì)其作了進(jìn)一步的發(fā)展,并最終統(tǒng)一為大眾所接受的標(biāo)準(zhǔn)建模語(yǔ)言。Grady Booch 的描述對(duì)象集合和它們之間的關(guān)系的方法。James Rumbaugh 的對(duì)象建模技術(shù)(OMT)。Ivar Jacobson 的包括用例方法的方式。還有其他一些想法也對(duì) UML 起到了作用,UML 是 Booch, Rumbaugh, Jacobson。UML 已經(jīng)被對(duì)象管理組織(OMG)接受為標(biāo)準(zhǔn),這個(gè)組織還制定了通用對(duì)象請(qǐng)求體系結(jié)構(gòu)(CORBA),是分布式對(duì)象編程行業(yè)的領(lǐng)頭羊。計(jì)算機(jī)輔助軟件工程(CASE)的供應(yīng)商也支持 UML,并且它基本上已經(jīng)被所有的軟

21、件開(kāi)發(fā)制造商所認(rèn)可,這其中包括 IBM 和微軟(用于它的 VB 環(huán)境)。UML 規(guī)范建模的概念有,類(lèi)(對(duì)象的)、對(duì)象、關(guān)聯(lián)、職責(zé)、行為、接口、用例、包、順序、協(xié)作,以及狀態(tài)。參考資料:上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598工廠模式什么是工廠模式實(shí)現(xiàn)了創(chuàng)建者和調(diào)用者分離,工廠模式分為簡(jiǎn)單工廠、工廠方法、抽象工廠模式工廠模式好處工廠模式是我們最常用的實(shí)例化對(duì)象模式了,是用工廠方法代替 new 操作的一種模式。利用工廠模式可以降低程序的耦合性,為后期的維護(hù)修改提供了很大的便利。將選擇實(shí)現(xiàn)類(lèi)、創(chuàng)建對(duì)象統(tǒng)一管理和。從而將調(diào)用者跟我們的實(shí)現(xiàn)類(lèi)解耦。工廠與容器概念工廠模

22、式分類(lèi)簡(jiǎn)單工廠模式簡(jiǎn)單工廠模式相當(dāng)于是一個(gè)工廠中有各種,創(chuàng)建在一個(gè)類(lèi)中,客戶(hù)無(wú)需知道具體的名稱(chēng),只需要知道類(lèi)所對(duì)應(yīng)的參數(shù)即可。但是工廠的職責(zé)過(guò)重,而且當(dāng)類(lèi)型過(guò)多時(shí)不利于系統(tǒng)的擴(kuò)展維護(hù)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598單工廠的優(yōu)點(diǎn)/缺點(diǎn)優(yōu)點(diǎn):簡(jiǎn)單工廠模式能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類(lèi)的對(duì)象。明確區(qū)分了各自的職責(zé)和權(quán)力,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。缺點(diǎn):很明顯工廠類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯,容易則GRASPR 的高內(nèi)聚的責(zé)任分配原上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598工廠方法模式什么是工廠方法模

23、式工廠方法模式 Factory Method,又稱(chēng)多態(tài)性工廠模式。在工廠方法模式中,的工廠類(lèi)不再負(fù)責(zé)所有的的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類(lèi)去做。該類(lèi)成為一個(gè)抽象工廠,僅負(fù)責(zé)給出具體工廠子類(lèi)必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)類(lèi)應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598抽象工廠模式什么是抽象工廠模式抽象工廠簡(jiǎn)單地說(shuō)是工廠的工廠,抽象工廠可以創(chuàng)建具體工廠,由具體工廠來(lái)產(chǎn)生具體。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598簡(jiǎn)單工廠、工廠方法

24、、抽象工廠之小結(jié)、區(qū)別簡(jiǎn)單工廠 : 用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意。(不支持拓展增加)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598工廠方法 :用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定。(支持拓展增加)抽象工廠 :用來(lái)生產(chǎn)不同族的全部。(不支持拓展增加;支持增加族)模式什么是模式通過(guò)對(duì)象的,可以詳細(xì)某個(gè)對(duì)象的方法,在這個(gè)方法調(diào)用處理,或調(diào)用后處理。既(AOP 微實(shí)現(xiàn)),AOP技術(shù)面向切面編程。模式應(yīng)用場(chǎng)景SpringAOP、事物原理、日志打印、權(quán)限、調(diào)用、安全可以隱蔽真實(shí)的分類(lèi)靜態(tài)(靜態(tài)定義類(lèi))動(dòng)態(tài)(動(dòng)態(tài)類(lèi))Jdk 自帶動(dòng)態(tài)Cglib 、javaassist(字節(jié)碼操作庫(kù))靜態(tài)

25、什么是靜態(tài)由程序員創(chuàng)建或工具類(lèi)的源碼,再編譯類(lèi)。所謂靜態(tài)也就是在程序運(yùn)行前就已經(jīng)存在類(lèi)的字節(jié)碼文件,類(lèi)和委托類(lèi)的關(guān)系在運(yùn)行前就確定了。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598靜態(tài)代碼動(dòng)態(tài)什么是動(dòng)態(tài)1.對(duì)象,不需要實(shí)現(xiàn)接口2.對(duì)象的生成,是利用 JDK 的 API,動(dòng)態(tài)的在內(nèi)存中構(gòu)建對(duì)象(需要我們指定創(chuàng)建對(duì)象/目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類(lèi)型)3.動(dòng)態(tài)也叫做:JDK,接口JDK 動(dòng)態(tài)1)原理:是根據(jù)類(lèi)加載器和接口創(chuàng)建類(lèi)(此類(lèi)是接口的實(shí)現(xiàn)類(lèi),所以必須使用接口 面向接口,位于 java.lang.reflect 包下)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲

26、群 1162955982)實(shí)現(xiàn)方式:1. 通過(guò)實(shí)現(xiàn) InvocationHandler 接口創(chuàng)建的調(diào)用處理器 IvocationHandler handler = new InvocationHandlerImpl( );2. 通過(guò)為 Proxy 類(lèi)指定 ClassLoader 對(duì)象和一組 interface 創(chuàng)建動(dòng)態(tài)類(lèi) Class clazz = Proxy.getProxyClass(classLoader,new Class );3. 通過(guò)反射機(jī)制獲取動(dòng)態(tài)類(lèi)的構(gòu)造函數(shù),其參數(shù)類(lèi)型是調(diào)用處理器接口類(lèi)型 Constructor constructor = clazz.getConstruct

27、or(newClassInvocationHandler.class);4. 通過(guò)構(gòu)造函數(shù)創(chuàng)建類(lèi)實(shí)例,此時(shí)需將調(diào)用處理器對(duì)象作為參數(shù)被傳入 Interface Proxy = (Interface)constructor.newInstance(newObject (handler);缺點(diǎn):jdk 動(dòng)態(tài),必須是面向接口,目標(biāo)業(yè)務(wù)類(lèi)必須實(shí)現(xiàn)接口CGLIB 動(dòng)態(tài)原理:利用 asm 開(kāi)源包,對(duì)對(duì)象類(lèi)的 class 文件加載進(jìn)來(lái),通過(guò)修改其字節(jié)碼生成子類(lèi)來(lái)處理。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598什么是 CGLIB 動(dòng)態(tài)使用 cglibCode Generati

28、on Library實(shí)現(xiàn)動(dòng)態(tài),并不要求委托類(lèi)必須實(shí)現(xiàn)接口,底層采用 asm 字節(jié)碼生成框架類(lèi)的字節(jié)碼CGLIB 動(dòng)態(tài)相關(guān)代碼CGLIB 動(dòng)態(tài)與 JDK 動(dòng)態(tài)區(qū)別java 動(dòng)態(tài)是利用反射機(jī)制生成一個(gè)實(shí)現(xiàn)接口的類(lèi),在調(diào)用具體方法前調(diào)用 InvokeHandler 來(lái)處理。而 cglib 動(dòng)態(tài)是利用 asm 開(kāi)源包,對(duì)對(duì)象類(lèi)的 class 文件加載進(jìn)來(lái),通過(guò)修改其字節(jié)碼生成子類(lèi)來(lái)處理。Spring 中。1、如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,默認(rèn)情況下會(huì)采用 JDK 的動(dòng)態(tài)實(shí)現(xiàn) AOP2、如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,可以強(qiáng)制使用 CGLIB 實(shí)現(xiàn) AOP3、如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)了接口,必須采用 CGLIB 庫(kù),sp

29、ring 會(huì)自動(dòng)在 JDK 動(dòng)態(tài)和 CGLIB 之間轉(zhuǎn)換上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598JDK 動(dòng)態(tài)只能對(duì)實(shí)現(xiàn)了接口的類(lèi),而不能類(lèi) 。CGLIB 是類(lèi)實(shí)現(xiàn),主要是對(duì)指定的類(lèi)生成一個(gè)子類(lèi),覆蓋其中的方法 。因?yàn)槭抢^承,所以該類(lèi)或方法最好不要成 final ,final 可以繼承和多態(tài)。建造者模式什么是建造者模式建造者模式:是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。工廠類(lèi)模式提供的是創(chuàng)建單個(gè)類(lèi)的模式,而建造者模式則是將各種集中起來(lái)進(jìn)行管理,用來(lái)創(chuàng)建復(fù)合對(duì)象,所謂復(fù)合對(duì)象就是指某個(gè)類(lèi)具有不同的屬性,其實(shí)建造者模式就是前面

30、抽象工廠模式和最后的 Test 結(jié)合起來(lái)得到的。建造者模式通常包括下面幾個(gè):1、Builder:給出一個(gè)抽象接口,以規(guī)范對(duì)象的各個(gè)組成成分的建造。這個(gè)接口規(guī)定要實(shí)現(xiàn)復(fù)雜對(duì)象的哪些部分的創(chuàng)建,并不涉及具體的對(duì)象部件的創(chuàng)建。2、ConcreteBuilder:實(shí)現(xiàn) Builder 接口,不同的商業(yè)邏輯,具體化復(fù)雜對(duì)象的各部分的創(chuàng)建。 在建造過(guò)程完成后,提品的實(shí)例。3、Director:調(diào)用具體建造者來(lái)創(chuàng)建復(fù)雜對(duì)象的各個(gè)部分,在指導(dǎo)者中不涉及具體的信息,只負(fù)責(zé)保證對(duì)象各部分完整創(chuàng)建或按某種順序創(chuàng)建。4、Product:要?jiǎng)?chuàng)建的復(fù)雜對(duì)象。建造者應(yīng)用場(chǎng)景1、去肯,漢堡、可樂(lè)、薯?xiàng)l、炸雞翅等是不變的,而其

31、組合是經(jīng)常變化的,生成出所謂的"套餐"。19 元每周三 漢堡+可樂(lè)+薯?xiàng)l=套餐可能會(huì)發(fā)生改變。2、JAVA 中的 StringBuilder 數(shù)組(單個(gè)字符)字整合在一起 字符串使用場(chǎng)景:1、需要生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。2、需要生成的對(duì)象內(nèi)部屬性本身相互依賴(lài)。與工廠模式的區(qū)別是:建造者模式更加關(guān)注與零件裝配的順序。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598實(shí)際案例這里以開(kāi)發(fā)中人物的構(gòu)造過(guò)程為例。在中創(chuàng)建一個(gè)形象時(shí),需要對(duì)每個(gè)部位進(jìn)行創(chuàng)建。簡(jiǎn)化而言,需要?jiǎng)?chuàng)建頭部,身體和四肢。頭部、體部、四肢建立一個(gè)人物對(duì)象上海每特教育科技(螞蟻課堂&a

32、mp;每特學(xué)院) 余粉絲群 116295598Builder(給出一個(gè)抽象接口,以規(guī)范對(duì)象的各個(gè)組成成分的建造。這個(gè)接口規(guī)定要實(shí)現(xiàn)復(fù)雜對(duì)象的哪些部分的創(chuàng)建,并不涉及具體的對(duì)象部件的創(chuàng)建)ConcreteBuilder(實(shí)現(xiàn) Builder 接口,不同的商業(yè)邏輯,具體化復(fù)雜對(duì)象的各部分的創(chuàng)建。 在建造過(guò)程完成后,提品的實(shí)例)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598Director(調(diào)用具體建造者來(lái)創(chuàng)建復(fù)雜對(duì)象的各個(gè)部分,在指導(dǎo)者中不涉及具體的信息,只負(fù)責(zé)保證對(duì)象各部分完整創(chuàng)建或按某種順序創(chuàng)建)模板方法什么是模板方法模板方法模式:定義一個(gè)操作中的算法骨架,而將一

33、些步驟延子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的重復(fù)代碼全部在父類(lèi)里面,不同業(yè)務(wù)的,使用抽象方法,抽取給子類(lèi)進(jìn)行實(shí)現(xiàn)。抽取過(guò)程-抽象方法。某些特定步驟。:處理某個(gè)流程的代碼已經(jīng)都具備,但是其中某個(gè)節(jié)點(diǎn)的代碼暫時(shí)不能確定。因此,我們采用工廠方法模式,將這個(gè)節(jié)點(diǎn)的代碼實(shí)現(xiàn)轉(zhuǎn)移給上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598子類(lèi)完成。即:處理步驟在父類(lèi)中定義好,具體的實(shí)現(xiàn)延子類(lèi)中定義。說(shuō)白了,就是將一些相同操作的代碼,封裝成一個(gè)算法的骨架。的部分留在子類(lèi)中操作,在父類(lèi)中只把那些骨架做好。例如:1.去辦業(yè)務(wù),給我們提供了一個(gè)模板就是:先取號(hào),排對(duì)

34、,辦理業(yè)務(wù)(部分我們子類(lèi)完成),給評(píng)分,完畢。這里辦理業(yè)務(wù)是屬于子類(lèi)來(lái)完成的,其他的取號(hào),排隊(duì),評(píng)分則是一個(gè)模板。2.去餐廳吃飯,餐廳給提供的一套模板就是:先點(diǎn)餐,等待,吃飯(部分我們子類(lèi)完成),這里吃飯是屬于子類(lèi)來(lái)完成的,其他的點(diǎn)餐,則是餐廳提供給我們客戶(hù)的一個(gè)模板。模板方法具體實(shí)現(xiàn)這里使用辦理業(yè)務(wù)為例首先,定義一個(gè)模板。模板中把辦理業(yè)務(wù)用作部分,讓子類(lèi)來(lái)實(shí)現(xiàn)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598具體的模板方法的子類(lèi)客戶(hù)端測(cè)試內(nèi)部類(lèi)方式什么時(shí)候使用模板方法實(shí)現(xiàn)一些操作時(shí),整體步驟很固定,但是呢。就是其中一小部分容易變,這時(shí)候可以使用模板方法模式,將容易

35、變的部分抽象出來(lái),供子類(lèi)實(shí)現(xiàn)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598開(kāi)發(fā)中應(yīng)用場(chǎng)景其實(shí),各個(gè)框架中,都有模板方法模式的。數(shù)據(jù)庫(kù)的封裝、Junit 單元測(cè)試、servlet 中關(guān)于 doGet/doPost 方法的調(diào)用Hibernate 中模板程序、spring 中 JDBCTemplate,HibernateTemplate 等等適配模式什么是適配器在設(shè)計(jì)模式中,適配器模式(英語(yǔ):adapter pattern)有時(shí)候也稱(chēng)包裝樣式或者包裝(wrapper)。將一個(gè)類(lèi)的接口轉(zhuǎn)接成用戶(hù)所期待的。一個(gè)適配使得因接口不兼容而不能在一起工作的類(lèi)工作在一起,做法是將類(lèi)

36、的接口包裹在一個(gè)已存在的類(lèi)中。適配器分類(lèi)適配器分為,類(lèi)適配器、對(duì)象適配、接口適配方式類(lèi)適配器方式采用繼承方式,對(duì)象適配方式使用構(gòu)造函數(shù)傳遞適配器案例我們就拿電飯煲的例子進(jìn)行說(shuō)明,電飯煲電源接口標(biāo)準(zhǔn)是 110V 電壓,而中國(guó)標(biāo)準(zhǔn)電飯煲,需要一個(gè)電源轉(zhuǎn)換器。電壓接口是 220V,所以要想在中國(guó)用定義和中國(guó)兩種接口及其實(shí)現(xiàn)我們先定義220V 電源接口和實(shí)現(xiàn)。110V 電源接口上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598110V 電源接口實(shí)現(xiàn)我們?cè)俣x中國(guó) 220V 電源接口和實(shí)現(xiàn)。定義一個(gè)電壓適配器要想在中國(guó)使用電飯煲,需要把電飯煲 110v 的電源接口適配成我們 2

37、20V 的電源接口,這就需要一個(gè)電源適配器:上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598定義一個(gè)電壓適配器測(cè)試開(kāi)始運(yùn)行上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598適配器應(yīng)用場(chǎng)景我們根據(jù)上面的適配器的特點(diǎn)的介紹中,我們來(lái)分析下適配器模式的幾類(lèi)比較適用的使用場(chǎng)景:1、我們?cè)谑褂玫诘念?lèi)庫(kù),或者說(shuō)第的使用需求。的 API 的時(shí)候,我們通過(guò)適配器轉(zhuǎn)換來(lái)滿(mǎn)足現(xiàn)2、我們的舊系統(tǒng)與新系統(tǒng)進(jìn)行集成的時(shí)候,我們發(fā)現(xiàn)舊系統(tǒng)的數(shù)據(jù)那么這個(gè)時(shí)候,我們可能需要適配器,完成調(diào)用需求。3、我們?cè)谑褂貌煌瑪?shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)同步。(我這里只是分析的是通過(guò)時(shí)候的情況。

38、還有其他的很多種方式數(shù)據(jù)庫(kù)同步)。新系統(tǒng)的需求,說(shuō)實(shí)現(xiàn)的OutputStreamWriter:是 Writer 的子類(lèi),將輸出的字符流變?yōu)樽止?jié)流,即:將一個(gè)字符流的輸出對(duì)象變?yōu)樽止?jié)流的輸出對(duì)象。InputStreamReader:是 Reader 的子類(lèi),將輸入的字節(jié)流變?yōu)樽址?,即:將一個(gè)字節(jié)流的輸入對(duì)象變?yōu)樽址鞯妮斎雽?duì)象。SpringMVC 適配器外觀模式什么是外觀模式外觀模式(Facade Pattern)門(mén)面模式,隱的復(fù)雜性,并向客戶(hù)端提供了一個(gè)客戶(hù)端可以系統(tǒng)的接口。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個(gè)接口,來(lái)隱的復(fù)雜性。這種模式涉及到一個(gè)單一的類(lèi),該類(lèi)提供了客戶(hù)

39、端請(qǐng)求的簡(jiǎn)化方法和對(duì)現(xiàn)類(lèi)方法的委托調(diào)用。外觀模式例子用戶(hù)完之后,需要調(diào)用阿里接口、郵件接口、推送接口。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598門(mén)面類(lèi)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598原型模式什么是原型模式克隆原型模式是一個(gè)創(chuàng)建型的模式。原型二字表明了改模式應(yīng)該有一個(gè)樣板實(shí)例,用戶(hù)從這個(gè)樣板對(duì)象中一個(gè)內(nèi)部屬性一致的對(duì)象,這個(gè)過(guò)程也就是我們稱(chēng)的“克隆”。被的實(shí)例就是我們所稱(chēng)的“原型”,這個(gè)原型是可定制的。原型模式多用于創(chuàng)建復(fù)雜的或者構(gòu)造耗時(shí)的實(shí)例,因?yàn)檫@種情況下,一個(gè)已經(jīng)存在的實(shí)例可使程序運(yùn)行更高效。上海每特教育科技(螞

40、蟻課堂&每特學(xué)院) 余粉絲群 116295598原型模式應(yīng)用場(chǎng)景(1) 類(lèi)初始化需要消化非常多的避免這些消耗。,這個(gè)包括數(shù)據(jù)、硬件等,通過(guò)原型拷貝(2)通過(guò) new 產(chǎn)生的一個(gè)對(duì)象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或者權(quán)限,這時(shí)可以使用原型模式。(3)一個(gè)對(duì)象需要提供給其他對(duì)象,而且各個(gè)調(diào)用者可能都需要修改其值時(shí),可以考慮使用原型模式拷貝多個(gè)對(duì)象供調(diào)用者使用,即保護(hù)性拷貝。Spring 框架中的多例就是使用原型。原型模式 UML 類(lèi)圖(通用)原型模式主要用于對(duì)象的,它的是就是類(lèi)圖中的原型類(lèi) Prototype。Prototype 類(lèi)需要具備以下兩個(gè)條件:(1)實(shí)現(xiàn) Cloneable 接口。在 j

41、ava 語(yǔ)言有一個(gè) Cloneable 接口,它的作用只有一個(gè),就是在運(yùn)行時(shí)通知虛擬機(jī)可以在實(shí)現(xiàn)了此接口的類(lèi)上使用 clone 方法。在 java 虛擬機(jī)中,只有實(shí)現(xiàn)了這個(gè)接口的類(lèi)才可以被拷貝,否則在運(yùn)行時(shí)會(huì)拋出CloneNotSupportedException 異常。(2)重寫(xiě) Object 類(lèi)中的 clone 方法。Java 中,所有類(lèi)的父類(lèi)都是 Object 類(lèi),Object類(lèi)中有一個(gè) clone 方法,作用是返回對(duì)象的一個(gè)拷貝,但是其作用域 protected 類(lèi)型的,一般的類(lèi)無(wú)法調(diào)用,因此 Prototype 類(lèi)需要將 clone 方法的作用域修改為 public 類(lèi)型。原型模式分

42、類(lèi)演示實(shí)例上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598原型模式分為淺和深淺-只是拷貝了基本類(lèi)型的數(shù)據(jù),而類(lèi)型數(shù)據(jù),后也是會(huì)發(fā)生,我們把這種拷貝叫做“(淺)淺拷貝”,換句話(huà)說(shuō),淺僅僅是指向被的內(nèi)存地址,如果原地址中對(duì)象被改變了,那么淺出來(lái)的對(duì)象也會(huì)相應(yīng)改變。深-在計(jì)算機(jī)中開(kāi)辟了一塊新的內(nèi)存地址用于存放的對(duì)象。裝飾模式什么是裝飾模式裝飾器模式,也成為包裝模式,顧名思義,就是對(duì)已經(jīng)存在的某些類(lèi)進(jìn)行裝飾,以此來(lái)擴(kuò)展一些功能。其結(jié)構(gòu)圖如下:上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598Component接口,也是裝飾類(lèi)和被裝飾類(lèi)的基本類(lèi)型。ConcreteComponent 為具體實(shí)現(xiàn)類(lèi),也是被裝飾類(lèi),他本身是個(gè)具有一些功能的完整的類(lèi)。Decorator 是裝飾類(lèi),實(shí)現(xiàn)了Component 接口的同時(shí)還在內(nèi)部維護(hù)了一個(gè)ConcreteComponent的實(shí)例,并可以通過(guò)構(gòu)造函數(shù)初始化。而 Decorator 本身,通常采用默認(rèn)實(shí)現(xiàn),他的存在僅僅是一個(gè)類(lèi)。:我要生產(chǎn)出一些用于裝飾的子類(lèi)了。而其

溫馨提示

  • 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)論