1. 程式人生 > >C#設計模式(1)——設計原則

C#設計模式(1)——設計原則

設計原則

使用設計模式的根本原因是適應變化,提高程式碼複用率,使軟體更具有可維護性和可擴充套件性。在進行設計的時候,我們需要遵循以下幾個原則:單一職責原則、開閉原則、里氏替代原則、依賴倒置原則、介面隔離原則、合成複用原則和迪米特法則。

1.單一職責原則

  專業的人做專業的事,面向物件程式設計中類也是一樣,一個類只負責一些特定的職責,如User類只負責使用者相關的業務功能,Order類只負責訂單相關的功能,想象下如果我們把使用者和訂單的功能放在一個類,然後去設計使用者的許可權中會怎麼樣呢?訂單業務和許可權耦合了。。單一職責原則作用是降低職責間的耦合,同時提高程式碼的複用率。

2.開閉原則

  開閉原則通俗的講就是對新增(擴充套件)開放,對修改關閉。如我們維護一個軟體系統,這時要新增一個新功能,我們可以寫新程式碼來新增這個功能,但是不能修改以前的程式碼,想象下我們為了新功能修改了一些舊程式碼,然後發現一些舊的功能掛掉了時的心情。

3.依賴倒置

  依賴倒置原則作用是方便實現類的切換,降低業務要求和具體實現間的耦合。抽象不應該依賴細節,而細節應該依賴抽象,這就是我們為什麼使用面向介面程式設計,而不是面向實現程式設計的原因。

4.介面隔離原則

  介面隔離原則指的是提倡使用多個專門的介面,而不是使用一個總的介面。以一個訂單系統為例,我們自己的系統可以對訂單進行增刪改查操作,給第三方只提供了查詢操作。如果把增刪改查的功能都定義在一個介面中那麼第三方的實現類也要做增刪改的實現。分成兩個介面就避免了這種情況。

   public interface IOrderService1
    {
        void Add();//新增
        void Delete();//刪除
        void Edit();//修改
    }
    public interface IOrderService2
    {
        void Query();
    }
    //我們用的訂單服務類
    public class MyOrderService : IOrderService1, IOrderService2
    {
        public
void Add(){//新增操作} public void Delete(){//刪除操作} public void Edit() {//修改操作} public void Query(){//查詢操作} } //給第三方提供的訂單服務類 public class OtherOrderServeice : IOrderService2 { public void Query(){//查詢操作} }

5.合成複用原則

  合成複用指的是一個物件A包含了另一個物件B,那麼A就可以委託B來使用B的功能。一個例子:

//訂單類
    public class Order
    {
        public User user;//訂單中有使用者
    }
//使用者類
    public class User
    {
        public string UserName { get; set; }
        public string getName()
        {
            return this.UserName;
        }
    }

  上邊的例子中訂單中包含了使用者,我們可以使用order.User.getName();order委託其屬性user來呼叫User類中的方法。注意合成複用用於“has-a”場景,例子中訂單has-a使用者,訂單和使用者是包含關係;“is-a"場景則要使用繼承,如學生is-a人類,學生要繼承於人類。

6.迪米特法則(最小知道原則)

  迪米特法則指的是各個類之間應該儘可能的不瞭解,最好是相互獨立的。但是很多時候類與類之間不可避免的要傳輸資訊,如上邊的Order和User就存在強依賴關係,我們應該儘可能地降低類和類間的依賴。怎麼降低依賴呢?一種常用的方式是通過中介軟體(如redis/rabbitmq等)來降低依賴。如A和B類要通訊,原始的方式是new一個例項出來直接通訊  A<-->B ,現在我們用一箇中間件充當傳話人那麼A和B通訊就變成了 A<-->中介軟體<-->B 形式,這樣A和B就降低了耦合。

設計模式中的外觀模式和中介者模式就使用了迪米特法則。

7.里氏替代原則

  里氏替代原則指的是父類存在的地方,子類都可以替換,並且行為不發生改變,只有所有的父類都可以被子類替代且行為不發生變化時才能說明父類是可複用的。一個違背里氏替換原則的例子:我們定義了鳥類有fly方法,表示鳥類都可以飛,但是企鵝也是鳥類而且企鵝不會飛,這時企鵝(子類)就不能替代其鳥類(父類)了,說明我們設計的鳥類違背了里氏替代原則。