返學(xué)費(fèi)網(wǎng) > 培訓(xùn)機(jī)構(gòu) > 少兒編程培訓(xùn)中心
近年來關(guān)注面向方面編程的用戶越來越多,小編整理了關(guān)于2分鐘讓你明白什么是面向?qū)ο缶幊?,Spring 依賴注入怎么回事,還有面向方面編程是怎么回事,java語(yǔ)言在面向?qū)ο缶幊谭矫嬗心男┆?dú)特的特點(diǎn)?,什么是面向?qū)ο蠓矫娴慕涌诰幊??面試時(shí)問到,面向結(jié)構(gòu)、面向數(shù)據(jù)、面向方面的程序設(shè)計(jì)各有什么特點(diǎn)??,供您參考
相信很多剛開始接觸編程的小伙伴,對(duì)于什么是面向?qū)ο?,什么是面向過程都是一臉懵逼的。網(wǎng)上關(guān)于這兩個(gè)的回答真的很多,但是都有一個(gè)共同特點(diǎn):------------不容易懂。讓我們來看看某百科給出的定義:是不是聽不懂??為了解決大家的疑惑,小編今天上網(wǎng)收集了一些資料,現(xiàn)在就簡(jiǎn)單通俗的為大家介紹一下到底什么是面向?qū)ο缶幊毯兔嫦蜻^程編程一、先來兩小段通俗解釋面向過程(Procedure Oriented 簡(jiǎn)稱PO :如C語(yǔ)言): 從名字可以看出它是注重過程的。當(dāng)解決一個(gè)問題的時(shí)候,面向過程會(huì)把事情拆分成: 一個(gè)個(gè)函數(shù)和數(shù)據(jù)(用于方法的參數(shù)) 。然后按照一定的順序,執(zhí)行完這些方法(每個(gè)方法看作一個(gè)過程),等方法執(zhí)行完了,事情就搞定了。面向?qū)ο螅∣bject Oriented簡(jiǎn)稱OO :如C++,JAVA等語(yǔ)言): 看名字它是注重對(duì)象的。當(dāng)解決一個(gè)問題的時(shí)候,面向?qū)ο髸?huì)把事物抽象成對(duì)象的概念,就是說這個(gè)問題里面有哪些對(duì)象,然后給對(duì)象賦一些屬性和方法,然后讓每個(gè)對(duì)象去執(zhí)行自己的方法,問題得到解決。二、用3個(gè)例子說明兩者的區(qū)別例子一: 問題: 洗衣機(jī)里面放有臟衣服,怎么洗干凈?面向過程的解決方法:1、執(zhí)行加洗衣粉方法;2、執(zhí)行加水方法;3、執(zhí)行洗衣服方法;4、執(zhí)行清洗方法;5、 執(zhí)行烘干方法;以上就是將解決這個(gè)問題的過程拆成一個(gè)個(gè)方法(是沒有對(duì)象去調(diào)用的),通過一個(gè)個(gè)方法的執(zhí)行來解決問題。面向?qū)ο蟮慕鉀Q方法: 1、我先弄出兩個(gè)對(duì)象:“洗衣機(jī)”對(duì)象和“人”對(duì)象 2、針對(duì)對(duì)象“洗衣機(jī)”加入一些屬性和方法:“洗衣服方法”“清洗方法”、“烘干方法” 3、針對(duì)對(duì)象“人”加入屬性和方法:“加洗衣粉方法”、“加水方法”4、然后執(zhí)行人.加洗衣粉人.加水 洗衣機(jī).洗衣服洗衣機(jī).清洗洗衣機(jī).烘干解決同一個(gè)問題 ,面向?qū)ο缶幊叹褪窍瘸橄蟪鰧?duì)象,然后用對(duì)象執(zhí)行方法的方式解決問題。例子二 : 打麻將例子 你 我 他 面向過程: 打麻將 (你,我,他) ---------解決問題 拆成一個(gè)動(dòng)作,把數(shù)據(jù)丟進(jìn)去 面向?qū)ο螅? 我.打麻將(你,他) or 你.打麻將(我,他) or 他.打麻將(我,你) ---------解決問題 抽象出對(duì)象,對(duì)象執(zhí)行動(dòng)作 。 例子三:最后在用一個(gè)網(wǎng)上常見的五子棋例子來說明一下:面向過程的設(shè)計(jì)思路就是首先分析問題的步驟:1、開始游戲,2、黑子先走,3、繪制畫面,4、判斷輸贏,5、輪到白子,6、繪制畫面,7、判斷輸贏,8、返回步驟2,9、輸出最后結(jié)果。把上面每個(gè)步驟用不同的方法來實(shí)現(xiàn)。面向?qū)ο蟮脑O(shè)計(jì)則是從另外的思路來解決問題。整個(gè)五子棋可以分為1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統(tǒng),負(fù)責(zé)繪制畫面,3、規(guī)則系統(tǒng),負(fù)責(zé)判定諸如犯規(guī)、輸贏等。第一類對(duì)象(玩家對(duì)象)負(fù)責(zé)接受用戶輸入,并告知第二類對(duì)象(棋盤對(duì)象)棋子布局的變化,棋盤對(duì)象接收到了棋子的變化就要負(fù)責(zé)在屏幕上面顯示出這種變化,同時(shí)利用第三類對(duì)象(規(guī)則系統(tǒng))來對(duì)棋局進(jìn)行判定??梢悦黠@地看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設(shè)計(jì)中分散在了多個(gè)步驟中,很可能出現(xiàn)不同的繪制版本,因?yàn)橥ǔTO(shè)計(jì)人員會(huì)考慮到實(shí)際情況進(jìn)行各種各樣的簡(jiǎn)化。而面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤對(duì)象中出現(xiàn),從而保證了繪圖的統(tǒng)一。三:面向過程與面向?qū)ο蟮膬?yōu)缺點(diǎn):小編在看了@十四期_李光 博客上解釋的非常通俗易懂,分享給大家用面向過程的方法寫出來的程序是一份蛋炒飯,而用面向?qū)ο髮懗鰜淼某绦蚴且环萆w澆飯。蛋炒飯制作的細(xì)節(jié)不說了,最后的一道工序肯定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。蛋炒飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那么唯一的辦法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這么多麻煩,你只需要把上面的蓋菜撥掉,更換一份蓋菜就可以了。蓋澆飯的缺點(diǎn)是入味不均,可能沒有蛋炒飯那么香。到底是蛋炒飯好還是蓋澆飯好呢?其實(shí)這類問題都很難回答,非要比個(gè)上下高低的話,就必須設(shè)定一個(gè)場(chǎng)景,否則只能說是各有所長(zhǎng)。如果大家都不是美食家,沒那么多講究,那么從飯館角度來講的話,做蓋澆飯顯然比蛋炒飯更有優(yōu)勢(shì),他可以組合出來任意多的組合,而且不會(huì)浪費(fèi)。蓋澆飯的好處就是‘’菜”“飯”分離,從而提高了制作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟件工程的專業(yè)術(shù)語(yǔ)就是”可維護(hù)性“比較好,”飯” 和”菜”的耦合度比較低。蛋炒飯將”蛋”“飯”攪和在一起,想換”蛋”“飯”中任何一種都很困難,耦合度很高,以至于”可維護(hù)性”比較差。軟件工程追求的目標(biāo)之一就是可維護(hù)性,可維護(hù)性主要表現(xiàn)在3個(gè)方面:可理解性、可測(cè)試性和可修改性。面向?qū)ο蟮暮锰幹痪褪秋@著的改善了軟件系統(tǒng)的可維護(hù)性。總結(jié)來說:面向過程 優(yōu)點(diǎn):性能比面向?qū)ο蟾?,因?yàn)轭愓{(diào)用時(shí)需要實(shí)例化,開銷比較大,比較消耗資源;比如單片機(jī)、嵌入式開發(fā)、 Linux/Unix等一般采用面向過程開發(fā),性能是最重要的因素。 缺點(diǎn):沒有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展面向?qū)ο? 優(yōu)點(diǎn):易維護(hù)、易復(fù)用、易擴(kuò)展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設(shè)計(jì)出低耦合的系統(tǒng),使系統(tǒng) 更加靈活、更加易于維護(hù) 缺點(diǎn):性能比面向過程低四、面向?qū)ο缶幊痰奶匦匀蠡咎匦裕悍庋b,繼承,多態(tài)封裝封裝,就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。一個(gè)類就是一個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。在一個(gè)對(duì)象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問。通過這種方式,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防止程序中無(wú)關(guān)的部分意外的改變或錯(cuò)誤的使用了對(duì)象的私有部分。繼承繼承,指可以讓某個(gè)類型的對(duì)象獲得另一個(gè)類型的對(duì)象的屬性的方法。它支持按級(jí)分類的概念。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無(wú)需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。 通過繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實(shí)現(xiàn)繼承,可以通過 “繼承”()和“組合”()來實(shí)現(xiàn)。繼承概念的實(shí)現(xiàn)方式有二類:實(shí)現(xiàn)繼承與接口繼承。實(shí)現(xiàn)繼承是指直接使用父類的屬性和方法而無(wú)需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力。多態(tài)多態(tài),是指一個(gè)類實(shí)例的相同方法在不同情形有不同表現(xiàn)形式。多態(tài)機(jī)制使具有不同內(nèi)部結(jié)構(gòu)的對(duì)象可以共享相同的外部接口。這意味著,雖然針對(duì)不同對(duì)象的具體操作不同,但通過一個(gè)公共的類,它們(那些操作)可以通過相同的方式予以調(diào)用。五、基本原則:SPR, OCP, LSP, DIP, ISP單一職責(zé)原則SRP(Single Principle)是指一個(gè)類的功能要單一,不能包羅萬(wàn)象。如同一個(gè)人一樣,分配的工作不能太多,否則一天到晚雖然忙忙碌碌的,但效率卻高不起來。開放封閉原則OCP(Open-Close Principle)一個(gè)模塊在擴(kuò)展性方面應(yīng)該是開放的而在更改性方面應(yīng)該是封閉的。比如:一個(gè)網(wǎng)絡(luò)模塊,原來只服務(wù)端功能,而現(xiàn)在要加入客戶端功能,那么應(yīng)當(dāng)在不用修改服務(wù)端功能代碼的前提下,就能夠增加客戶端功能的實(shí)現(xiàn)代碼,這要求在設(shè)計(jì)之初,就應(yīng)當(dāng)將服務(wù)端和客戶端分開,公共部分抽象出來。里式替換原則LSP(the Liskov Principle LSP)子類應(yīng)當(dāng)可以替換父類并出現(xiàn)在父類能夠出現(xiàn)的任何地方。比如:公司搞年度晚會(huì),所有員工可以參加抽獎(jiǎng),那么不管是老員工還是新員工,也不管是總部員工還是外派員工,都應(yīng)當(dāng)可以參加抽獎(jiǎng),否則這公司就不和諧了。依賴倒置原則DIP(the Inversion Principle DIP)具體依賴抽象,上層依賴下層。假設(shè)B是較A低的模塊,但B需要使用到A的功能,這個(gè)時(shí)候,B不應(yīng)當(dāng)直接使用A中的具體類: 而應(yīng)當(dāng)由B定義一個(gè)抽象接口,并由A來實(shí)現(xiàn)這個(gè)抽象接口,B只使用這個(gè)抽象接口:這樣就達(dá)到了依賴倒置的目的,B也解除了對(duì)A的依賴,反過來是A依賴于B定義的抽象接口。通過上層模塊難以避免依賴下層模塊,假如B也直接依賴A的實(shí)現(xiàn),那么就可能造成循環(huán)依賴。一個(gè)常見的問題就是編譯A模塊時(shí)需要直接包含到B模塊的cpp文件,而編譯B時(shí)同樣要直接包含到A的cpp文件。接口分離原則ISP(the Interface Principle ISP)模塊間要通過抽象接口隔離開,而不是通過具體的類強(qiáng)耦合起來看到這大家是不是對(duì)面向?qū)ο笥辛烁嗟牧私饽?,快掏出你的鍵盤new一個(gè)對(duì)象來感受一下面向?qū)ο缶幊痰镊攘Π伞W詈?,老?guī)矩,送上表情包,拜~~~~~注:本文相關(guān)內(nèi)容來自CSDN @ 十四期_李光 @ X_Ming_H 及博客園 @ 韓亦樂如有侵權(quán)請(qǐng)聯(lián)系。原文: 、
依賴注入,也稱反轉(zhuǎn)控制,IoC, DI,這些都是一回事,簡(jiǎn)單說起來就是Spring提供了一個(gè)Java Bean的處理器,通過讀取xml配置文件或注解()來自動(dòng)為你需要的的接口類型,實(shí)例化(也就是新建)對(duì)象,這樣你的代碼就不需要針對(duì)具體對(duì)象編程,而是抽象成接口來編寫,實(shí)現(xiàn)部分可以與抽象部分分開,便于分層,并隨時(shí)替換實(shí)現(xiàn)方式,這也叫做注入。面向方面編程,實(shí)際應(yīng)該叫AOP,面向切面編程,這是Spring容器的另一大功能,它可以通過反射技術(shù)為你已經(jīng)寫好的代碼自動(dòng)加上一些通用功能,也是通過通過讀取xml配置文件或注解()為依據(jù)來進(jìn)行反射實(shí)現(xiàn)的,用到了JDK的反射或CGLib的反射,能夠?qū)Ψ椒ǖ牟煌糠郑ㄈ缜爸?,后置,拋出異常,環(huán)繞等)加入代碼,一般用于數(shù)據(jù)庫(kù)的事務(wù)處理(數(shù)據(jù)庫(kù)更新類事務(wù)前后一般要加, 之類的代碼)或日志處理等等。
面向?qū)ο螅浩鋵?shí)是現(xiàn)實(shí)世界模型的自然延伸?,F(xiàn)實(shí)世界中任何實(shí)體都可以看作是對(duì)象。對(duì)象之間通過消息相互作用。另外,現(xiàn)實(shí)世界中任何實(shí)體都可歸屬于某類事物,任何對(duì)象都是某一類事物的實(shí)例。如果說傳統(tǒng)的過程式編程語(yǔ)言是以過程為中心以算法為驅(qū)動(dòng)的話,面向?qū)ο蟮木幊陶Z(yǔ)言則是以對(duì)象為中心以消息為驅(qū)動(dòng)。用公式表示,過程式編程語(yǔ)言為:程序=算法+數(shù)據(jù);面向?qū)ο缶幊陶Z(yǔ)言為:程序=對(duì)象+消息。 所有面向?qū)ο缶幊陶Z(yǔ)言都支持三個(gè)概念:封裝、多態(tài)性和繼承,Java也不例外?,F(xiàn)實(shí)世界中的對(duì)象均有屬性和行為,映射到計(jì)算機(jī)程序上,屬性則表示對(duì)象的數(shù)據(jù),行為表示對(duì)象的方法(其作用是處理數(shù)據(jù)或同外界交互)。所謂封裝,就是用一個(gè)自主式框架把對(duì)象的數(shù)據(jù)和方法聯(lián)在一起形成一個(gè)整體??梢哉f,對(duì)象是支持封裝的手段,是封裝的基本單位。Java語(yǔ)言的封裝性較強(qiáng),因?yàn)镴ava無(wú)全程變量,無(wú)主函數(shù),在Java中絕大部分成員是對(duì)象,只有簡(jiǎn)單的數(shù)字類型、字符類型和布爾類型除外。而對(duì)于這些類型,Java也提供了相應(yīng)的對(duì)象類型以便與其他對(duì)象交互操作。 可移植性:就是在這個(gè)系統(tǒng)上作的程序經(jīng)過一次編譯后可以移植到別的系統(tǒng)上解釋執(zhí)行,只要經(jīng)過簡(jiǎn)單的粘貼和復(fù)制就行了,不影響程序的效果安全性:在 iSeries 服務(wù)器上運(yùn)行的大多數(shù) Java(TM) 程序是應(yīng)用程序,而不是 applet,所以“砂箱”安全性模型對(duì)它們不起限制作用。從安全性的觀點(diǎn)看,Java 應(yīng)用程序所受的安全性限制與 iSeries 服務(wù)器上的任何其它程序相同。要在 iSeries 服務(wù)器上運(yùn)行 Java 程序,您必須對(duì)集成文件系統(tǒng)中的類文件具有權(quán)限。程序一旦啟動(dòng),它就在該用戶權(quán)限控制下運(yùn)行。 您可以使用沿用權(quán)限來訪問具有運(yùn)行程序的用戶的權(quán)限和程序擁有者權(quán)限的對(duì)象。沿用權(quán)限臨時(shí)地將用戶原先無(wú)權(quán)訪問的對(duì)象的權(quán)限授予用戶。并發(fā)性:JAVA支持多線程技術(shù),就是多個(gè)線程并行機(jī)制,多線程是Java的一個(gè)重要方法,特別有利于在程序中實(shí)現(xiàn)并發(fā)任務(wù).Java提供Thread線程類,實(shí)現(xiàn)了多線程的并發(fā)機(jī)制.然而,程序的并發(fā)執(zhí)行必定會(huì)出現(xiàn)多個(gè)線程互斥訪問臨界資源的局面,因而并發(fā)系統(tǒng)解決的關(guān)鍵就是對(duì)臨界資源的管理和分配問題,而在進(jìn)行臨界資源分配時(shí)有兩方面需要考慮,即安全性和公平性.文中首先討論了多線程并發(fā)系統(tǒng)中的安全性與公平性問題,指出安全性與公平性在并發(fā)系統(tǒng)中訪問臨界資源時(shí)的重要性.并通過火車行駛單行隧道的實(shí)例,演示各種條件下的行駛情況來進(jìn)一步說明該問題.可視化:不好說,像vb這樣的也是可視話的編成程序。
面向接口編程就是一堆接口,通過接口規(guī)約對(duì)象的屬性和方法,是面向?qū)ο笠徊糠?。面向接口本身就是面向?qū)ο蟮?,無(wú)所謂區(qū)別,只不過面向接口的好處是耦合性低
有一只狗,又來了一只狗,加起來是兩只狗,這是面向過程的有一只狗,它的年齡是五歲,他有兩只耳朵,這是面向?qū)ο蟮哪慵茵B(yǎng)一群狗,你要找一批年齡5歲以上的來吃肉,這是面向數(shù)據(jù)的
如果以上內(nèi)容沒有幫到您,歡迎電話聯(lián)系我們,或者聯(lián)系在線客服咨詢
只要一個(gè)電話
我們免費(fèi)為您回電