主頁 > 移動端開發 > 爬梯:七大設計原則

爬梯:七大設計原則

2020-09-14 12:13:12 移動端開發

資料學習整理自:B站尚硅谷

設計原則

設計模式原則,其實就是程式員在編程時,應當遵守的原則,也是各種設計模式的基礎(即:設計模式設計的依據)

1、單一職責原則

基本介紹

對類來說,即一個類應該只負責一項職責,

比如:一個類里面有兩個具體業務的不同方法,方法一修改時,可能會影響到方法二,所以此時應該拆分為兩個類,

細節

目的與優點:

1)降低類的復雜度,一個類只負責一項職責;

2)提高類的可讀性和可維護性;

3)降低變更引起的風險,

通常情況下,我們應擔遵守單一職責原則

什么情況可以不遵守單一職責原則:

1)業務邏輯足夠簡單,代碼量足夠少;

2)類中的方法數量足夠少,可以在方法級遵守單一職責原則,

2、介面隔離原則

Interface Segregation Principle

基本介紹

一個類對另一個類的依賴,應該建立在最小的介面上,

比如:類A需要使用類B實作的介面1上的部分方法,類C需要使用類D實作的介面1上的部分方法,此時應該將介面1拆分成顆粒度更小的介面單元,

未遵循介面隔離原則:

在這里插入圖片描述

應該調整為:

在這里插入圖片描述

3、依賴倒置原則

Dependence Inversion Principle

基本介紹

1)高層模塊不應該依賴底層模塊,二者都應該依賴其抽象

2)抽象不應該依賴細節,細節應該依賴抽象

3)依賴倒置(倒轉)的中心思想是面向介面編程

4)依賴倒置原則的設計理念:

  • 相對于細節的多邊形,抽象的東西更為穩定;
  • 以抽象為基礎搭建的架構比以細節為基礎搭建的架構更為穩定;
  • 在java中,抽象指的是介面和抽象類,細節指的是具體的實作類,

5)使用介面或抽象類的目的是制定規范(設計),而不涉及任何具體的操作,把展現細節的任務交給實作類完成,

依賴關系傳遞的三種方式

1)通過介面的傳遞實作依賴

//開關 
interface IOpenAndClose{
    public void open(ITV tv);//抽象方法接收抽象類
}
//電視
interface ITV{//ITV介面,可以涵蓋各種電視
    public void play();
}
//具體實作
class OpenAndClose implements IOpenAndClose{
    public void open(ITV tv){
        tv.play;
    }
}

// main >>> 給實作類傳入具體的電視

2)通過構造方法實作依賴

//開關 
interface IOpenAndClose{
    public void open(ITV tv);//抽象方法接收抽象類
}
//電視
interface ITV{//ITV介面,可以涵蓋各種電視
    public void play();
}
//具體實作
class OpenAndClose implements IOpenAndClose{
    ITV tv;
    public OpenAndClose(ITV tv){
        this.tv = tv;
    }
    public void open(){
        this.tv.play;
    }
}

// main >>> 給實作類傳入具體的電視

3)通過setter方法實作傳遞

//開關 
interface IOpenAndClose{
    public void open(ITV tv);//抽象方法接收抽象類
    public void setTV(ITV tv);//set屬性
}
//電視
interface ITV{//ITV介面,可以涵蓋各種電視
    public void play();
}
//具體實作
class OpenAndClose implements IOpenAndClose{
    ITV tv;
    public void setTV(ITV tv){
        this.tv = tv;
    }
    public void open(){
        this.tv.play;
    }
}

// main >>> 給實作類傳入具體的電視

4、里氏替換原則

Liskov Substitution Principle

基本介紹

1)所有參考基類的地方必須能透明地使用其子類的物件;

2)在使用繼承時,在子類中盡量不要重寫父類的方法;

3)繼承實際上增強了兩個類之間的耦合性,適當情況下,可以通過聚合、組合、依賴或共同繼承一個更高級的類來解決問題,

總結:描述的就是子類繼承父類時,不要輕易去修改父類的方法,這樣會導致父類的方法變得不透明,當父類的方法修改時,子類重寫的方法將得不到改變,

5、開閉原則

Open Closed Principle

基本介紹

1)一個軟體物體如類、模塊和函式應該是對擴展開放,對修改關閉,用抽象構建框架,用實作擴展細節,

2)當軟體需要變化時,盡量通過 ,而不是通過修改已有的代碼來實作變化,

3)編程中遵循其他原則,以及使用設計模式的目的就是為了遵循開閉原則,

6、迪米特法則

Demeter Principle 最少知道原則

基本介紹

1)一個類對自己依賴的類知道的越少越好,

2)只與最直接的朋友通信

? 直接的朋友:每個物件都會與其他物件有耦合關系,只要兩個物件之間有耦合關系,我們就說這兩個物件之間是朋友關系,耦合的方式很多:依賴、關聯、組合、聚合等,

  • 我們稱出現成員變數、方法引數、方法回傳值中的類為直接的朋友
  • 出現在區域變數中的類不是直接的朋友(也就是說,陌生的類最好不要以區域變數的形式出現在類的內部,)

注意事項和細節

1)迪米特法則的核心是降低類之間的耦合;

2)由于每個類都減少了不必要的依賴,因此迪米特法則指示要求降低類之間(物件之間)耦合關系,并不是要求完全沒有依賴關系,

總結:只與最直接的朋友通信!如果目標不是最直接的朋友,那就嘗試把它變成最直接的朋友!

7、合成復用原則

Composite Reuse Principle

基本介紹

盡量使用合成/聚合的方式,而不是使用繼承

合成:

1)B類以引數的形式傳入A類;

2)B類創建A類的實體

在這里插入圖片描述

聚合:

通過setter方法,把A類傳入B類

在這里插入圖片描述

設計原則核心思想

1)找出應用中需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起;

2)針對介面編程,而不是針對針對實作編程;

3)為了互動物件之間的松耦合設計而努力,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/34798.html

標籤:其他

上一篇:「同程藝龍」一年經驗拿到offer面經分享

下一篇:web前端介紹

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more