繼續(xù)學(xué)習(xí)Spring,在web上面的應(yīng)用,spring的關(guān)鍵,是將業(yè)務(wù)類在spring框架中注冊(cè),也就是在xml文件中,其中包括類的屬性的初始化,這有個(gè)屬性注入的概念,常用的有構(gòu)造方法注入,和set方法注入,還有一種不常用的接口注入,Class.forName();,注冊(cè)以后,在控制器中使用的時(shí)候,通過spring框架來創(chuàng)建對(duì)象,然后我們來使用這個(gè)對(duì)象,其中這里有個(gè)很重要的要求就是,面向接口編程,要實(shí)現(xiàn)一個(gè)業(yè)務(wù)類,必須先定義一個(gè)該業(yè)務(wù)類的接口,然后讓實(shí)現(xiàn)類實(shí)現(xiàn)它,這樣做的好處可以隱藏實(shí)現(xiàn)類的內(nèi)部實(shí)現(xiàn),將想讓客戶見到的方法放到接口中,這樣實(shí)現(xiàn)隱藏其他不想公開的方法。另外從客戶的角度來看,客戶只是得到了一個(gè)實(shí)現(xiàn)類的接口類型,并沒有得到具體的實(shí)現(xiàn)類,甚至不知道實(shí)現(xiàn)類的名字,面向接口編程。
另外,IoR是一種設(shè)計(jì)思想,將類的創(chuàng)建,管理,銷毀,還有單一模式,這一檔子事全部交給別人來負(fù)責(zé),客戶只拿來使用創(chuàng)建好的對(duì)象,為客戶帶來了簡(jiǎn)便,使更多的精力放到業(yè)務(wù)放到業(yè)務(wù)處理上,另外,也帶來了代碼的松耦合。
一天下來還是頭疼,不知怎么搞得,感冒還是沒好利索,今天抽時(shí)間將編程思想的對(duì)象初始化看完了,接下來計(jì)劃復(fù)習(xí)Struts。
昨天晚上裝jbuilder2006遇上安裝好后不能啟動(dòng)的問題,從網(wǎng)上找的解決問題的辦法。
安裝 JBuilder 后第一次可以成功運(yùn)行,可是機(jī)器重新啟動(dòng)之后再次運(yùn)行 JBuilder 時(shí)卻每次只是看到 Logo 閃了一下就沒有任何反應(yīng)了。
這種情況主要是由于 VM 的內(nèi)存分配設(shè)置出了問題。可以在 X:\JBuilder2006\bin 目錄下找到一個(gè)名為 jbuilder.config 的文件,打開該文件,其中有如下一行設(shè)置:
# Tune this VM to provide enough headroom to work on large
# applications
vmmemmin 32m
vmmemmax 75%
vmparam -XX:MaxPermSize=128m
將其改為:
# Tune this VM to provide enough headroom to work on large
# applications
vmmemmin 32m
vmmemmax 512m
vmparam -XX:MaxPermSize=128m
即可解決上述問題。
今天講spring的MVC實(shí)現(xiàn),理論上跟Struts差不多,只是換湯不換藥,目前只是接觸到了Spring的控制器和模型之間是如何聯(lián)系的,Spring利用IoC實(shí)現(xiàn)了松耦合。這是比Struts先進(jìn)的地方。
今天接觸到了Spring,我喜歡的名字,呵呵,Spring應(yīng)用框架是應(yīng)用于業(yè)務(wù)層的框架,要求面向接口編程,將類與類之間的關(guān)系進(jìn)行解耦,Spring最基本的就是IoR(Inversion of Control)翻譯過來是控制反轉(zhuǎn),是一種設(shè)計(jì)模式,使應(yīng)用程序邏輯外在化,將創(chuàng)建對(duì)象,初始化,銷毀交給spring來管理,通過動(dòng)態(tài)加載來使用對(duì)象。
好久沒有打代碼了,今天問起strues的東西,都有點(diǎn)陌生了,不行,得好好復(fù)習(xí)不行。今天一天下來頭疼,不知為什么,精力太集中了?呵呵。
今天發(fā)現(xiàn)有個(gè)人去工作了,哦天,呆兩天不會(huì)來再哦天。
頭疼,回家。
無意中發(fā)現(xiàn)baidu的blog可以從別的地方搬家,哈哈,拉攏我們的好辦法,決定試一下,哈哈轉(zhuǎn)過來了,還不錯(cuò),除了因?yàn)槲以瓉淼捻撁嬗斜尘埃煮w設(shè)成白色的了,在這邊顯示不出來,讓我甚是不爽,改了半天,這下終于行了,還不錯(cuò)。
感覺baidu的速度還是相當(dāng)快的。/
類與類之間的關(guān)系對(duì)于理解面向?qū)ο缶哂泻苤匾淖饔茫郧霸诿嬖嚨臅r(shí)候也經(jīng)常被問到這個(gè)問題,在這里我就介紹一下。
類與類之間存在以下關(guān)系:
(1)泛化(Generalization)
(2)關(guān)聯(lián)(Association)
(3)依賴(Dependency)
(4)聚合(Aggregation)
UML圖與應(yīng)用代碼例子:
1.泛化(Generalization)
[泛化]
表示類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類對(duì)接口的實(shí)現(xiàn)關(guān)系。一般化的關(guān)系是從子類指向父類的,與繼承或?qū)崿F(xiàn)的方法相反。
[具體表現(xiàn)]
父類 父類實(shí)例=new 子類()
[UML圖](圖1.1)

圖1.1 Animal類與Tiger類,Dog類的泛化關(guān)系
[代碼表現(xiàn)]
- class Animal{}
- class Tiger extends Animal{}
- public class Test
- {
- public void test()
- {
- Animal a=new Tiger();
- }
- }
2.依賴(Dependency)
[依賴]
對(duì)于兩個(gè)相對(duì)獨(dú)立的對(duì)象,當(dāng)一個(gè)對(duì)象負(fù)責(zé)構(gòu)造另一個(gè)對(duì)象的實(shí)例,或者依賴另一個(gè)對(duì)象的服務(wù)時(shí),這兩個(gè)對(duì)象之間主要體現(xiàn)為依賴關(guān)系。
[具體表現(xiàn)]
依賴關(guān)系表現(xiàn)在局部變量,方法的參數(shù),以及對(duì)靜態(tài)方法的調(diào)用
[現(xiàn)實(shí)例子]
比如說你要去擰螺絲,你是不是要借助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工作
[UML表現(xiàn)](圖1.2)

圖1.2 Person類與Screwdriver類的依賴關(guān)系
[代碼表現(xiàn)]
- public class Person{
- /** 擰螺絲 */
- public void screw(Screwdriver screwdriver){
- screwdriver.screw();
- }
- }
3.關(guān)聯(lián)(Association)
[關(guān)聯(lián)]
對(duì)于兩個(gè)相對(duì)獨(dú)立的對(duì)象,當(dāng)一個(gè)對(duì)象的實(shí)例與另一個(gè)對(duì)象的一些特定實(shí)例存在固定的對(duì)應(yīng)關(guān)系時(shí),這兩個(gè)對(duì)象之間為關(guān)聯(lián)關(guān)系。
[具體表現(xiàn)]
關(guān)聯(lián)關(guān)系是使用實(shí)例變量來實(shí)現(xiàn)
[現(xiàn)實(shí)例子]
比如客戶和訂單,每個(gè)訂單對(duì)應(yīng)特定的客戶,每個(gè)客戶對(duì)應(yīng)一些特定的訂單;再例如公司和員工,每個(gè)公司對(duì)應(yīng)一些特定的員工,每個(gè)員工對(duì)應(yīng)一特定的公司
[UML圖] (圖1.3)

圖1.3 公司和員工的關(guān)聯(lián)關(guān)系
[代碼表現(xiàn)]
- public class Company{
- private Employee employee;
- public Employee getEmployee(){
- return employee;
- }
- public void setEmployee(Employee employee){
- this.employee=employee;
- }
- //公司運(yùn)作
- public void run(){
- employee.startWorking();
- }
- }
(4)聚合(Aggregation)
[聚合]
當(dāng)對(duì)象A被加入到對(duì)象B中,成為對(duì)象B的組成部分時(shí),對(duì)象B和對(duì)象A之間為聚集關(guān)系。聚合是關(guān)聯(lián)關(guān)系的一種,是較強(qiáng)的關(guān)聯(lián)關(guān)系,強(qiáng)調(diào)的是整體與部分之間的關(guān)系。
[具體表現(xiàn)]
與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過實(shí)例變量來實(shí)現(xiàn)這樣關(guān)系的。關(guān)聯(lián)關(guān)系和聚合關(guān)系來語法上是沒辦法區(qū)分的,從語義上才能更好的區(qū)分兩者的區(qū)別。
[關(guān)聯(lián)與聚合的區(qū)別]
(1)關(guān)聯(lián)關(guān)系所涉及的兩個(gè)對(duì)象是處在同一個(gè)層次上的。比如人和自行車就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因?yàn)槿瞬皇怯勺孕熊嚱M成的。
聚合關(guān)系涉及的兩個(gè)對(duì)象處于不平等的層次上,一個(gè)代表整體,一個(gè)代表部分。比如電腦和它的顯示器、鍵盤、主板以及內(nèi)存就是聚集關(guān)系,因?yàn)橹靼迨请娔X的組成部分。
(2)對(duì)于具有聚集關(guān)系(尤其是強(qiáng)聚集關(guān)系)的兩個(gè)對(duì)象,整體對(duì)象會(huì)制約它的組成對(duì)象的生命周期。部分類的對(duì)象不能單獨(dú)存在,它的生命周期依賴于整體類的對(duì)象的生命周期,當(dāng)整體消失,部分也就隨之消失。比如張三的電腦被偷了,那么電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤和內(nèi)存)拆了下來。
[UML圖](圖1.4)

圖1.3 電腦和組件的聚合關(guān)系
[代碼表現(xiàn)]
- public class Computer{
- private CPU cpu;
- public CPU getCPU(){
- return cpu;
- }
- public void setCPU(CPU cpu){
- this.cpu=cpu;
- }
- //開啟電腦
- public void start(){
- //cpu運(yùn)作
- cpu.run();
- }
- }
[參考資料]
1.《Java與模式》(閻宏 編著) 第2章 統(tǒng)一建模語言UML簡(jiǎn)介
突然感覺自己是個(gè)木訥的人,還矯情的寫寫心情,呵呵,女不女人。
時(shí)間過的真快,天氣已經(jīng)很冷了,開始越來越擔(dān)心,這個(gè)年該怎么過,話雖說,車到山前必有路,但還是免不了不知如何是好。
想想,我想要的,其實(shí)我也不想太奢侈,自己的路真想自己走,就應(yīng)該自己走,可是...
哪有那么多可是,男人一點(diǎn)。
我該表明我的觀點(diǎn),我的立場(chǎng),唉,頭暈/
跟著感覺走吧。
Oracle數(shù)據(jù)庫課結(jié)束了,老師上完課坐晚上的火成回沈陽,專業(yè)Oracle數(shù)據(jù)庫老師,當(dāng)老師還是不錯(cuò)的嘛,呵呵。
下周就是Spring/冬眠了呵呵,接著Struts繼續(xù)研究代碼的階段,也不能單純的研究代碼不是,MVC,設(shè)計(jì)模式,面向?qū)ο螅@是最基本的,好好研究編程思想吧。
自己好好學(xué)吧,靠別人是不行的,也不要多管閑事。
數(shù)據(jù)庫,存儲(chǔ)過程,游標(biāo)
沒什么具體寫的,心情不好,身體也不好,狗日的,回家。
今天的自講因?yàn)闄C(jī)子連接的問題取消了。
這周接著講Oracle,
今天脖子特別疼,還比較困,老師一講就犯困了,
晚上還好,郭斌斌講了繼承,還不錯(cuò),蠻有收獲。哎呦脖子疼,剛剛發(fā)現(xiàn)手機(jī)欠費(fèi)了,買了張充值卡充上了,還是說我欠費(fèi)不讓我打電話,真是氣死我,狗日的移動(dòng)。
脖子疼好些了,嗓子又腫了,昨晚一晚上沒睡好,還挺厲害,中午買了點(diǎn)消炎藥,昨晚開玩笑說,以后我掙的錢還供不上吃藥的,呵呵,還活著干啥。
數(shù)據(jù)庫講了一些如何配置,然后是一些sql語句oracle獨(dú)有的,老師的水平還是厲害的,看得出來,就是有些靦腆哈哈,感到oracle還是很強(qiáng)大的,有很多它獨(dú)有的東西。要想學(xué)好它可是要費(fèi)一段功夫的。
昨晚的講課進(jìn)行的不好,感覺的在糊弄我們,也沒說什么,唉0能說什么呢,今天鄧講內(nèi)部類,挺麻煩的東西。
最后一天uml,行為模式,Chain of Responsibility (COR)職責(zé)鏈模式,Command模式,Iterator迭代器模式,Mediator模式,Memento備忘錄模式,Visitor訪問者模式,Strategy策略模式,State狀態(tài)模式。
COR模式,職責(zé)鏈模式,定義一個(gè)接口,有一個(gè)處理方法,有一個(gè)該接口類型的字段,并且有一個(gè)該字段的set設(shè)置方法,不同的職責(zé)分別實(shí)現(xiàn)該接口,處理方法判斷是否是自己的方法,如果是,處理,如果不是,利用接口里定義的字段訪問下一個(gè)職責(zé)的處理方法,在客戶端,建立各個(gè)職責(zé)的對(duì)象,并用set方法設(shè)置下一個(gè)職責(zé)是哪一個(gè),最后調(diào)用第一個(gè)職責(zé)的處理方法。
Command模式,國(guó)王發(fā)好施令,定義一個(gè)命令接口,用于發(fā)布命令,實(shí)現(xiàn)該接口,有一個(gè)士兵類屬性,構(gòu)造器負(fù)責(zé)傳入士兵對(duì)象,用于讓那個(gè)士兵去執(zhí)行該命令,士兵類,士兵類里面有具體執(zhí)行命令的方法,國(guó)王類,有發(fā)布命令的方法,在客戶端,實(shí)例化一個(gè)士兵,實(shí)例化一個(gè)發(fā)布命令類,將士兵對(duì)象作為參數(shù)傳給命令類,實(shí)例化一個(gè)國(guó)王對(duì)象,將命令對(duì)象作為參數(shù)傳給國(guó)王,國(guó)王發(fā)號(hào)施令。
Iterator迭代器,就像集合里面有個(gè)方法可以得到Iterator對(duì)象,用于遍歷、排序。
Mediator媒體模式,由多個(gè)類需要調(diào)用,將這幾個(gè)類組合到一個(gè)類,在這個(gè)類里面有每個(gè)類類型的屬性,讓客戶端實(shí)例化這個(gè)類,不需關(guān)心其他類。
Memento模式,建立一個(gè)跟已有的類一模一樣的類,用于保存在某個(gè)時(shí)刻的值,防止后悔,呵呵!已有類里面有個(gè)memento類的對(duì)象。
Visitor訪問者模式,解決了泛型要解決的問題,利用多態(tài),多態(tài)真是太有用了,哈哈,我覺得很多設(shè)計(jì)模式都用了多態(tài)特性。
Strategy策略模式
State狀態(tài)模式
今天下課給大家講了講第三章,比較簡(jiǎn)單,但是不夠自信,怕自己說錯(cuò)了,呵呵,還好,大家都分了一章,下星期都安排好了,安排好后幾個(gè)人又開始玩cs了,怎么能這樣呢,還不好意思說他們,唉…
設(shè)計(jì)模式,創(chuàng)建型模式,工廠方法,Builder模式
工廠方法就是建一個(gè)工廠類,這個(gè)工廠類負(fù)責(zé)生產(chǎn)對(duì)象,生產(chǎn)需要的對(duì)象,生成什么樣的對(duì)象由調(diào)用工廠方法的對(duì)象決定,也可以由xml文件配置,就像在struts里面配置action。隨著工廠類的增多,可以將工廠類抽象,然后由子類繼承。
Builder模式,可以單獨(dú)有一個(gè)類負(fù)責(zé)另一個(gè)類的對(duì)象的創(chuàng)建。我的理解,可以
Interface Car{};
class BuildCar
{
class RedCar implements Car
{}
Public Car getCar()
{
return new RedCar();
}
}
就像10-12日的那個(gè)例子,我想這就用了Builder模式。另外,Builder模式還可以有一個(gè)叫導(dǎo)向器的類Director,它負(fù)責(zé)怎樣創(chuàng)建這個(gè)對(duì)象,適用于幾個(gè)類的屬性基本相同,只有少許不同,這樣用到導(dǎo)向器,實(shí)現(xiàn)Builder類的重用。
基礎(chǔ)太重要了,高樓大廈的基石,好好看java編程思想。老師建議我們每個(gè)人一人一章,然后負(fù)責(zé)給每個(gè)人講解,這樣的學(xué)習(xí)效率是很高的,再有,看明白了跟講明白了是兩個(gè)層次,可是沒人相應(yīng),下課我問大家覺得老師的提議怎么樣?沒人理我,嗚嗚。大家不想學(xué)好么。
設(shè)計(jì)模式,構(gòu)建型模式最后一個(gè):Singleton單件模式
保證一個(gè)類只有一個(gè)實(shí)例存在,方法是隱藏構(gòu)造方法,在類的內(nèi)部構(gòu)造一個(gè)靜態(tài)的實(shí)例,然后建一個(gè)靜態(tài)方法返回這個(gè)實(shí)例,其中一個(gè)知識(shí)點(diǎn)是,靜態(tài)變量是在main方法執(zhí)行前初始化的,也就是在程序運(yùn)行前初始化的。
結(jié)構(gòu)性模式:適配器模式Adapter,橋接模式Bridge,組合模式Composite,裝飾模式Dectorator,外觀模式Fa ade,享元模式FlyWeight,代理模式Proxy。
Adapter模式,是多重繼承的一種替代方法,通過繼承一個(gè)類,組合一個(gè)類,來實(shí)現(xiàn)。
Bridge模式,將要執(zhí)行的業(yè)務(wù)方法抽象出來,建立一個(gè)橋接接口,通過實(shí)現(xiàn)該接口用于不同的業(yè)務(wù),然后使用該實(shí)現(xiàn)類。
Composite模式,多個(gè)相同的對(duì)象要調(diào)用它們的一個(gè)方法,單獨(dú)寫一個(gè)類,里面有個(gè)該對(duì)象的類的類型的集合,里面裝有許多對(duì)象,有個(gè)方法,利用循環(huán)依次調(diào)用每個(gè)對(duì)象的方法,宗旨是讓類的使用者更方便。
Dectorator模式,避免過深繼承的一種方式,目前有一個(gè)類,但業(yè)務(wù)需求改變導(dǎo)致這個(gè)類有少許變化,如果繼承這個(gè)類,將導(dǎo)致無限制繼承,辦法是建立一個(gè)這個(gè)類的兄弟,實(shí)現(xiàn)新的業(yè)務(wù)需求,然后調(diào)用兄弟的方法。
Fa ade模式,用于業(yè)務(wù)操作十分復(fù)雜,為了實(shí)現(xiàn)對(duì)復(fù)雜性的封裝,建立一個(gè)類,建立一個(gè)面向外界的接口,類的使用者只需調(diào)用該接口就搞定了,而背后復(fù)雜的邏輯不必去關(guān)心。
FlyWeight模式,跟單件模式有類似之處,都是為了減少重復(fù)對(duì)象的創(chuàng)建,這個(gè)模式是,建立一個(gè)緩存,將已建立的對(duì)象放入緩存,當(dāng)再次需要的時(shí)候在緩存中查找是不是已經(jīng)存在了該對(duì)象,如果存在,直接返回,否則創(chuàng)建,這樣節(jié)省了內(nèi)存空間,這樣的適用于有許多的小型對(duì)象的適用。
Proxy模式,用于不同用戶有不同操作權(quán)限的類似情況,有一個(gè)類負(fù)責(zé)業(yè)務(wù)邏輯的執(zhí)行并不負(fù)責(zé)用戶是否具有權(quán)限的判斷,這件任務(wù)由另一個(gè)類負(fù)責(zé)。
以上設(shè)計(jì)模式的理解,用自己的話寫了一下,希望加深理解。
明天可能要給大家講第三章,得好好準(zhǔn)備準(zhǔn)備,爭(zhēng)取完美,嘻嘻。
今天開始上uml課,老師還是很厲害的。
其中一個(gè)很容易混淆的關(guān)系就是一個(gè)依賴關(guān)系,一個(gè)關(guān)聯(lián)關(guān)系,依賴關(guān)系就是參數(shù)關(guān)系,一個(gè)類的對(duì)象作為一個(gè)參數(shù)在另一個(gè)類里被使用,而關(guān)聯(lián)關(guān)系,是一個(gè)類的對(duì)象作為另一個(gè)類的一個(gè)屬性或者集合屬性來使用。
另外,在實(shí)際設(shè)計(jì)開發(fā)中,應(yīng)盡可能少的使用繼承,完全符合繼承邏輯關(guān)系的才使用繼承,以免造成代碼的混亂,關(guān)于多重繼承在java中不直接被支持,采用內(nèi)部類或者關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)。
在C++ 中有個(gè)名詞叫友元,一般情況下,子類繼承父類,子類是不能訪問父類的私有成員的,而如果一定要訪問,就在父類中將子類聲明為父類的一個(gè)朋友,這樣子類就可以使用父類的私有成員,這就是友元,在java中沒有這樣的概念。
Java基礎(chǔ)知識(shí)很重要,要注意復(fù)習(xí),進(jìn)一步掌握。
接著uml,接下來就應(yīng)該是設(shè)計(jì)模式了,這部分都是些理論的東西,基本不用寫代碼,一些畫uml圖的含義,感覺記不住,只能到時(shí)候用到的時(shí)候,再來查查資料了,uml很重要/
感覺自己掌握的知識(shí)太欠缺了,要好好掌握基礎(chǔ)才行。
面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)際上進(jìn)行的是創(chuàng)建新的數(shù)據(jù)類型。也可以認(rèn)為,類型決定了接口,而類是該接口的一個(gè)特定實(shí)現(xiàn)。值得好好理解。
類描述了具有相同特性(數(shù)據(jù)元素)和行為的對(duì)象集合。