23種設計模式入門 - 設計模式概述及七大原則

設計模式的目的

使程序擁有更好的的java

  1. 代碼複用性(一次編譯,到處運行[手動狗頭])
  2. 可讀性(不可替代性堪憂呀)
  3. 可擴展性(新增功能時方便)
  4. 可靠性(新增功能後對舊功能沒有影響)
  5. 高內聚,低耦合

設計模式的七大原則

設計模式的原則:設計「設計模式」時,遵照的原則,這樣設計的依據編程

〇、設計模式核心思想

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

1、單一職責原則

即一個類只負責一個職責,若有多個職責應分爲多個類設計模式

  • 能夠下降類的複雜性,一個類只負責一個職責
  • 提升類的可讀性,可維護性
  • 下降變動引發的風險
  • 一般狀況下,咱們應當遵照單一職責原則。當類足夠簡單時,能夠下放到方法上遵照單一職責原則

2、接口隔離原則

一個類對另外一個類的依賴應當創建在最小接口上微信

如存在一個接口Interface1存在4個方法a()b()c()d(),它有一個實現類Impl1實現了它的四個方法。現存在類Class1須要使用接口中的b()c()方法,即Class1依賴與Interface1,使用uml類圖表示如圖架構

sFbtv4.png

對於實現類Impl1來講,a()d()方法沒有被使用,能夠無需實現,卻必需要書寫。此時出現代碼的冗餘。根據接口隔離原則,能夠將Interface1接口進行拆分框架

sFbJ8U.png

此時若是有另外一個類須要使用b()c()d()三個方法時,須要將上圖中的Interface2再拆分一次ide

sFbY2F.png

至此,ClassAImplA的依賴,ClassBImplB的依賴,創建在最小接口上優化

3、依賴倒轉原則

  1. 高層模塊不該該依賴低層模塊,兩者都應該依賴其抽象
  2. 抽象不該該依賴細節,細節應該依賴抽象
  3. 依賴倒轉的中心思想:面向接口編程
  4. 依賴倒轉原則的設計理念:相對於細節的多變性,抽象的東西要更爲穩定。以抽象爲基礎搭建的架構比以細節爲基礎的架構更爲穩定。
  5. 使用接口或抽象類的目的是制定好規範,將展現細節的任務交給他們的實現類去完成。

例1:打印出來源的信息this

不遵照依賴倒轉原則的寫法設計

public class RawDependenceReversal {
    public static void main(String[] args) {
        Person p = new Person();
        p.receive(new Email());
    }
}

class Email{
    public String getInfo(){
        return "電子郵件信息";
    }
}

class Person{
    public void receive(Email e){
        System.out.println(e.getInfo());
    }
}

此時,若Person類能夠接收的來源不僅是Email,還須要添加其餘來源時,會比較麻煩。

遵照依賴倒轉原則進行改進:

public class ImproveDependenceReversal {
    public static void main(String[] args) {
        Persons p = new Persons();
        p.receive(new Emails());
        p.receive(new WeChat());
    }
}

interface Sender{
    public String getInfo();
}

class Emails implements Sender{
    @Override
    public String getInfo(){
        return "電子郵件信息";
    }
}

class WeChat implements Sender{
    @Override
    public String getInfo() {
        return "微信信息";
    }
}

class Persons{
    public void receive(Sender e){
        System.out.println(e.getInfo());
    }
}

依賴倒轉的使用方式示例\

方式1:使用接口方式來進行依賴(調用方法時使用接口做爲參數)。此時,依賴的是接口而不是細節類,所以符合依賴倒轉原則

interface IOpenAndClose{
    void open(ITV tv);
}

class OpenAndClose implements IOpenAndClose{
    @Override
    public void open(ITV tv) {
        tv.play();
    }
}

interface ITV{
    void play();
}

方式2:經過構造方法來進行依賴

interface IOpenAndClose{
    void open();
}
interface ITV{
    void play();
}
class OpenAndClose implements IOpenAndClose{
    public ITV tv;
    public OpenAndClose(ITV tv){
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

方式3:經過setter方法來進行依賴

interface IOpenAndClose{
    void open();
    public void setTv(ITV tv);
}
interface ITV{
    void play();
}
class OpenAndClose implements IOpenAndClose{
    private ITV tv;

    @Override
    public void open() {
        this.tv.play();
    }

    @Override
    public void setTv(ITV tv) {
        this.tv = tv;
    }
}

注意事項和細節

  • 低層模塊儘可能都要有其對應的高層抽象類或接口,穩定性更好
  • 變量的聲明儘可能是抽象類或接口,使變量和實際對象之間添加一層緩衝,利於擴展和優化
  • 繼承時遵循里氏替換原則

4、里氏替換原則

  • 全部引用基類的地方必須可以透明的使用其子類的對象。
  • 使用繼承時,子類儘可能不重寫父類方法。
  • 繼承實際上提高了類的耦合性。在適當的狀況下,可使用聚合、組合、依賴來解決問題

5、開閉原則

  • 模塊和方法應該對擴展(提供方)開放,對修改(使用方)關閉。用抽象構建框架,用實現擴展細節
  • 軟件須要變化時,儘可能經過擴展實體的方式來實現變化,而不是經過修改現有的代碼來實現庇阿變化
  • 其餘原則及使用設計模式的目的是遵照開閉原則

6、迪米特法則

  • 一個對象應該對其餘對象保持最小的瞭解。
  • 迪米特法則又稱爲最小知道原則。一個類對於其依賴的類,無論它多麼複雜,都只關心其提供的public方法。
  • 迪米特法則就是隻與直接的朋友通訊
  • 直接的朋友:出如今成員變量、方法參數、方法返回值的類稱爲直接的朋友,出如今局部變量(方法內部的變量)的類不是直接的朋友。

7、合成複用原則

  • 儘可能使用合成/聚合的關係,而不是使用繼承

設計模式分類

23種分爲三大類

  • 建立型模式

    單例模式、抽象工廠模式、原型模式、建造者模式、工廠模式

  • 結構型模式

    適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式

  • 行爲型模式

    模板方法模式、命令模式、訪問者模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態模式、策略模式、職責鏈模式

相關文章
相關標籤/搜索