單一職責原則linux
里氏替換原則程序員
依賴倒置原則數據庫
接口隔離原則編程
迪米特原則ubuntu
開閉原則windows
public class People { public void playCnBlogs () { System.out.println("刷博客"); } public void doSports () { System.out.println("打乒乓球"); } public void work () { System.out.println("工做"); } }
刷博客園,這是博主的職責設計模式
打乒乓球,這是業餘運動愛好者的職責網絡
工做,這是「普普統統上班族」的職責(彷佛暴露了什麼)架構
// 知乎er public interface Blogger { public void playCnBlogs(); } // 上班族 public interface OfficeWorkers { public void work(); } // 業餘運動愛好者 public interface AmateurPlayer { public void doSports(); }
public class People implements Blogger,AmateurPlayer,OfficeWorkers{ public void playCnBlogs () { System.out.println("刷博客園"); } public void doSports () { System.out.println("打乒乓球"); } public void work () { System.out.println("工做"); } }
public class Index { public static void main (String args []) { People people = new People(); Blogger blogger = new People(); blogger.playCnBlogs(); // 輸出:刷博客園 OfficeWorkers workers = new People(); workers.work(); // 輸出: 工做 AmateurPlayer players = new People(); players.doSports(); // 輸出:打乒乓球 } }
public abstract class Father { // 認真工做 public abstract void work(); // 其餘方法 }
子類ide
public class Son extends Father { @Override public void work() { // 我實現了爸爸的work方法,旦我什麼也不作! } }
子類雖然表面上實現了父類的方法,可是他實際上並無實現父類要求的邏輯。里氏替換原則要求咱們避免這種「塑料父子情」,若是出現子類不得不脫離父類方法範圍的狀況, 採起其餘方式處理,詳情參考《設計模式之禪》
高層的模塊不該該依賴於低層的模塊,這二者都應該依賴於其抽象
抽象不該該依賴細節
細節應該依賴抽象
// 底層模塊1:開發者 public class Coder { public void develop (Linux linux) { System.out.printf("開發者正在%s系統上進行開發%n",linux.getSystemName()); } } // 底層模塊2:Linux操做系統 public class Linux { public String name; public Linux(String name){ this.name = name; } public String getSystemName () { return this.name; } } // 高層模塊 public class Index { public static void main (String args []) { Coder coder = new Coder(); Linux ubuntu = new Linux("ubuntu系統"); // ubuntu是一種linux操做系統 coder.develop(ubuntu); } }
開發者正在ubuntu系統系統上進行開發
可是咱們能發現其中的問題:
// 程序員接口 public interface Programmer { public void develop (OperatingSystem OS); } // 操做系統接口 public interface OperatingSystem { public String getSystemName (); } // 低層模塊:Linux操做系統 public class Linux implements OperatingSystem{ public String name; public Linux (String name) { this.name = name; } @Override public String getSystemName() { return this.name; } } // 低層模塊:Window操做系統 public class Window implements OperatingSystem { String name; public Window (String name) { this.name = name; } @Override public String getSystemName() { return this.name; } } // 低層模塊:開發者 public class Coder implements Programmer{ @Override public void develop(OperatingSystem OS) { System.out.printf("開發者正在%s系統上進行開發%n",OS.getSystemName()); } } // 高層模塊:測試用 public class Index { public static void main (String args []) { Programmer coder = new Coder(); OperatingSystem ubuntu = new Linux("ubuntu系統"); // ubuntu是一種linux操做系統 OperatingSystem windows10 = new Window("windows10系統"); // windows10 coder.develop(ubuntu); coder.develop(windows10); } }
接口要足夠細化,固然了,這會讓接口的數量變多,可是每一個接口會具備更加明確的功能
在1的前提下,類應該依賴於「最小」的接口上
public interface Blogger { // 認真撰文 public void seriouslyWrite(); // 友好評論 public void friendlyComment(); // 無腦擡槓 public void argue(); // 鍵盤攻擊 public void keyboardAttack (); }
public interface PositiveBlogger { // 認真撰文 public void seriouslyWrite(); // 友好評論 public void friendlyComment(); } public interface NegativeBlogger { // 無腦擡槓 public void argue(); // 鍵盤攻擊 public void keyboardAttack (); }
單一職責原則和接口隔離原則雖然看起來有點像,好像都是拆分,可是其實側重點是不同的,「職責」的粒度實際上是比「隔離接口」的粒度要大的
基於1中闡述的緣由,其實 單一職責原則 和 接口隔離原則是可能會產生衝突的,由於接口隔離原則要求粒度儘量要細,可是單一職責原則卻不一樣,它要求拆分既不能過粗,但也不能過細,若是把本來單一職責的接口分紅了「兩個0.5職責的接口」,那麼這就是單一職責所不能容許的了。
當二者衝突時,優先遵循 單一職責原則
// 個人直接朋友 public class MyFriend { // 找他的朋友 public void findHisFriend (FriendOfMyFriend fof) { System.out.println("這是朋友的朋友:"+ fof.name); } } // 朋友的朋友,但不是個人朋友 public class FriendOfMyFriend { public String name; public FriendOfMyFriend(String name) { this.name = name; } } // 我 public class Me { public void findFriend (MyFriend myFriend) { System.out.println("我找我朋友"); // 注意這段代碼 FriendOfMyFriend fmf = new FriendOfMyFriend("陌生人"); myFriend.findHisFriend(fmf); }; }
一個類只和朋友類交流,朋友類指的是出如今成員變量、方法的輸入輸出參數中的類
一個類不和陌生類交流,即沒有出如今成員變量、方法的輸入輸出參數中的類
// 我朋友 public class MyFriend { public void findHisFriend () { FriendOfMyFriend fmf = new FriendOfMyFriend("陌生人"); System.out.println("這是朋友的朋友:"+ fmf.name); } } // 朋友的朋友,但不是個人朋友 public class FriendOfMyFriend { public String name; public FriendOfMyFriend(String name) { this.name = name; } } // 我 public class Me { public void findFriend (MyFriend myFriend) { System.out.println("我找我朋友"); myFriend.findHisFriend(); }; }
原則不是死板的而是靈活的
一些原則實際上是存在必定的衝突的,重要的是權衡,是掌握好度
六大原則是23種設計模式的靈魂,六大原則指導了設計模式,設計模式體現了六大原則
就像不少人說的,其實設計模式是一種思想,關鍵的仍是怎樣和業務結合起來,我也剛學習不久呢,若是前輩們有什麼好的看法,還請在評論區指點一下,不勝感激