物件導向五大基本原則
一、單一職責原則
一個類應該僅有一個引起它變化的原因(最簡單,最容易理解卻最不容易做到的一個設計原則)
職員類例子:比如在職員類裡,將工程師、銷售人員、銷售經理這些情況都放在職員類裡考慮,其結果將會非常混亂,在這個假設下,職員類裡的每個方法都要if else判斷是哪種情況,從類結構上來說將會十分臃腫,並且上述三種的職員型別,不論哪一種發生需求變化,都會改變職員類!這個是大家所不願意看到的!
二、開放封閉原則
一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。模組應儘量在不修改原(是“原”,指原來的程式碼)程式碼的情況下進行擴充套件。通過介面或者抽象類約束擴充套件
//未實現開放封閉
public class BankProcess
{ //存款
public void Deposite(){}
//取款
public void Withdraw(){ }
//轉賬
public void Transfer(){}
}
//實現了開放封閉
public interface IBankProcess{ void Process();}
public class DepositProcess : IBankProcess
{
public void Process()
{ //辦理存款業務
Console.WriteLine("Process Deposit");
}
}
public class WithDrawProcess : IBankProcess
{
public void Process()
{ //辦理取款業務
Console.WriteLine("Process WithDraw");
}
}
public class TransferProcess : IBankProcess
{
public void Process()
{ //辦理轉賬業務
Console.WriteLine("Process Transfer");
}
}
這樣以後在增加某個業務的時候,只需要擴充套件相應的類就可以了,不需要修改程式碼
三、裡式代換原則
派生類(子類)物件能夠替換其基類(父類)物件被呼叫
里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。
四、依賴倒轉原則
面向介面程式設計。
三句話:高層模組不應該依賴低層模組,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。
場景是這樣的,母親給孩子講故事,只要給她一本書,她就可以照著書給孩子講故事了。程式碼如下:
class Book{
public String getContent(){
return "很久很久以前有一個阿拉伯的故事……";
}
}
class Mother{
public void narrate(Book book){
System.out.println("媽媽開始講故事");
System.out.println(book.getContent());
}
}
public class Client{
public static void main(String[] args){
Mother mother = new Mother();
mother.narrate(new Book());
}
}
假如有一天,需求變成這樣:不是給書而是給一份報紙,讓這位母親講一下報紙上的故事,報紙的程式碼如下:class Newspaper{
public String getContent(){
return "林書豪38+7領導尼克斯擊敗湖人……";
}
}
這位母親卻辦不到,因為她居然不會讀報紙上的故事,這太荒唐了,只是將書換成報紙,居然必須要修改Mother才能讀。假如以後需求換成雜誌呢?換成網頁呢?還要不斷地修改Mother,這顯然不是好的設計。原因就是Mother與Book之間的耦合性太高了,必須降低他們之間的耦合度才行。
我們引入一個抽象的介面IReader。讀物,只要是帶字的都屬於讀物:
interface IReader{
public String getContent();
}
class Newspaper implements IReader {
public String getContent(){
return "林書豪17+9助尼克斯擊敗老鷹……";
}
}
class Book implements IReader{
public String getContent(){
return "很久很久以前有一個阿拉伯的故事……";
}
}
class Mother{
public void narrate(IReader reader){
System.out.println("媽媽開始講故事");
System.out.println(reader.getContent());
}
}
public class Client{
public static void main(String[] args){
Mother mother = new Mother();
mother.narrate(new Book());
mother.narrate(new Newspaper());
}
}
這樣修改後,無論以後怎樣擴充套件Client類,都不需要再修改Mother類了。這只是一個簡單的例子,實際情況中,代表高層模組的Mother類將負責完成主要的業務邏輯,一旦需要對它進行修改,引入錯誤的風險極大。所以遵循依賴倒置原則可以降低類之間的耦合性,提高系統的穩定性,降低修改程式造成的風險。
採用依賴倒置原則給多人並行開發帶來了極大的便利,比如上例中,原本Mother類與Book類直接耦合時,Mother類必須等Book類編碼完成後才可以進行編碼,因為Mother類依賴於Book類。修改後的程式則可以同時開工,互不影響,因為Mother與Book類一點關係也沒有。參與協作開發的人越多、專案越龐大,採用依賴導致原則的意義就越重大。現在很流行的TDD開發模式就是依賴倒置原則最成功的應用。
五、介面隔離原則
這個原則的意思是:使用多個專門的介面比使用單個介面要好的多!
相關文章
- 物件導向之七大基本原則(javaScript)物件JavaScript
- 設計模式之——物件導向5大基本原則設計模式物件
- 物件導向基本原則物件
- SOLID:物件導向設計的五個基本原則Solid物件
- 物件導向程式設計的基本原則物件程式設計
- PHP物件導向程式設計基本原則PHP物件程式設計
- 物件導向設計的幾個基本原則物件
- 物件導向OO原則物件
- SOLID:物件導向設計的前五項原則Solid物件
- 物件導向設計原則物件
- C++ 物件導向的三大特性和五個原則C++物件
- 物件導向之 開閉原則物件
- 物件導向的設計原則物件
- 物件導向設計原則概述物件
- 物件導向設計(OOD)原則物件
- PHP 物件導向 (五)靜態方法PHP物件
- 物件導向-物件導向思想物件
- The Principles of OOD 物件導向設計原則物件
- 物件導向的基本設計原則物件
- 物件導向設計原則和模式物件模式
- 2.物件導向設計原則物件
- 開閉原則——物件導向程式設計原則物件程式設計
- 物件導向設計原則之開閉原則物件
- 《JavaScript物件導向精要》之五:繼承JavaScript物件繼承
- 物件導向三大特性五大原則 + 低耦合高內聚物件
- 沒錯,這就是物件導向程式設計(設計模式)需要遵循的 6 個基本原則物件程式設計設計模式
- 菜鳥成長系列-物件導向的四大基礎特性物件
- Java中物件導向的設計原則Java物件
- 物件導向的六大原則物件
- 物件導向設計6大原則物件
- 不止於物件導向的SOLID原則物件Solid
- 物件導向的編碼設計原則物件
- 物件導向設計原則之迪米特法則物件
- 物件導向設計原則之合成複用原則物件
- 物件導向設計原則之介面隔離原則物件
- 物件導向設計原則之里氏代換原則物件
- 深入理解物件導向,物件導向3個特性7個原則6種關係物件
- 物件導向不是計算機程式設計的基本原子物件計算機程式設計