輕松搞定設計模式

1.設計模式概述

如果把修習軟件開發(fā)當作武功修煉的話,那么可以分為內(nèi)功和外功


image.png

招式:
Java说敏,C#,C++等編程語言
Eclipse,Android Studio, XCode等開發(fā)工具
Struts Hibernate,JBPM等框架技術
內(nèi)功:數(shù)據(jù)結(jié)構(gòu),算法鲁僚,設計模式,重構(gòu)裁厅,軟件工程冰沙。

每一位軟件開發(fā)人員也都希望成為一名兼具淋漓招式和深厚內(nèi)功的“上
乘”軟件工程師,而對設計模式的學習與領悟?qū)屇恪皟?nèi)功”大增执虹,再結(jié)合
你日益純熟的“招式”拓挥,你的軟件開發(fā)“功力”一定會達到一個新的境界。

招式可以很快學會袋励,但是內(nèi)功修煉需要很長等時間

設計模式有何而來侥啤?

模式之父:Christopher Alexander(克里斯托弗.亞歷山大)———哈佛大學建筑學
博士、美國加州大學伯克利分校建筑學教授茬故、加州大學伯克利分校環(huán)境結(jié)構(gòu)研
究所所長盖灸、美國藝術和科學院院士。

“每個模式都描述了一個在我們的環(huán)境中不斷出現(xiàn)的問題磺芭,然后描述了該問題
的解決方案的核心赁炎,通過這種方式,我們可以無數(shù)次地重用那些已有的成功的
解決方案钾腺,無須再重復相同的工作徙垫〖タ悖”
——《建筑的永恒之道》by Christopher Alexander

軟件設計模式又從何而來?

四人組(Gang of Four)簡稱GoF


image.png

GoF將模式的概念引入軟件工程領域,這標志著軟件模式的誕生松邪。軟件
模式(Software Patterns)是將模式的一般概念應用于軟件開發(fā)領域坞琴,即軟件開
發(fā)的總體指導思路或參照樣板。軟件模式并非僅限于設計模式逗抑,還包括架構(gòu)模
式剧辐、分析模式和過程模式等,實際上邮府,在軟件開發(fā)生命周期的每一個階段都存
在著一些被認同的模式荧关。
軟件模式與具體的應用領域無關,也就是說無論你從事的是移動應用開
發(fā)褂傀、桌面應用開發(fā)忍啤、Web應用開發(fā)還是嵌入式軟件的開發(fā),都可以使用軟件模
式仙辟。無論你是使用Java同波、C#、Objective-C叠国、VB.net未檩、Smalltalk等純面向?qū)ο?br> 編程語言,還是使用C++粟焊、PHP冤狡、Delphi、JavaScript等可支持面向?qū)ο缶幊?br> 的語言项棠,你都需要了解軟件設計模式悲雳!

“軟件設計模式(Design Pattern)是一套被反復使用、多數(shù)人知曉的香追、經(jīng)過
分類編目的合瓢、代碼設計經(jīng)驗的總結(jié),使用設計模式是為了可重用代碼翅阵、讓代碼
更容易被他人理解并且保證代碼可靠性歪玲。”

設計模式用來干什么掷匠?

在一定的環(huán)境下,用固定的套路解決問題

設計模式種類

  • 創(chuàng)建型(Creational)模式: 如何創(chuàng)建對象岖圈;
  • 結(jié)構(gòu)型(Structural )模式: 如何實現(xiàn)類或?qū)ο蟮慕M合讹语;
  • 行為型(Behavioral)模式: 類或?qū)ο笤鯓咏换ヒ约霸鯓臃峙渎氊煛?/li>

設計模式總覽

image.png

設計模式原則

原則的目的:高內(nèi)聚,低耦合


image.png

列舉案例

1.開閉原則

image.png
#include <iostream>
#include    <iostream>
using namespace std;
/*
如果想要再添加新功能蜂科,需要再次添加新的成員函數(shù)
這樣的話顽决,會使類越來越臃腫短条。
    */
class   BankWorker  {
public:
    void    save()  {

    cout    <<  "存款"    <<  endl;
    }
void    transfer()  {
        cout    <<  "轉(zhuǎn)賬"    <<  endl;
    }
void    pay()   {
        cout    <<  "交費"    <<  endl;

    }
};
//修改后新增業(yè)務只需要繼承抽象類
class   AbBankWorker    {
public:
/*  純虛函數(shù) ?來抽象 銀?業(yè)務員的業(yè)務  */
    virtual void    doBusiness()    =   0;
};

class   saveBankWorker  :   public  AbBankWorker    {
public:
    virtual void    doBusiness()    {
        cout    <<  "存款"    <<  endl;
    }
};
class   transBankWorker :   public  AbBankWorker    {
public:
    virtual void    doBusiness()    {
        cout    <<  "轉(zhuǎn)賬"    <<  endl;
    }
};
class   payBankWorker   :   public  AbBankWorker    {
    virtual void    doBusiness()    {
        cout    <<  "付款"    <<  endl;
    }
};
int main() {
    //如果需要掛失,改密碼等又需要去修改這個類
    BankWorker bankWorker;
    bankWorker.pay();
    bankWorker.transfer();
    bankWorker.save();

    AbBankWorker *abBankWorker;
    abBankWorker=new saveBankWorker();
    abBankWorker->doBusiness();
    abBankWorker=new transBankWorker();
    abBankWorker->doBusiness();
    abBankWorker=new payBankWorker();
    abBankWorker->doBusiness();
    
    return 0;
}

這樣才菠,如果我們給銀行業(yè)務員添加業(yè)務茸时,那么無需修改原來的類中代碼,
而是通過拓展添加類的方式來搞定赋访,實際上是利用了多態(tài)的特性可都,這樣就符合
了開閉原則。

依賴倒置原則

image.png

傳統(tǒng)的過程設計傾向于使用高層次的模塊依賴低層次的模塊蚓耽,抽象層依賴于具體的層次渠牲。


image.png

傳統(tǒng)的設計模式通常是自頂向下逐級依賴,這樣步悠,底層模塊签杈,中間層模
塊和高層模塊的耦合度極高,若任意修改其中的一個鼎兽,很容易導致全面積的修
改答姥,非常麻煩,那么依賴倒轉(zhuǎn)原則利用多態(tài)的先天特性谚咬,對中間抽象層進行依
賴鹦付,這樣,底層和高層之間進行了解耦合序宦。

/*
抽象層,    中間層
    */
class   HardDisk    {
public:
    virtual void    work()  =   0;
};
class   Memory  {
public:
    virtual void    work()  =   0;
};
class   Cpu {
public:
    virtual void    work()  =   0;
};
class   Computer {
    public:
     Computer(Cpu *cpu, Memory *mem, HardDisk *hard) {
        this->cpu = cpu;
        this->memory = mem;
        this->harddisk = hard;
    }

//?層的業(yè)務邏輯,并不關?是哪個?商的睁壁,只是對抽象層的每個硬件的業(yè)務。
    void work() {
        cpu->work();
        memory->work();
        harddisk->work();
    }

private:
    HardDisk *harddisk = NULL;
    Memory *memory = NULL;
    Cpu *cpu = NULL;
};
//實現(xiàn)層互捌, 只需要依賴中間抽象層潘明,實現(xiàn)抽象層中的?法
class   XiJieHardDisk:public HardDisk   {
public:
    virtual void work() {
        cout    <<  "希捷硬盤?作中……" <<  endl;
    }
};
class   IntelCpu:public Cpu {
public  :
    virtual void work() {
        cout    <<  "intel  CPU ?作中……"  <<  endl;
    }
};
class   JSDMemory   :public Memory  {
public:
    virtual void    work()  {
        cout    <<  "?斯頓內(nèi)存?作中……"    <<  endl;
    }
};
int main() {
    XiJieHardDisk *xiJieHardDisk=new XiJieHardDisk();
    IntelCpu *intelCpu=new IntelCpu();
    JSDMemory *jsdMemory=new JSDMemory();
    Computer computer(intelCpu,jsdMemory,xiJieHardDisk);
    computer.work();
    return 0;
}

合成復用模式

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>

using namespace std;
class Cat
{
public:
    void sleep() {
        cout << " 小貓睡覺了" << endl;
    }
};

//向給貓?zhí)砑右粋€功能, 創(chuàng)建一個新的貓 既能夠睡覺秕噪,又能吃東西
//通過繼承的方式完成
class AdvCat :public Cat{
public:
    void eatAndSleep() {
        cout << "吃東西" << endl;
        sleep();
    }
};


//使用組合的方式來添加小貓的吃東西方法
//使用組合的方式钳降,降低了AdvCat2 和Cat的耦合度, 跟Cat的父類沒有任何關系腌巾,
//只跟Cat的sleep方法有關系
class AdvCat2
{
public:
    AdvCat2(Cat *cat)
    {
        this->cat = cat;
    }

    void eatAndSleep() {
        cout << "吃東西" << endl;
        cat->sleep();
    }
private:
    Cat *cat;
};


int main(void)
{
    Cat c;
    c.sleep();

    AdvCat ac;
    ac.eatAndSleep();

    cout << "----- " << endl;

    AdvCat2 ac2(&c);
    ac2.eatAndSleep();
    
    return 0;
}

總結(jié):
以上是設計模式的描述遂填,下面會有三篇文章來詳細說明列舉
創(chuàng)造型模式,結(jié)構(gòu)型模式澈蝙,行為型模式

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吓坚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灯荧,更是在濱河造成了極大的恐慌礁击,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哆窿,居然都是意外死亡链烈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門挚躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來强衡,“玉大人,你說我怎么就攤上這事码荔′銮冢” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵目胡,是天一觀的道長锯七。 經(jīng)常有香客問我,道長誉己,這世上最難降的妖魔是什么眉尸? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮巨双,結(jié)果婚禮上噪猾,老公的妹妹穿的比我還像新娘。我一直安慰自己筑累,他們只是感情好袱蜡,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慢宗,像睡著了一般坪蚁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镜沽,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天敏晤,我揣著相機與錄音,去河邊找鬼缅茉。 笑死嘴脾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蔬墩。 我是一名探鬼主播译打,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拇颅!你這毒婦竟也來了奏司?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤樟插,失蹤者是張志新(化名)和其女友劉穎结澄,沒想到半個月后哥谷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岸夯,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡麻献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猜扮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勉吻。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旅赢,靈堂內(nèi)的尸體忽然破棺而出齿桃,到底是詐尸還是另有隱情,我是刑警寧澤煮盼,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站香到,受9級特大地震影響报破,放射性物質(zhì)發(fā)生泄漏充易。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稿静。 院中可真熱鬧自赔,春花似錦、人聲如沸润脸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爆价。三九已至铭段,卻和暖如春序愚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爸吮。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工锰霜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桐早,地道東北人勘畔。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓炫七,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侠驯。 傳聞我的和親對象是個殘疾皇子吟策,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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