設計模式的種類和七大原則

設計模式的種類

設計模式有23種,分爲三類:java

  • 建立型模式:
    • 單例模式、抽象工廠模式
    • 原型模式、建造者模式、工廠模式
  • 結構型模式
    • 適配器模式、橋接模式、裝飾模式、組合模式
    • 外觀模式、享元模式、代理模式
  • 行爲型模式
    • 模板方法模式、命令模式、訪問者模式
    • 迭代器模式、觀察者模式、中介者模式
    • 備忘錄模式、解釋器模式、狀態模式
    • 策略模式、責任鏈模式

設計模式七大原則

設計模式的核心思想

  • 找出代碼中的可變化之處,並獨立出來,不要和固定代碼混在一塊兒
  • 針對接口編程, 不要針對實現編程
  • 爲了交互對象之間的鬆耦合設計而努力

耦合度比較

  • 泛化(繼承)==實現>組合>聚合>關聯>依賴

1. 單一職責

一個類A負責多個職責時,要將A的粒度分解成對應職責的類,對應單個職責,在後期對某個職責進行更改時,不會對其餘職責形成影響。下降類的複雜度編程

2. 接口隔離

一個類不該該依賴不須要的接口,即一個類對另外一個類的以來應該創建在最小接口上,當要以來的接口中有不須要的部分,就應該將大的接口拆分紅小接口,保證依賴的接口都是須要的設計模式

3. 依賴倒置

抽象不要依賴細節,細節要依賴抽象優化

低層模塊最好是依賴抽象,抽象中不要有具體操做,具體操做交給細節this

繼承要遵照里氏替換原則設計

抽象--》接口或者抽象類3d

細節--》實現類代理

  • 依賴關係的三種傳遞方式code

    • 接口傳遞對象

      interface IOpenAndClose{
          public void open(ITV tv);
      }
      interface ITV{
          public void play();
      }
      //實現接口
      class OpenAndClose implements IOpenAndClose{
          public void open(ITV tv){
              tv.play();
          }
      }
    • 構造方法傳遞

      interface IOpenAndClose{
          public void open();
      }
      interface ITV{
          public void play();
      }
      //實現接口
      class OpenAndClose implements IOpenAndClose{
          private ITV tv;
          public OpenAndClose(ITV tv){  //使用構造器
              this.tv = tv;
          }
          
          public void open(){
              this.tv.play();
          }
      }
    • setter傳遞

      interface IOpenAndClose{
          public void open(ITV tv);
          public void setTv(ITV tv);
      }
      interface ITV{
          public void play();
      }
      //實現接口
      class OpenAndClose implements IOpenAndClose{
          private ITV tv;
          public void setTv(ITV tv){  //調用setter方法
              this.tv = tv;
          }
          
          public void open(){
              this.tv.play();
          }
      }

4.里氏替換原則

正確使用繼承:全部引用基類的方法必須能透明的使用其子類的對象。子類中不要輕易重寫父類的方法,能夠經過聚合,組合,依賴的方法來解決問題,讓子類和父類再也不繼承,而是共同繼承一個更加基礎的base類,關於父類中子類須要的方法,能夠經過依賴或者繼承來獲取對象並調用方法,能夠下降耦合

普通的繼承

遵照里氏替換的改進

5.開閉原則

提供方(被依賴)--》開放擴展

使用方(依賴)--》修改關閉

如圖:paint爲使用方,三個類型類是提供方,當咱們要添加新的繪畫類型時,不只要建立新的類,還要在paint中添加新的方法,這樣自違背了開閉原則,代碼擴展性也很低

如下優化遵照了開閉原則,將具體的各個類型的draw方法實如今各自的實現類中,paint依賴抽象,只須要調用Shape對象的draw方法,對應調用各自實現類的draw方法,這樣就達到目的,使用方無需更改。

6. 迪米特法則(直接朋友法則/最少知道原則)

直接朋友:B是A的成員變量,B是A中方法的入參,B是A中方法的返回值類型

以上三種狀況稱爲B是A的直接朋友,其它的爲陌生類

迪米特法則:陌生類最好不要以局部變量的形式出如今類的內部;以下降類與類之間的耦合

對於被依賴的類無論有多複雜,都封裝在類的內部,對外只提供public方法,不要泄露任何信息;

7.合成複合原則

儘可能使用聚合和合成,不要使用繼承

如下爲依賴,組合,聚合的類圖

相關文章
相關標籤/搜索