用OC代碼認(rèn)識六大設(shè)計原則

用OC代碼認(rèn)識設(shè)計模式(一)--創(chuàng)建型模式
用OC代碼認(rèn)識設(shè)計模式(二)--結(jié)構(gòu)型模式
用OC代碼認(rèn)識設(shè)計模式(三)--行為型模式
用OC代碼認(rèn)識六大設(shè)計原則

  • 單一職責(zé)原則:類的職責(zé)要單一;
  • 里氏替換原則:不要破壞繼承體系;
  • 依賴倒置原則:要面向接口編程;
  • 接口隔離原則:設(shè)計接口的時候要精簡修肠;
  • 迪米特法原則:降低耦合逊谋;
  • 開放封閉原則:對擴展開放禀崖,對修改關(guān)閉。
1粮彤、單一職責(zé)原則(Single Responsibility Principle兵志,簡稱SRP )

定義:就一個類而言醇蝴,應(yīng)該僅有一個引起它變化的原因。

示例:
1想罕、員工的工資計算悠栓。剛開始的時候,我們會新建一個員工類按价,在員工類里面有一個計算工資的方法闸迷,代碼如下所示:

//Employee.h
@interface Employee : NSObject
// 計算工資
- (void)calculateSalary:(NSString *)name;
@end

//Employee.m
@implementation Employee
- (void)calculateSalary:(NSString *)name
{
    NSLog(@"%@的工資是100",name);
}
@end
Employee *employee = [[Employee alloc] init];
[employee calculateSalary:@"張三"];
[employee calculateSalary:@"李四"];

/*結(jié)果輸出
張三的工資是100
李四的工資是100
*/

產(chǎn)品上線后,問題出來了俘枫,因為員工的崗位不同,工資的計算是不一樣的逮走。一般有三種修改方法:

(1)簡單做法鸠蚪,修改calculateSalary,增加參數(shù)

// 計算工資,增加員工崗位的標(biāo)識(Director:總監(jiān);Manager:經(jīng)理;Staff:普通員工)
- (void)calculateSalary:(NSString *)name flag:(NSString *)flag
{
    if ([flag isEqualToString:@"Director"])
    {
        NSLog(@"%@總監(jiān)的工資是10000",name);
    }
    else if ([flag isEqualToString:@"Manager"])
    {
        NSLog(@"%@經(jīng)理的工資是1000",name);
    }
    else if ([flag isEqualToString:@"Staff"])
    {
        NSLog(@"%@員工的工資是100",name);
    }
}

(2)新建方法

// 總監(jiān)工資計算
- (void)directorCalculateSalary:(NSString *)name;
// 經(jīng)理工資計算
- (void)managerCalculateSalary:(NSString *)name;
// 普通員工工資計算
- (void)staffCalculateSalary:(NSString *)name;

(3)新建類

Director *director = [[Director alloc] init];
Manager *manager = [[Manager alloc] init];
Staff *staff = [[Staff alloc] init];

上面三種方式各有優(yōu)缺點师溅,那么在實際編程中茅信,該采用哪一種呢?這個問題沒有標(biāo)準(zhǔn)答案墓臭,需要根據(jù)實際情況來確定蘸鲸。
但是只有(3)是符合單一職責(zé)原則,也是最復(fù)雜的窿锉。

2酌摇、里氏替換原則(Liskov Substitution Principle,簡稱LSP)

定義:在使用基類的的地方可以任意使用其子類膝舅,能保證子類完美替換基類。

里氏替換原則通俗的來講就是:子類可以擴展父類的功能窑多,但不能改變父類原有的功能仍稀。
它包含以下2層含義:
1、子類可以實現(xiàn)父類的抽象方法埂息,但不能覆蓋父類的非抽象方法技潘;
2、子類中可以增加自己特有的方法千康。

3享幽、依賴倒置原則(Dependence Inversion Principle,簡稱DIP)

定義:高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象拾弃;抽象不應(yīng)該依賴細(xì)節(jié)值桩;細(xì)節(jié)應(yīng)該依賴抽象。

例子:
SalaryManage類負(fù)責(zé)工資的管理砸彬;Director是總監(jiān)類颠毙,現(xiàn)在我們要通過SalaryManage類來給總監(jiān)發(fā)放工資了,主要代碼片段如下所示:

// SalaryManage.h
- (void)calculateSalary:(Director *)director
{
    [director calculateSalary];
}
    // 員工類
    Director *director = [[Directoralloc] init];
    director.strName  = @"張三";
    
    // 工資管理(財務(wù)部)
    SalaryManage *salaryManage = [[SalaryManagealloc] init];
    [salaryManage calculateSalary:director];

假設(shè)我們還需要給普通員工砂碉、財務(wù)總監(jiān)蛀蜜、研發(fā)總監(jiān)等更多的崗位發(fā)送工資,那么我們就只能不斷的去修改SalaryManage類來滿足業(yè)務(wù)的需求增蹭。產(chǎn)生這種現(xiàn)象的原因就是SalaryManage與Director之間的耦合性太高了滴某,必須降低它們之間的耦合度才行。因此我們引入一個委托EmployeeDelegate滋迈,它提供一個發(fā)放工資的方法定義霎奢,如下所示:
然后我們讓具體的員工類Director、Manager等都實現(xiàn)EmployeeDelegate委托方法

@protocol EmployeeDelegate <NSObject> 
- (void)calculateSalary;
@end
// 修改后的SalaryManage計算工資方法:
- (void)calculateSalary:(id<EmployeeDelegate>)employee
{
    [employee calculateSalary];
}
    // 使用例子
    Director *director = [[Directoralloc] init];
    director.strName  = @"張三";
    
    Manager *manager = [[Manageralloc] init];
    manager.strName  = @"李四";
    
    SalaryManage *salaryManage = [[SalaryManagealloc] init];
    [salaryManage calculateSalary:director];
    [salaryManage calculateSalary:manager];

這與對象適配器模式差不多饼灿。

4幕侠、接口隔離原則(Interface Segregation Principle,簡稱ISP)

定義:類間的依賴關(guān)系應(yīng)該建立在最小的接口上


在這里,我們定義了一個動物活動的接口IAnimal碍彭,里面有4個方法:飛行fly晤硕、行走walk、吃eat和工作work庇忌,然后分別用人類People和鳥類Bird實現(xiàn)了這個接口舞箍。中國人類ChinesePeople和鸚鵡類Parrot通過接口IAnimal分別依賴類People和類Bird。很明顯皆疹,對于ChinesePeople來說疏橄,fly方法是多余的,因為人不會飛略就;對于Parrot類來說捎迫,work方法是多余的晃酒,因為鸚鵡不需要工作。接口IAnimal對于類ChinesePeople和類Parrot來說不是最小接口立砸。

解決方案

將臃腫的接口IAnimal拆分為獨立的幾個接口掖疮,類ChinesePeople和類Parrot分別與它們需要的接口建立依賴關(guān)系,也就是采用接口隔離原則颗祝。修改后的UML圖如下所示:

5浊闪、迪米特法則(Law of Demeter,簡稱LoD)

定義:如果兩個類不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用螺戳。如果其中的一個類需要調(diào)用另一個類的某一個方法的話搁宾,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用,這里的第三者就是接口InmatesDelegate倔幼。

6盖腿、開放封閉原則(Open Close Principle,簡稱OCP)

定義:一個軟件實體(如類、模塊损同、函數(shù))應(yīng)當(dāng)對擴展開放翩腐,對修改關(guān)閉。

盡量讓設(shè)計的類做好后就不再修改膏燃,如果有新的需求茂卦,通過新加類的方式來滿足,而不去修改現(xiàn)有的類(代碼)组哩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末等龙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伶贰,更是在濱河造成了極大的恐慌蛛砰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黍衙,死亡現(xiàn)場離奇詭異泥畅,居然都是意外死亡,警方通過查閱死者的電腦和手機琅翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門涯捻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人望迎,你說我怎么就攤上這事×柰猓” “怎么了辩尊?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長康辑。 經(jīng)常有香客問我摄欲,道長轿亮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任胸墙,我火速辦了婚禮我注,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迟隅。我一直安慰自己但骨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布智袭。 她就那樣靜靜地躺著奔缠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吼野。 梳的紋絲不亂的頭發(fā)上校哎,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音瞳步,去河邊找鬼闷哆。 笑死,一個胖子當(dāng)著我的面吹牛单起,可吹牛的內(nèi)容都是我干的抱怔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馏臭,長吁一口氣:“原來是場噩夢啊……” “哼野蝇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起括儒,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绕沈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帮寻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乍狐,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年固逗,在試婚紗的時候發(fā)現(xiàn)自己被綠了浅蚪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡烫罩,死狀恐怖惜傲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贝攒,我是刑警寧澤盗誊,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響哈踱,放射性物質(zhì)發(fā)生泄漏荒适。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一开镣、第九天 我趴在偏房一處隱蔽的房頂上張望刀诬。 院中可真熱鬧,春花似錦邪财、人聲如沸陕壹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帐要。三九已至,卻和暖如春弥奸,著一層夾襖步出監(jiān)牢的瞬間榨惠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工盛霎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赠橙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓愤炸,卻偏偏與公主長得像期揪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子规个,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文出自《Android源碼設(shè)計模式解析與實戰(zhàn)》中的第一章凤薛。 1、優(yōu)化代碼的第一步——單一職責(zé)原則 單一職責(zé)原則的...
    MrSimp1e0閱讀 1,770評論 1 13
  • 設(shè)計模式六大原則 設(shè)計模式六大原則(1):單一職責(zé)原則 定義:不要存在多于一個導(dǎo)致類變更的原因诞仓。通俗的說缤苫,即一個類...
    viva158閱讀 768評論 0 1
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計模式六...
    Bloo_m閱讀 717評論 0 7
  • 深山幽路通何處, 衰草掩路枯葉舞墅拭。 巉巖一疊又一疊活玲, 登巖不見來時路。 天色昏昏欲來雪谍婉, 不知荒村可留宿舒憾。 前路漫...
    左雨塘閱讀 203評論 7 3
  • 我,叫周寒穗熬。 我的出生镀迂,注定了我不能過上正常人的生活。 我家是個獨特的家庭唤蔗,我媽雖然是一個普通婦女招拙,可我爸干的活唧瘾,...
    小萌新Lv1閱讀 4,317評論 0 3