最近新工作太忙了,好久沒有寫博客了,經過一段時間的編碼,發現自己寫的代碼真的是太差勁了,難維護,擴展性低,重復代碼過多。自己分析分析總結一下,發現是自己缺少了一項優秀程序員的技能--設計模式,所以最近打算充充電,和大家一起學習一下設計模式,有問題之處請大家指點一二。
轉載請注明出處:http://blog.csdn.net/developer_zhang
在學習面向對象之前,我們來一起溫習一下面向對象的基礎知識吧:
在面向對象設計模式中,類與類之間主要有5種關系,他們分別是:依賴、關聯、聚合、組合、繼承。他們的耦合度依次增強。
依賴關系的定義為:對於兩個相對獨立的對象,當一個對象負責構造另一個對象的實例,或者依賴另一個對象的服務時,這兩個對象之間主要體現為依賴關系。定義比較晦澀難懂,但在面向對象中的表現還是比較直觀的:類A當中使用了類B,其中類B是作為類A的方法參數、方法中的局部變量、或者靜態方法調用。類上面的圖例中:People類依賴於Book類和Food類,Book類和Food類是作為類中方法的參數形式出現在People類中的。
代碼實例:
#import "People.h" @implementation People //Book作為read方法的形參 -(void)read:(Book*) book{ NSLog(@"讀的書是:%@",book.name); } @end
單向關聯:
雙向關聯:
對於兩個相對獨立的對象,當一個對象的實例與另一個對象的一些特定實例存在固定的對應關系時,這兩個對象之間為關聯關系。關聯關系分為單向關聯和雙向關聯。在java中,單向關聯表現為:類A當中使用了類B,其中類B是作為類A的成員變量。雙向關聯表現為:類A當中使用了類B作為成員變量;同時類B中也使用了類A作為成員變量。
代碼實例:
#import "Father.h" @implementation Father @synthesize name; @synthesize son; -(Father*)init { self=[super init]; //先使用父類方法進行初始化 if (self!=nil) { son = [[Son alloc] init]; } return self; } @end #import "Son.h" #import "Father.h" @implementation Son @synthesize name; @synthesize father; -(Son*)init { self=[super init]; //先使用父類方法進行初始化 if (self!=nil) { // father = [[Father alloc] init]; } return self; } @end
聚合關系是關聯關系的一種,耦合度強於關聯,他們的代碼表現是相同的,僅僅是在語義上有所區別:關聯關系的對象間是相互獨立的,而聚合關系的對象之間存在著包容關系,他們之間是“整體-個體”的相互關系。
代碼實例:
#import "People.h" @implementation People @synthesize car; -(void)setCar:(Car *)inputCar { self.car = inputCar; } -(void)drivingCar { NSLog(@"車的型號是%@",car.type); } @end
相比於聚合,組合是一種耦合度更強的關聯關系。存在組合關系的類表示“整體-部分”的關聯關系,“整體”負責“部分”的生命周期,他們之間是共生共死的;並且“部分”單獨存在時沒有任何意義。在下圖的例子中,People與Soul、Body之間是組合關系,當人的生命周期開始時,必須同時有靈魂和肉體;當人的生命周期結束時,靈魂肉體隨之消亡;無論是靈魂還是肉體,都不能單獨存在,他們必須作為人的組成部分存在。
代碼實例:
//組合 @synthesize body; -(People*)init { self = [super init]; if (self!=nil) { body = [[Body alloc] init]; } return self; } -(void)eat { NSLog(@"吃飯用身體:%@",body.name); }
繼承表示類與類之間的父子關系。在IOS中,用“:”表示繼承關系(@interface People :NSObject)。UML圖例中,繼承關系用實線+空心箭頭表示,箭頭指向父類。
繼承代碼比較簡單,這裡就不附加代碼了。
代碼下載地址:http://download.csdn.net/detail/u010013695/6942183
以上就是設計模式基礎知識的所有內容,歡迎大家共同切磋交流,一起進步,十分感謝!