




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598反射機(jī)制什么是 Java 反射就是正在運(yùn)行,動(dòng)態(tài)獲取這個(gè)類的所有信息。反射機(jī)制的作用1,反編譯:.class->.java2通過反射機(jī)制java 對(duì)象的屬性,方法,構(gòu)造方法等;反射機(jī)制的應(yīng)用場(chǎng)景Jdbc 加載驅(qū)動(dòng)-Spring IOC框架反射機(jī)制獲取類有三種方法反射創(chuàng)建對(duì)象的方式實(shí)例化有參構(gòu)造函數(shù)Class<?> forName = Class.forName("com.itmayiedu.entity.User");/ 創(chuàng)建此Class 對(duì)象所表示的類的一個(gè)新實(shí)例 調(diào)用了User
2、的無參數(shù)構(gòu)造方法. Object newInstance = forName.newInstance();/第式:Classc1 = Class.forName("Employee");/第二種方式:/java中每個(gè)類型都有class 屬性. Classc2 = Employee.class;/第三種方式:/java語言中任何一個(gè)java對(duì)象都有g(shù)etClass 方法Employeee = new Employee();Classc3 = e.getClass(); /c3 是運(yùn)行時(shí)類 (e 的運(yùn)行時(shí)類是 Employee)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余
3、粉絲群 116295598反射創(chuàng)建 api使用反射為類私有屬性賦值JDBC 反射加載驅(qū)動(dòng)public class DemoJDBC public static void main(String args) throws Exception / 加載驅(qū)動(dòng)類/ 為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();方法名稱作用getDeclaredMethods 獲取該類的所有方法getReturnType()獲取該類的返回值getParameterTypes()獲取傳入?yún)?shù)getDeclaredFields()獲取該類的所有字段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ì)模式分類創(chuàng)建型模式,共五種:工廠方法模
7、式、抽象工廠模式、單例模式、建造者模式、原型模式。Class.forName("com.mysql.jdbc.Driver");/ 通過DriverManager獲取數(shù)據(jù)庫連接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ù)庫連接resultSet.close(); statement.close(); connection.close();上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598結(jié)構(gòu)型模式,
10、共七種:適配器模式、裝飾器模式、模式、外觀模式、橋接模式、組合模式、模式。行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責(zé)任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、者模式、中介者模式、解釋器模式。設(shè)計(jì)模式的六大原則開閉原則(Open Close Principle)開閉原則就是說對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼,實(shí)現(xiàn)一個(gè)熱插拔的效果。所以一句話概括就是:為了使程序的擴(kuò)展性好,易于維護(hù)和升級(jí)。想要達(dá)到這樣的效果,我們需要使用接口和抽象類,后面的具體設(shè)計(jì)中我們會(huì)提到這點(diǎn)。里氏代換原則(Liskov Substitution Princi
11、ple)里氏代換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。 里氏代換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。 LSP 是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件的功能不受到影響時(shí),基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。里氏代換原則是對(duì)“開-閉”原則的補(bǔ)充。實(shí)現(xiàn)“開-閉” 原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。 From Baidu 百科依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)這
12、個(gè)是開閉原則的基礎(chǔ),具體內(nèi)容:真對(duì)接口編程,依賴于抽象而不依賴于具體。接口原則(Interface Segregation Principle)這個(gè)原則的意思是:使用多個(gè)的接口,比使用單個(gè)接口要好。還是一個(gè)降低類之間的耦合度的意思,從這兒我們看出,其實(shí)設(shè)計(jì)模式就是一個(gè)軟件的設(shè)計(jì)思想,從大型軟件架構(gòu)出發(fā),為了升級(jí)和維護(hù)方便。所以上文中多次出現(xiàn):降低依賴,降低耦合。法則(最少知道原則)(Demeter Principle)為什么叫最少知道原則,就是說:一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對(duì)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598復(fù)
13、用原則(Composite Reuse Principle)原則是盡量使用/聚合的方式,而不是使用繼承。單例模式什么是單例保證一個(gè)類只有一個(gè)實(shí)例,并且提供一個(gè)該全局點(diǎn)單例應(yīng)用場(chǎng)景1. Windows 的 Task Manager(任務(wù)管理器)就是很典型的單例模式(這個(gè)很熟悉吧),想想看,是不是呢,你能打開兩個(gè) windows task manager 嗎? 不信你試試看哦2. windows 的 Recycle Bin(回收站)也是典型的單例應(yīng)用。在整個(gè)系統(tǒng)運(yùn)行過程中,回收站一直維護(hù)著僅有的一個(gè)實(shí)例。3.的計(jì)數(shù)器,一般也是采用單例模式實(shí)現(xiàn),否則難以同步。4. 應(yīng)用程序的日志應(yīng)用,一般都何用單例
14、模式實(shí)現(xiàn),這一般是由于共享的日志文件一直處于打開狀態(tài),因?yàn)橹荒苡幸粋€(gè)實(shí)例去操作,否則內(nèi)容不好追加。5. Web 應(yīng)用的配置對(duì)象的,一般也應(yīng)用單例模式,這個(gè)是由于配置文件是共享的。6. 數(shù)據(jù)庫連接池的設(shè)計(jì)一般也是采用單例模式,因?yàn)閿?shù)據(jù)庫連接是一種數(shù)據(jù)庫。數(shù)據(jù)庫軟件系統(tǒng)中使用數(shù)據(jù)庫連接池,主要是節(jié)省打開或者關(guān)閉數(shù)據(jù)庫連接所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因?yàn)楹斡脝卫J絹砭S護(hù),就可以大大降低這種損耗。7.行8.多線程的線程池的設(shè)計(jì)一般也是采用單例模式,這是由于線程池要方便對(duì)池中的線程進(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ì)單例類的所有實(shí)例化得到的都是相同的一個(gè)實(shí)例。這樣就 防止其它對(duì)象對(duì)的實(shí)例化,確保所有的對(duì)象都一個(gè)實(shí)例2.單例模式具有一定的伸縮性,類來實(shí)例化進(jìn)程,類就在改變實(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)建和銷毀的對(duì)象時(shí)單例模式無疑可以提高系統(tǒng)的性能。5.可變數(shù)目的實(shí)例。6.避免對(duì)共享缺點(diǎn):的多重占用。1.不適用于變化的對(duì)象,如果同一類型的對(duì)象總是要在不同的用例場(chǎng)景發(fā)生變化,單例就會(huì)引起數(shù)據(jù)的錯(cuò)誤,不能保存彼此的狀態(tài)。2.由于單利模式中沒有抽象層,因此單例類的擴(kuò)展有很大的。3.單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。4.單例將帶來一些問題,如為了節(jié)省將數(shù)據(jù)庫連接池對(duì)象設(shè)計(jì)為的單例類,可能會(huì)導(dǎo)致共享連接池對(duì)象的程序過多而出現(xiàn)連接池溢出;如果實(shí)例化的對(duì)象長時(shí)間不被利用,系統(tǒng)會(huì)認(rèn)為是而被回收,這將導(dǎo)致對(duì)象狀態(tài)的丟失。單例創(chuàng)建方式1.2.餓漢式
17、:類初始化時(shí),會(huì)立即加載該對(duì)象,線程天生安全,調(diào)用效率高。懶漢式: 類初始化時(shí),加載功能。初始化該對(duì)象,真正需要使用的時(shí)候才會(huì)創(chuàng)建該對(duì)象,具備懶3.靜態(tài)內(nèi)部方式:結(jié)合了懶漢式和餓漢式各自的優(yōu)點(diǎn),真正需要對(duì)象的時(shí)候才會(huì)加載,加載類是線程安全的。枚舉單例: 使用枚舉實(shí)現(xiàn)單例模式 優(yōu)點(diǎn):實(shí)現(xiàn)簡單、調(diào)用效率高,枚舉本身就是單例,由 jvm 從根本上提供保障!避免通過反射和反序列化的漏洞, 缺點(diǎn)沒有延遲加載。4.5.雙重檢測(cè)鎖方式 (因?yàn)?JVM 本質(zhì)重排序的,可能會(huì)初始化多次,不推薦使用)餓漢式上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598懶漢式上海每特教育科技(螞蟻課堂
18、&每特學(xué)院) 余粉絲群 116295598靜態(tài)內(nèi)部類優(yōu)勢(shì):兼顧了懶漢模式的內(nèi)存優(yōu)化(使用時(shí)才初始化)以及餓漢模式的安全性(被反射)。劣勢(shì):需要兩個(gè)類去做到這一點(diǎn),雖然創(chuàng)建靜態(tài)內(nèi)部類的對(duì)象,但是其 Class對(duì)象還是會(huì)被創(chuàng)建,而且是屬于帶的對(duì)象。枚舉方式什么是枚舉枚舉本身是單例的,一般用于項(xiàng)目中定義常量。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598雙重檢測(cè)鎖上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598單例防止反射漏洞在構(gòu)造函數(shù)中,只能初始化化一次即可
19、。如何選擇單例創(chuàng)建方式如果不需要延遲加載單例,可以使用枚舉或者餓漢式,相對(duì)來說枚舉性好于餓漢式。如果需要延遲加載,可以使用靜態(tài)內(nèi)部類或者懶漢式,相對(duì)來說靜態(tài)內(nèi)部類好于懶最好使用餓漢式。UML 使用Unified Ming Language (UML)又稱統(tǒng)模語言或標(biāo)準(zhǔn)建模語言,是始于 1997 年一個(gè) OMG 標(biāo)準(zhǔn),它是一個(gè)支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言,為軟件開發(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)建模語言。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、件開發(fā)制造商所認(rèn)可,這其中包括 IBM 和微軟(用于它的 VB 環(huán)境)。UML 規(guī)范建模的概念有,類(對(duì)象的)、對(duì)象、關(guān)聯(lián)、職責(zé)、行為、接口、用例、包、順序、協(xié)作,以及狀態(tài)。參考資料:上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598工廠模式什么是工廠模式實(shí)現(xiàn)了創(chuàng)建者和調(diào)用者分離,工廠模式分為簡單工廠、工廠方法、抽象工廠模式工廠模式好處工廠模式是我們最常用的實(shí)例化對(duì)象模式了,是用工廠方法代替 new 操作的一種模式。利用工廠模式可以降低程序的耦合性,為后期的維護(hù)修改提供了很大的便利。將選擇實(shí)現(xiàn)類、創(chuàng)建對(duì)象統(tǒng)一管理和。從而將調(diào)用者跟我們的實(shí)現(xiàn)類解耦。工廠與容器概念工廠模
22、式分類簡單工廠模式簡單工廠模式相當(dāng)于是一個(gè)工廠中有各種,創(chuàng)建在一個(gè)類中,客戶無需知道具體的名稱,只需要知道類所對(duì)應(yīng)的參數(shù)即可。但是工廠的職責(zé)過重,而且當(dāng)類型過多時(shí)不利于系統(tǒng)的擴(kuò)展維護(hù)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598單工廠的優(yōu)點(diǎn)/缺點(diǎn)優(yōu)點(diǎn):簡單工廠模式能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象。明確區(qū)分了各自的職責(zé)和權(quán)力,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。缺點(diǎn):很明顯工廠類集中了所有實(shí)例的創(chuàng)建邏輯,容易則GRASPR 的高內(nèi)聚的責(zé)任分配原上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598工廠方法模式什么是工廠方法模
23、式工廠方法模式 Factory Method,又稱多態(tài)性工廠模式。在工廠方法模式中,的工廠類不再負(fù)責(zé)所有的的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做。該類成為一個(gè)抽象工廠,僅負(fù)責(zé)給出具體工廠子類必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)類應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598抽象工廠模式什么是抽象工廠模式抽象工廠簡單地說是工廠的工廠,抽象工廠可以創(chuàng)建具體工廠,由具體工廠來產(chǎn)生具體。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598簡單工廠、工廠方法
24、、抽象工廠之小結(jié)、區(qū)別簡單工廠 : 用來生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意。(不支持拓展增加)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598工廠方法 :用來生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定。(支持拓展增加)抽象工廠 :用來生產(chǎn)不同族的全部。(不支持拓展增加;支持增加族)模式什么是模式通過對(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í)的分類靜態(tài)(靜態(tài)定義類)動(dòng)態(tài)(動(dòng)態(tài)類)Jdk 自帶動(dòng)態(tài)Cglib 、javaassist(字節(jié)碼操作庫)靜態(tài)
25、什么是靜態(tài)由程序員創(chuàng)建或工具類的源碼,再編譯類。所謂靜態(tài)也就是在程序運(yùn)行前就已經(jīng)存在類的字節(jié)碼文件,類和委托類的關(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)的接口的類型)3.動(dòng)態(tài)也叫做:JDK,接口JDK 動(dòng)態(tài)1)原理:是根據(jù)類加載器和接口創(chuàng)建類(此類是接口的實(shí)現(xiàn)類,所以必須使用接口 面向接口,位于 java.lang.reflect 包下)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲
26、群 1162955982)實(shí)現(xiàn)方式:1. 通過實(shí)現(xiàn) InvocationHandler 接口創(chuàng)建的調(diào)用處理器 IvocationHandler handler = new InvocationHandlerImpl( );2. 通過為 Proxy 類指定 ClassLoader 對(duì)象和一組 interface 創(chuàng)建動(dòng)態(tài)類 Class clazz = Proxy.getProxyClass(classLoader,new Class );3. 通過反射機(jī)制獲取動(dòng)態(tài)類的構(gòu)造函數(shù),其參數(shù)類型是調(diào)用處理器接口類型 Constructor constructor = clazz.getConstruct
27、or(newClassInvocationHandler.class);4. 通過構(gòu)造函數(shù)創(chuàng)建類實(shí)例,此時(shí)需將調(diào)用處理器對(duì)象作為參數(shù)被傳入 Interface Proxy = (Interface)constructor.newInstance(newObject (handler);缺點(diǎn):jdk 動(dòng)態(tài),必須是面向接口,目標(biāo)業(yè)務(wù)類必須實(shí)現(xiàn)接口CGLIB 動(dòng)態(tài)原理:利用 asm 開源包,對(duì)對(duì)象類的 class 文件加載進(jìn)來,通過修改其字節(jié)碼生成子類來處理。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598什么是 CGLIB 動(dòng)態(tài)使用 cglibCode Generati
28、on Library實(shí)現(xiàn)動(dòng)態(tài),并不要求委托類必須實(shí)現(xiàn)接口,底層采用 asm 字節(jié)碼生成框架類的字節(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)接口的類,在調(diào)用具體方法前調(diào)用 InvokeHandler 來處理。而 cglib 動(dòng)態(tài)是利用 asm 開源包,對(duì)對(duì)象類的 class 文件加載進(jìn)來,通過修改其字節(jié)碼生成子類來處理。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ì)象沒有實(shí)現(xiàn)了接口,必須采用 CGLIB 庫,sp
29、ring 會(huì)自動(dòng)在 JDK 動(dòng)態(tài)和 CGLIB 之間轉(zhuǎn)換上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598JDK 動(dòng)態(tài)只能對(duì)實(shí)現(xiàn)了接口的類,而不能類 。CGLIB 是類實(shí)現(xiàn),主要是對(duì)指定的類生成一個(gè)子類,覆蓋其中的方法 。因?yàn)槭抢^承,所以該類或方法最好不要成 final ,final 可以繼承和多態(tài)。建造者模式什么是建造者模式建造者模式:是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。工廠類模式提供的是創(chuàng)建單個(gè)類的模式,而建造者模式則是將各種集中起來進(jìn)行管理,用來創(chuàng)建復(fù)合對(duì)象,所謂復(fù)合對(duì)象就是指某個(gè)類具有不同的屬性,其實(shí)建造者模式就是前面
30、抽象工廠模式和最后的 Test 結(jié)合起來得到的。建造者模式通常包括下面幾個(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)建。 在建造過程完成后,提品的實(shí)例。3、Director:調(diào)用具體建造者來創(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、去肯,漢堡、可樂、薯?xiàng)l、炸雞翅等是不變的,而其
31、組合是經(jīng)常變化的,生成出所謂的"套餐"。19 元每周三 漢堡+可樂+薯?xiàng)l=套餐可能會(huì)發(fā)生改變。2、JAVA 中的 StringBuilder 數(shù)組(單個(gè)字符)字整合在一起 字符串使用場(chǎng)景:1、需要生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。2、需要生成的對(duì)象內(nèi)部屬性本身相互依賴。與工廠模式的區(qū)別是:建造者模式更加關(guān)注與零件裝配的順序。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598實(shí)際案例這里以開發(fā)中人物的構(gòu)造過程為例。在中創(chuàng)建一個(gè)形象時(shí),需要對(duì)每個(gè)部位進(jìn)行創(chuàng)建。簡化而言,需要?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)建。 在建造過程完成后,提品的實(shí)例)上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598Director(調(diào)用具體建造者來創(chuàng)建復(fù)雜對(duì)象的各個(gè)部分,在指導(dǎo)者中不涉及具體的信息,只負(fù)責(zé)保證對(duì)象各部分完整創(chuàng)建或按某種順序創(chuàng)建)模板方法什么是模板方法模板方法模式:定義一個(gè)操作中的算法骨架,而將一
33、些步驟延子類中。模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的重復(fù)代碼全部在父類里面,不同業(yè)務(wù)的,使用抽象方法,抽取給子類進(jìn)行實(shí)現(xiàn)。抽取過程-抽象方法。某些特定步驟。:處理某個(gè)流程的代碼已經(jīng)都具備,但是其中某個(gè)節(jié)點(diǎn)的代碼暫時(shí)不能確定。因此,我們采用工廠方法模式,將這個(gè)節(jié)點(diǎn)的代碼實(shí)現(xiàn)轉(zhuǎn)移給上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598子類完成。即:處理步驟在父類中定義好,具體的實(shí)現(xiàn)延子類中定義。說白了,就是將一些相同操作的代碼,封裝成一個(gè)算法的骨架。的部分留在子類中操作,在父類中只把那些骨架做好。例如:1.去辦業(yè)務(wù),給我們提供了一個(gè)模板就是:先取號(hào),排對(duì)
34、,辦理業(yè)務(wù)(部分我們子類完成),給評(píng)分,完畢。這里辦理業(yè)務(wù)是屬于子類來完成的,其他的取號(hào),排隊(duì),評(píng)分則是一個(gè)模板。2.去餐廳吃飯,餐廳給提供的一套模板就是:先點(diǎn)餐,等待,吃飯(部分我們子類完成),這里吃飯是屬于子類來完成的,其他的點(diǎn)餐,則是餐廳提供給我們客戶的一個(gè)模板。模板方法具體實(shí)現(xiàn)這里使用辦理業(yè)務(wù)為例首先,定義一個(gè)模板。模板中把辦理業(yè)務(wù)用作部分,讓子類來實(shí)現(xiàn)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598具體的模板方法的子類客戶端測(cè)試內(nèi)部類方式什么時(shí)候使用模板方法實(shí)現(xiàn)一些操作時(shí),整體步驟很固定,但是呢。就是其中一小部分容易變,這時(shí)候可以使用模板方法模式,將容易
35、變的部分抽象出來,供子類實(shí)現(xiàn)。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598開發(fā)中應(yīng)用場(chǎng)景其實(shí),各個(gè)框架中,都有模板方法模式的。數(shù)據(jù)庫的封裝、Junit 單元測(cè)試、servlet 中關(guān)于 doGet/doPost 方法的調(diào)用Hibernate 中模板程序、spring 中 JDBCTemplate,HibernateTemplate 等等適配模式什么是適配器在設(shè)計(jì)模式中,適配器模式(英語:adapter pattern)有時(shí)候也稱包裝樣式或者包裝(wrapper)。將一個(gè)類的接口轉(zhuǎn)接成用戶所期待的。一個(gè)適配使得因接口不兼容而不能在一起工作的類工作在一起,做法是將類
36、的接口包裹在一個(gè)已存在的類中。適配器分類適配器分為,類適配器、對(duì)象適配、接口適配方式類適配器方式采用繼承方式,對(duì)象適配方式使用構(gòu)造函數(shù)傳遞適配器案例我們就拿電飯煲的例子進(jìn)行說明,電飯煲電源接口標(biāo)準(zhǔn)是 110V 電壓,而中國標(biāo)準(zhǔn)電飯煲,需要一個(gè)電源轉(zhuǎn)換器。電壓接口是 220V,所以要想在中國用定義和中國兩種接口及其實(shí)現(xiàn)我們先定義220V 電源接口和實(shí)現(xiàn)。110V 電源接口上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598110V 電源接口實(shí)現(xiàn)我們?cè)俣x中國 220V 電源接口和實(shí)現(xiàn)。定義一個(gè)電壓適配器要想在中國使用電飯煲,需要把電飯煲 110v 的電源接口適配成我們 2
37、20V 的電源接口,這就需要一個(gè)電源適配器:上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598定義一個(gè)電壓適配器測(cè)試開始運(yùn)行上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598適配器應(yīng)用場(chǎng)景我們根據(jù)上面的適配器的特點(diǎn)的介紹中,我們來分析下適配器模式的幾類比較適用的使用場(chǎng)景:1、我們?cè)谑褂玫诘念悗?,或者說第的使用需求。的 API 的時(shí)候,我們通過適配器轉(zhuǎ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ù)庫之間進(jìn)行數(shù)據(jù)同步。(我這里只是分析的是通過時(shí)候的情況。
38、還有其他的很多種方式數(shù)據(jù)庫同步)。新系統(tǒng)的需求,說實(shí)現(xiàn)的OutputStreamWriter:是 Writer 的子類,將輸出的字符流變?yōu)樽止?jié)流,即:將一個(gè)字符流的輸出對(duì)象變?yōu)樽止?jié)流的輸出對(duì)象。InputStreamReader:是 Reader 的子類,將輸入的字節(jié)流變?yōu)樽址?,即:將一個(gè)字節(jié)流的輸入對(duì)象變?yōu)樽址鞯妮斎雽?duì)象。SpringMVC 適配器外觀模式什么是外觀模式外觀模式(Facade Pattern)門面模式,隱的復(fù)雜性,并向客戶端提供了一個(gè)客戶端可以系統(tǒng)的接口。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個(gè)接口,來隱的復(fù)雜性。這種模式涉及到一個(gè)單一的類,該類提供了客戶
39、端請(qǐng)求的簡化方法和對(duì)現(xiàn)類方法的委托調(diào)用。外觀模式例子用戶完之后,需要調(diào)用阿里接口、郵件接口、推送接口。上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598門面類上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598原型模式什么是原型模式克隆原型模式是一個(gè)創(chuàng)建型的模式。原型二字表明了改模式應(yīng)該有一個(gè)樣板實(shí)例,用戶從這個(gè)樣板對(duì)象中一個(gè)內(nèi)部屬性一致的對(duì)象,這個(gè)過程也就是我們稱的“克隆”。被的實(shí)例就是我們所稱的“原型”,這個(gè)原型是可定制的。原型模式多用于創(chuàng)建復(fù)雜的或者構(gòu)造耗時(shí)的實(shí)例,因?yàn)檫@種情況下,一個(gè)已經(jīng)存在的實(shí)例可使程序運(yùn)行更高效。上海每特教育科技(螞
40、蟻課堂&每特學(xué)院) 余粉絲群 116295598原型模式應(yīng)用場(chǎng)景(1) 類初始化需要消化非常多的避免這些消耗。,這個(gè)包括數(shù)據(jù)、硬件等,通過原型拷貝(2)通過 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 類圖(通用)原型模式主要用于對(duì)象的,它的是就是類圖中的原型類 Prototype。Prototype 類需要具備以下兩個(gè)條件:(1)實(shí)現(xiàn) Cloneable 接口。在 j
41、ava 語言有一個(gè) Cloneable 接口,它的作用只有一個(gè),就是在運(yùn)行時(shí)通知虛擬機(jī)可以在實(shí)現(xiàn)了此接口的類上使用 clone 方法。在 java 虛擬機(jī)中,只有實(shí)現(xiàn)了這個(gè)接口的類才可以被拷貝,否則在運(yùn)行時(shí)會(huì)拋出CloneNotSupportedException 異常。(2)重寫 Object 類中的 clone 方法。Java 中,所有類的父類都是 Object 類,Object類中有一個(gè) clone 方法,作用是返回對(duì)象的一個(gè)拷貝,但是其作用域 protected 類型的,一般的類無法調(diào)用,因此 Prototype 類需要將 clone 方法的作用域修改為 public 類型。原型模式分
42、類演示實(shí)例上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598原型模式分為淺和深淺-只是拷貝了基本類型的數(shù)據(jù),而類型數(shù)據(jù),后也是會(huì)發(fā)生,我們把這種拷貝叫做“(淺)淺拷貝”,換句話說,淺僅僅是指向被的內(nèi)存地址,如果原地址中對(duì)象被改變了,那么淺出來的對(duì)象也會(huì)相應(yīng)改變。深-在計(jì)算機(jī)中開辟了一塊新的內(nèi)存地址用于存放的對(duì)象。裝飾模式什么是裝飾模式裝飾器模式,也成為包裝模式,顧名思義,就是對(duì)已經(jīng)存在的某些類進(jìn)行裝飾,以此來擴(kuò)展一些功能。其結(jié)構(gòu)圖如下:上海每特教育科技(螞蟻課堂&每特學(xué)院) 余粉絲群 116295598Component接口,也是裝飾類和被裝飾類的基本類型。ConcreteComponent 為具體實(shí)現(xiàn)類,也是被裝飾類,他本身是個(gè)具有一些功能的完整的類。Decorator 是裝飾類,實(shí)現(xiàn)了Component 接口的同時(shí)還在內(nèi)部維護(hù)了一個(gè)ConcreteComponent的實(shí)例,并可以通過構(gòu)造函數(shù)初始化。而 Decorator 本身,通常采用默認(rèn)實(shí)現(xiàn),他的存在僅僅是一個(gè)類。:我要生產(chǎn)出一些用于裝飾的子類了。而其
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 別墅贈(zèng)送地下室合同范本
- 廚具店雇傭合同范本
- 個(gè)人工作年度總結(jié)自我鑒定
- 保密協(xié)議 合同范本
- 醫(yī)療設(shè)備抵押合同范例
- 工業(yè)鍋爐司爐題庫與參考答案
- 賣車轉(zhuǎn)讓合同范本
- 一年級(jí)新生入學(xué)家長會(huì)的發(fā)言稿
- 《雨》閱讀理解訓(xùn)練題及答案
- 東南亞企業(yè)合同范本
- 超高分子量聚乙烯纖維發(fā)展前景分析
- 腦梗死伴發(fā)高血壓的護(hù)理
- 派出所開展小學(xué)安全教育講座
- 2024年全國公務(wù)員考試公共基礎(chǔ)知識(shí)C類真題及解析
- 2016-2023年南京科技職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 助產(chǎn)健康宣教課件
- 機(jī)房運(yùn)維報(bào)告
- 離婚協(xié)議書完整版Word模板下載
- 雪花勇闖天涯XPARTY活動(dòng)策劃方案
- 2023年汽車修理工(高級(jí))考試試題庫附答案
- 混凝土配合比全自動(dòng)計(jì)算書
評(píng)論
0/150
提交評(píng)論