面向?qū)ο笤O(shè)計(jì)原則 原則的目的 面向?qū)ο笤O(shè)計(jì)原創(chuàng)表 單一職責(zé)原則案例 開(kāi)閉原則 案例 依賴(lài)倒轉(zhuǎn)原則 案例
面向?qū)ο笤O(shè)計(jì)原則
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、臨安ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的臨安網(wǎng)站制作公司
對(duì)于面向?qū)ο筌浖到y(tǒng)的設(shè)計(jì)而言,在支持可維護(hù)性的同時(shí),提高系統(tǒng)的可復(fù)用性是一個(gè)至關(guān)重要的問(wèn)題,如何同時(shí)提高一個(gè)軟件系統(tǒng)的可維護(hù)性和可復(fù)用性是面向?qū)ο笤O(shè)計(jì)需要解決的核心問(wèn)題之一。在面向?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è)類(lèi)的方法分離出來(lái),就能夠保證每個(gè)類(lèi)的指針單一.
提高了安全性.
提高了可維護(hù)性
提高了可讀性.
單一原則,示范1,
chunli@linux:~/design$ cat main.cpp
#include <iostream>
using namespace std;
class clothes
{
public:
void working()
{
cout << "穿正式的衣服" <<endl;
}
void shoping()
{
cout << "穿休閑的衣服" <<endl;
}
};
int main()
{
clothes c ;
c.working();
c.shoping();
return 0;
}
chunli@linux:~/design$ g++ main.cpp && ./a.out
穿正式的衣服
穿休閑的衣服
chunli@linux:~/design$但是這個(gè)項(xiàng)目,老程序員走了,新的程序員接手,要求上班穿休閑的衣服
于是代碼就變成了這樣的:
chunli@linux:~/design$ g++ main.cpp && ./a.out
穿正式的衣服
穿正式的衣服
chunli@linux:~/design$ cat main.cpp
#include <iostream>
using namespace std;
class clothes
{
public:
void working()
{
cout << "穿正式的衣服" <<endl;
}
void shoping()
{
cout << "穿正式的衣服" <<endl;
}
};
int main()
{
clothes c ;
c.working();
c.shoping();
return 0;
}
chunli@linux:~/design$ g++ main.cpp && ./a.out
穿正式的衣服
穿正式的衣服
chunli@linux:~/design$后來(lái)又有新的程序員看著這兩行的功能是一樣 的,于是又改成這樣的
chunli@linux:~/design$ cat main.cpp
#include <iostream>
using namespace std;
class clothes
{
public:
void working()
{
cout << "穿正式的衣服" <<endl;
}
void shoping()
{
cout << "穿正式的衣服" <<endl;
}
};
int main()
{
clothes c ;
c.working();
c.working();
return 0;
}
chunli@linux:~/design$ g++ main.cpp && ./a.out
穿正式的衣服
穿正式的衣服
chunli@linux:~/design$再來(lái)新手接這樣的項(xiàng)目就徹底暈了.....
寫(xiě)成單一原則,這樣就不用搞來(lái)搞去了,不要修改已經(jīng)寫(xiě)好的代碼.
chunli@linux:~/design$ cat main.cpp
#include <iostream>
using 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è)類(lèi)的方法分離出來(lái),就能夠保證每個(gè)類(lèi)的指針單一.
提高了安全性.
提高了可維護(hù)性
提高了可讀性.
2,開(kāi)閉原則案例:
類(lèi)的改動(dòng)是添加代碼,而不是修改源代碼
原始的代碼:
chunli@linux:~$ cat main.cpp
//設(shè)計(jì)模式 開(kāi)閉原則
//定義:類(lèi)的改動(dòng)是增加代碼進(jìn)行的,而不是修改源代碼
#include<iostream>
using namespace std;
class Banker
{
public:
void save()
{
cout << "存款" << endl;
}
void pay()
{
cout <<"付款" << endl;
}
void transfer()
{
cout << "轉(zhuǎn)賬 " <<endl;
}
};
int main()
{
Banker B;
B.save();
B.pay();
B.transfer();
return 0;
}
chunli@linux:~$ g++ main.cpp && ./a.out
存款
付款
轉(zhuǎn)賬
chunli@linux:~$代碼優(yōu)化,
chunli@linux:~$ cat main.cpp
//設(shè)計(jì)模式 開(kāi)閉原則
//定義:類(lèi)的改動(dòng)是增加代碼進(jìn)行的,而不是修改源代碼
#include<iostream>
using namespace std;
//////////////////////////////////////////////////////////////////
class AbstractBanker //抽象類(lèi)
{
public:
//AbstractBanker() = 0;
virtual ~AbstractBanker(){};
virtual void work() = 0;//接口
};
// // // // // // // // // // // // // // // // // // // // // //
class SaveBanker:public AbstractBanker //存款,繼承抽象類(lèi)
{
public:
virtual void work()
{
cout << "存款方法" << endl;
}
};
class PayBanker:public AbstractBanker //支付,繼承抽象類(lèi)
{
public:
virtual void work()
{
cout << "支付方法" << endl;
}
};
class TransferBanker:public AbstractBanker //轉(zhuǎn)賬,繼承抽象類(lèi)
{
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ì)模式 開(kāi)閉原則
//定義:類(lèi)的改動(dòng)是增加代碼進(jìn)行的,而不是修改源代碼
#include<iostream>
using namespace std;
//////////////////////////////////////////////////////////////////
class AbstractBanker //抽象類(lèi)
{
public:
//AbstractBanker() = 0;
virtual ~AbstractBanker(){};
virtual void work() = 0;//接口
};
// // // // // // // // // // // // // // // // // // // // // //
class SaveBanker:public AbstractBanker //存款,繼承抽象類(lèi)
{
public:
virtual void work()
{
cout << "存款方法" << endl;
}
};
class PayBanker:public AbstractBanker //支付,繼承抽象類(lèi)
{
public:
virtual void work()
{
cout << "支付方法" << endl;
}
};
class TransferBanker:public AbstractBanker //轉(zhuǎn)賬,繼承抽象類(lèi)
{
public:
virtual void work()
{
cout << "轉(zhuǎn)賬方法" << endl;
}
};
class FundBanker:public AbstractBanker //新增基金,繼承抽象類(lèi),不需要修改其他類(lèi)的源代碼
{
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é):
開(kāi)閉原則:安全穩(wěn)定,可維護(hù).
3,依賴(lài)倒轉(zhuǎn)原則案例:
張三上班開(kāi)奔馳
chunli@linux:~$ cat main.cpp
//設(shè)計(jì)模式:依賴(lài)倒轉(zhuǎn)
#include<iostream>
using namespace std;
class Benz
{
public:
void run()
{
cout << "奔馳啟動(dòng)了" << endl;
}
};
class Zhangsan
{
public:
void driveBenz(Benz *car)
{
cout << "張三 開(kāi)車(chē)上班"<< 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
張三 開(kāi)車(chē)上班
奔馳啟動(dòng)了
chunli@linux:~$張三還可能開(kāi)寶馬上班
chunli@linux:~$ cat main.cpp
//設(shè)計(jì)模式:依賴(lài)倒轉(zhuǎn)
#include<iostream>
using 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 << "張三 開(kāi)車(chē)上班"<< endl;
car->run();
}
void driveBMW(BMW *car)
{
cout << "張三 開(kāi)車(chē)上班"<< 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
張三 開(kāi)車(chē)上班
奔馳啟動(dòng)了
張三 開(kāi)車(chē)上班
寶馬啟動(dòng)了
chunli@linux:~$-------------------------------
業(yè)務(wù)逐漸復(fù)雜,那大眾呢?越來(lái)越多的的呢?
越來(lái)越亂............
------------------------------------------
將業(yè)務(wù)層和實(shí)現(xiàn)層 通過(guò)抽象層 隔離,解耦合
chunli@linux:~$ cat main.cpp
//設(shè)計(jì)模式:依賴(lài)倒轉(zhuǎn)
//將業(yè)務(wù)層和實(shí)現(xiàn)層 通過(guò)抽象層 隔離,解耦合
#include<iostream>
using namespace std;
//////////抽象層 車(chē) 人 ////////////////////////////
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 << "張三開(kāi)車(chē)上班了" << endl;
car->run();
}
};
class LiSi:public Driver
{
public:
virtual void drive(Car *car)
{
cout << "李四 開(kāi)車(chē)上班了" << 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()
{
//讓張三開(kāi)奔馳
Car * benz = new Benz;
Driver *zhangsan = new ZhangSan;
zhangsan->drive(benz);
//讓李四上班 開(kāi)寶馬
Car *bmw = new BMW;
Driver *lisi = new LiSi;
lisi->drive(bmw);
return 0;
}
chunli@linux:~$ g++ main.cpp -Wall && ./a.out
張三開(kāi)車(chē)上班了
Benz 啟動(dòng)了
李四 開(kāi)車(chē)上班了
BMW 啟動(dòng)了
chunli@linux:~$依賴(lài)倒轉(zhuǎn)原則,電腦組裝案例:
抽象層:CPU,顯卡,內(nèi)存
框架層:組合CPU,顯卡,內(nèi)存
chunli@linux:~$ cat main.cpp
//設(shè)計(jì)模式:依賴(lài)倒轉(zhuǎn),電腦組裝案例
#include<iostream>
using namespace std;
//抽象類(lèi)
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)類(lèi)
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ù)用原則:繼承,組合,依賴(lài)
能用組合不用繼承
迪米特法則:
文章標(biāo)題:設(shè)計(jì)模式2面向?qū)ο笤O(shè)計(jì)原則
瀏覽路徑:http://www.chinadenli.net/article40/gshgeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、定制網(wǎng)站、網(wǎng)站策劃、企業(yè)網(wǎng)站制作、面包屑導(dǎo)航、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)