1.設計模式概述
如果把修習軟件開發(fā)當作武功修煉的話,那么可以分為內(nèi)功和外功
招式:
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
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>
設計模式總覽
設計模式原則
原則的目的:高內(nèi)聚,低耦合
列舉案例
1.開閉原則
#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)的特性可都,這樣就符合
了開閉原則。
依賴倒置原則
傳統(tǒng)的過程設計傾向于使用高層次的模塊依賴低層次的模塊蚓耽,抽象層依賴于具體的層次渠牲。
傳統(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)型模式澈蝙,行為型模式