面向?qū)ο笤O(shè)計(jì)原則 原則的目的 面向?qū)ο笤O(shè)計(jì)原創(chuàng)表 單一職責(zé)原則案例 開閉原則 案例 依賴倒轉(zhuǎn)原則 案例
面向?qū)ο笤O(shè)計(jì)原則
成都創(chuàng)新互聯(lián)專注于林周企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站開發(fā)。林周網(wǎng)站建設(shè)公司,為林周等地區(qū)提供建站服務(wù)。全流程按需求定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)對(duì)于面向?qū)ο筌浖到y(tǒng)的設(shè)計(jì)而言,在支持可維護(hù)性的同時(shí),提高系統(tǒng)的可復(fù)用性是一個(gè)至關(guān)重要的問題,如何同時(shí)提高一個(gè)軟件系統(tǒng)的可維護(hù)性和可復(fù)用性是面向?qū)ο笤O(shè)計(jì)需要解決的核心問題之一。在面向?qū)ο笤O(shè)計(jì)中,可維護(hù)性的復(fù)用是以設(shè)計(jì)原則為基礎(chǔ)的。每一個(gè)原則都蘊(yùn)含一些面向?qū)ο笤O(shè)計(jì)的思想,可以從不同的角度提升一個(gè)軟件結(jié)構(gòu)的設(shè)計(jì)水平。
面向?qū)ο笤O(shè)計(jì)原則為支持可維護(hù)性復(fù)用而誕生,這些原則蘊(yùn)含在很多設(shè)計(jì)模式中,它們是從許多設(shè)計(jì)方案中總結(jié)出的指導(dǎo)性原則。面向?qū)ο笤O(shè)計(jì)原則也是我們用于評(píng)價(jià)一個(gè)設(shè)計(jì)模式的使用效果的重要指標(biāo)之一。
原則的目的: 高內(nèi)聚,低耦合
面向?qū)ο笤O(shè)計(jì)原創(chuàng)表
1,單一職責(zé)原則:
如果將每個(gè)類的方法分離出來,就能夠保證每個(gè)類的指針單一.
提高了安全性.
提高了可維護(hù)性
提高了可讀性.
單一原則,示范1,
chunli@linux:~/design$ cat main.cpp #includeusing namespace std; class clothes { public: void working() { cout << "穿正式的衣服" < 但是這個(gè)項(xiàng)目,老程序員走了,新的程序員接手,要求上班穿休閑的衣服
于是代碼就變成了這樣的:
chunli@linux:~/design$ g++ main.cpp && ./a.out 穿正式的衣服 穿正式的衣服 chunli@linux:~/design$ cat main.cpp #includeusing namespace std; class clothes { public: void working() { cout << "穿正式的衣服" < 后來又有新的程序員看著這兩行的功能是一樣 的,于是又改成這樣的
chunli@linux:~/design$ cat main.cpp #includeusing namespace std; class clothes { public: void working() { cout << "穿正式的衣服" < 再來新手接這樣的項(xiàng)目就徹底暈了.....
寫成單一原則,這樣就不用搞來搞去了,不要修改已經(jīng)寫好的代碼.
chunli@linux:~/design$ cat main.cpp #includeusing namespace std; class ClothesWoring { public: void style() { cout << "穿正裝" << endl; } }; class ClothesShoping { public: void style() { cout << "穿休閑裝" << endl; } }; int main() { ClothesShoping cs; ClothesWoring cw; cs.style(); cw.style(); return 0; } chunli@linux:~/design$ g++ main.cpp && ./a.out 穿休閑裝 穿正裝 chunli@linux:~/design$ 單一職責(zé)原則:
如果將每個(gè)類的方法分離出來,就能夠保證每個(gè)類的指針單一.
提高了安全性.
提高了可維護(hù)性
提高了可讀性.
2,開閉原則案例:
類的改動(dòng)是添加代碼,而不是修改源代碼
原始的代碼: chunli@linux:~$ cat main.cpp //設(shè)計(jì)模式 開閉原則 //定義:類的改動(dòng)是增加代碼進(jìn)行的,而不是修改源代碼 #includeusing namespace std; class Banker { public: void save() { cout << "存款" << endl; } void pay() { cout <<"付款" << endl; } void transfer() { cout << "轉(zhuǎn)賬 " < 代碼優(yōu)化,
chunli@linux:~$ cat main.cpp //設(shè)計(jì)模式 開閉原則 //定義:類的改動(dòng)是增加代碼進(jìn)行的,而不是修改源代碼 #includeusing namespace std; ////////////////////////////////////////////////////////////////// class AbstractBanker //抽象類 { public: //AbstractBanker() = 0; virtual ~AbstractBanker(){}; virtual void work() = 0;//接口 }; // // // // // // // // // // // // // // // // // // // // // // class SaveBanker:public AbstractBanker //存款,繼承抽象類 { public: virtual void work() { cout << "存款方法" << endl; } }; class PayBanker:public AbstractBanker //支付,繼承抽象類 { public: virtual void work() { cout << "支付方法" << endl; } }; class TransferBanker:public AbstractBanker //轉(zhuǎn)賬,繼承抽象類 { public: virtual void work() { cout << "轉(zhuǎn)賬方法" << endl; } }; ///////////////////////////////////////////////////////// int main() { SaveBanker* sb = new SaveBanker; sb->work(); delete sb; PayBanker *pb = new PayBanker; pb->work(); delete sb; TransferBanker *tb = new TransferBanker; tb->work(); delete tb; return 0; } chunli@linux:~$ g++ main.cpp -Wall && ./a.out 存款方法 支付方法 轉(zhuǎn)賬方法 chunli@linux:~$ 新增 基金辦理 需求,不再需要修改源代碼
chunli@linux:~$ cat main.cpp //設(shè)計(jì)模式 開閉原則 //定義:類的改動(dòng)是增加代碼進(jìn)行的,而不是修改源代碼 #includeusing namespace std; ////////////////////////////////////////////////////////////////// class AbstractBanker //抽象類 { public: //AbstractBanker() = 0; virtual ~AbstractBanker(){}; virtual void work() = 0;//接口 }; // // // // // // // // // // // // // // // // // // // // // // class SaveBanker:public AbstractBanker //存款,繼承抽象類 { public: virtual void work() { cout << "存款方法" << endl; } }; class PayBanker:public AbstractBanker //支付,繼承抽象類 { public: virtual void work() { cout << "支付方法" << endl; } }; class TransferBanker:public AbstractBanker //轉(zhuǎn)賬,繼承抽象類 { public: virtual void work() { cout << "轉(zhuǎn)賬方法" << endl; } }; class FundBanker:public AbstractBanker //新增基金,繼承抽象類,不需要修改其他類的源代碼 { public: virtual void work() { cout << "基金辦理" << endl; } }; ///////////////////////////////////////////////////////// int main() { SaveBanker* sb = new SaveBanker; sb->work(); delete sb; PayBanker *pb = new PayBanker; pb->work(); delete sb; TransferBanker *tb = new TransferBanker; tb->work(); delete tb; FundBanker *fb = new FundBanker; fb->work(); delete fb; return 0; } chunli@linux:~$ g++ main.cpp -Wall && ./a.out 存款方法 支付方法 轉(zhuǎn)賬方法 基金辦理 chunli@linux:~$ 總結(jié):
開閉原則: 安全穩(wěn)定,可維護(hù).
3,依賴倒轉(zhuǎn)原則案例:
張三上班開奔馳
chunli@linux:~$ cat main.cpp //設(shè)計(jì)模式:依賴倒轉(zhuǎn) #includeusing namespace std; class Benz { public: void run() { cout << "奔馳啟動(dòng)了" << endl; } }; class Zhangsan { public: void driveBenz(Benz *car) { cout << "張三 開車上班"<< endl; car->run(); } }; int main() { Benz *benz = new Benz; Zhangsan *z3 = new Zhangsan; z3->driveBenz(benz); return 0; } chunli@linux:~$ g++ main.cpp -Wall && ./a.out 張三 開車上班 奔馳啟動(dòng)了 chunli@linux:~$ 張三還可能開寶馬上班
chunli@linux:~$ cat main.cpp //設(shè)計(jì)模式:依賴倒轉(zhuǎn) #includeusing namespace std; class Benz { public: void run() { cout << "奔馳啟動(dòng)了" << endl; } }; class BMW { public: void run() { cout << "寶馬啟動(dòng)了" << endl; } }; class Zhangsan { public: void driveBenz(Benz *car) { cout << "張三 開車上班"<< endl; car->run(); } void driveBMW(BMW *car) { cout << "張三 開車上班"<< endl; car->run(); } }; int main() { Benz *benz = new Benz; Zhangsan *z3 = new Zhangsan; z3->driveBenz(benz); BMW *bmw = new BMW; z3->driveBMW(bmw); return 0; } chunli@linux:~$ g++ main.cpp -Wall && ./a.out 張三 開車上班 奔馳啟動(dòng)了 張三 開車上班 寶馬啟動(dòng)了 chunli@linux:~$ -------------------------------
業(yè)務(wù)逐漸復(fù)雜,那大眾呢?越來越多的的呢?
越來越亂............
------------------------------------------
將業(yè)務(wù)層和實(shí)現(xiàn)層 通過抽象層 隔離,解耦合
chunli@linux:~$ cat main.cpp //設(shè)計(jì)模式:依賴倒轉(zhuǎn) //將業(yè)務(wù)層和實(shí)現(xiàn)層 通過抽象層 隔離,解耦合 #includeusing namespace std; //////////抽象層 車 人 //////////////////////////// class Car { public: virtual void run() = 0; virtual ~Car(){} }; class Driver { public: virtual void drive(Car *car) = 0; virtual ~Driver(){} }; //////// 實(shí)現(xiàn)層 ///////////////////////// class ZhangSan:public Driver { public: virtual void drive(Car *car) { cout << "張三開車上班了" << endl; car->run(); } }; class LiSi:public Driver { public: virtual void drive(Car *car) { cout << "李四 開車上班了" << endl; car->run(); } }; class Benz:public Car { public: virtual void run() { cout << "Benz 啟動(dòng)了" << endl; }; }; class BMW:public Car { public: virtual void run() { cout << "BMW 啟動(dòng)了" << endl; }; }; ///////////// 主函數(shù) //////////////////////////////////// int main() { //讓張三開奔馳 Car * benz = new Benz; Driver *zhangsan = new ZhangSan; zhangsan->drive(benz); //讓李四上班 開寶馬 Car *bmw = new BMW; Driver *lisi = new LiSi; lisi->drive(bmw); return 0; } chunli@linux:~$ g++ main.cpp -Wall && ./a.out 張三開車上班了 Benz 啟動(dòng)了 李四 開車上班了 BMW 啟動(dòng)了 chunli@linux:~$ 依賴倒轉(zhuǎn)原則,電腦組裝案例:
抽象層:CPU,顯卡,內(nèi)存
框架層:組合CPU,顯卡,內(nèi)存
chunli@linux:~$ cat main.cpp //設(shè)計(jì)模式:依賴倒轉(zhuǎn),電腦組裝案例 #includeusing namespace std; //抽象類 class CPU { public: virtual void caculate() = 0; virtual ~CPU(){} }; class Card { public: virtual void display() = 0; virtual ~Card(){} }; class Memmory { public: virtual void storage() = 0; virtual ~Memmory(){} }; //架構(gòu)類 class Computer { public: Computer(CPU* cpu,Card* card,Memmory* mem) { this->cpu = cpu; this->card = card; this->mem = mem; } virtual ~Computer() {}; void work() { cpu->caculate(); card->display(); mem->storage(); } private: CPU *cpu; Card *card; Memmory* mem; }; //////實(shí)現(xiàn)層////////////////////////////////// class IntelCPU:public CPU { public: virtual void caculate() { cout << "intel CPU working" << endl; } }; class NvidiaCard:public Card { public: virtual void display() { cout << "nvidia card working" << endl; } }; class KingSton:public Memmory { public: virtual void storage() { cout << "KingSton mem working" << endl; } }; ///////// 主函數(shù) /////////////////// int main() { CPU* cpu = new IntelCPU; Card* card = new NvidiaCard; Memmory* mem = new KingSton; Computer* computer = new Computer(cpu,card,mem); computer->work(); return 0; } chunli@linux:~$ g++ main.cpp -Wall && ./a.out intel CPU working nvidia card working KingSton mem working chunli@linux:~$ 里氏代換原則:略
接口隔離原則:
合成復(fù)用原則:繼承,組合,依賴
能用組合不用繼承
迪米特法則:
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享題目:設(shè)計(jì)模式2面向?qū)ο笤O(shè)計(jì)原則-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://weahome.cn/article/jchps.html