設計模式之六大原則

設計模式之設計原則

這軟件設計過程中,有六大設計原則:

  1. 單一職責原則
  2. 里氏替換原則
  3. 依賴倒置原則
  4. 接口隔離原則
  5. 迪米特法則
  6. 開閉原則

由于軟件開發過程中,根據業務不同等因素形成了各種復雜的而不可預料的需求,遵守原則,讓項目開發過程與維護過程中,減少付出更多的時間與努力而達到更好的實現功能。需要對經驗,不斷總結,不斷實踐,對將設計模式使用的更熟練,對軟件開發起到意想不到的作用。

以下對六大設計原則,鄙人的一些簡單述說:

單一職責原則

定義:
做到有且只有一個原因引起類的變更,也就是說一個接口做一件事,這件事能概況某一事物的某一職責。

問題由來:
類T負責兩個不同的職責,職責P1,職責P2,當職責P1需求發生變化時,需要修改P2功能,有可能會導致原本運行正常功能發生故障

解決方案:
將T的P1,P2兩個職責使用T1,T2分別完成,T1負責P1功能,T2負責P2功能,當T1發生改變,T2不會發生改變,T2發生改變,T1也不會發生改變。

由于每個職責都進行分開,會出現大量類,當某一職責進行分解時,需要修改大量的代碼,此時修改職責類中的代碼違反單一職責(代碼級別,方法級別),減少大量類出現。

適用情況:

  1. 接口
    必要時可以將接口中的屬性和行為進行分解,這樣可以做到單一職責。
  2. 方法
    方法中的參數過多,可以對方法的參數進行分解,可以做到單一職責。

總結:
使用接口和方法的方式,盡量做到只有一個原因引起對這個類的改變。
單一職責原則,不只是面向對象編程,還適合模塊化編程等。

在實際項目中,由于功能過于復雜等原因做到該原則,還是挺難的,盡量做到單一職責原則,。

里氏替換原則

定義:
簡單點說就是只要父類出現的地方,子類就可以出現,且替換成子類后,也不能出現任何錯誤與異常(子類出現后,父類不能因為子類的出現導致父類出問題),導致出現錯誤原因:子類繼承父類,重寫父類方法后,這時父類方法功能就失效,發生變化。

意義:
子類可以擴展父類的功能,但不能改變父類原有的功能

繼承機制的優點:

  1. 代碼共享,減少創建類的工作量
  2. 提高代碼的重用性
  3. 子類可以形似父類,又異于父類,
  4. 提高父類的擴展性,實現父類的方法即可隨意而為

缺點:

  1. 繼承是入侵性的,(擁有父類的所有屬性和方法)
  2. 降低了代碼的靈活性,(由于父類屬性的約束,導致子類的約束更多)
  3. 增強了耦合性,(當父類的常量,變量,方法被修改,需考慮對子類的影響)

總結: 當違反了里氏替換原則后,可以將父類和子類抽取出更加通用的基類,使用依賴,聚合,組合燈關系,降低繼承的缺點。

依賴倒置原則

定義:

  1. 高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象
  2. 抽象不應該依賴細節
  3. 細節應該依賴抽象

在代碼中可以理解成:

  1. 模塊間的依賴通過抽象發生,實現類之間不發生直接的依賴關系,其依賴關系是通過接口或者抽象類產生的
  2. 接口或者抽象類不依賴于實現類
  3. 實現類依賴于接口或者抽象類

此時可以更簡潔的理解成: 面向接口編程

總結:

依賴導致原則本職就是通過抽象(抽象類或者接口)使各個類或者模塊實現彼此獨立,不相互影響,實現模塊的松耦合。

在實際使用項目中,盡量使用如下規則:

  1. 每個類盡量都要有接口或者抽象類,或者抽象類和接口都有(依賴倒置原則定義要由抽象才能實現依賴倒置)

  2. 變量表面類型盡量是接口或者抽象類

  3. 任何類都不應該從具體類派生

  4. 盡量不要重寫基類已經寫好的方法(里式替換原則)

  5. 結合里式替換原則來使用(依賴原則和里式原則總結:接口負責定義public屬性和方法,并聲明與其他對象的依賴關系,抽象類負責公共構造部分的實現,實現類準確的實現業務邏輯,并在適當的時候對父類進行細化)

接口隔離原則

我們先來看接口的定義 :

實例接口 : 在 Java 中聲明一個類,然后用 new 關鍵字產生一個實例,它是對一類事物的描述,可以看成是一個接口
類接口 : 使用 interface 定義的接口
隔離的的理解 :

  1. 客戶端不應該依賴它不需要的接口
  2. 類之間的依賴關系應該建立在最小的接口上

概括 : 建立單一接口,不要建立臃腫龐大的接口,也就是接口盡量細化,接口中的方法盡量少
這個是開閉原則的基礎,具體內容:針對接口編程,依賴于抽象而不依賴于具體。

接口隔離原則的約束條件 :

接口要高內聚,意思就是提高接口,類,模塊的處理能力,減少對外的交互,再具體一點就是在接口中盡量減少對外的 public 方法,通過業務邏輯壓縮接口中的 public 方法

定制服務,就是單獨為一個個體提供優良的服務,比如我們寫用戶模塊的時候,需要給用戶提供查詢信息,修改密碼,注冊用戶等信息,當管理員執行相同操作的時候,一般人會復用這些方法,

然后在這個的基礎上再增加管理員自己的方法,這種設計方法肯定是有問題的,這樣設計,當你修改了普通用戶調用的接口實現時,管理員的實現也會發生不可預測的改變,我們應該為管理員單獨寫一個接口

接口設計是有限度的,接口的設計粒度越小,系統越靈活,這是肯定的,但靈活的同時帶來的問題是 結構復雜化,開發難度增加, 可維護性降低

一個接口只服務于一個子模塊或業務邏輯

已經被污染了的接口,盡量去修改 ,若修改的風險較大,則采用適配器模式進行轉化處理

了解環境,拒絕盲從,不要一味的去套設計模式,有的時候不用比用了更好,也不要去照搬別人的設計方法,他的方法到你這不一定效果就好,畢竟業務邏輯不一樣

迪米特法則

定義 : 迪米特法則也叫最少知識原則,含義是 一個對象應該對其他對象有最少的了解,這個應該很好理解,就是降低各模塊之間的耦合

開閉原則

定義 : 一個軟件實體如類,模塊和函數應該對擴展開放,對修改關閉,開閉原則也是其他五個原則的基石

轉載于:https://www.cnblogs.com/qq-375291943/p/10574140.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387189.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝配置tengine

安裝tengine 1、依賴gcc openssl-devel pcre-devel zlib-devel 安裝:yum install gcc openssl-devel pcre-devel zlib-devel 2、解壓tengine壓縮包,并進入目錄; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

請訪問 開源中國下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下載源碼,按照如下的運行使用 springboot 改造 jeesite,只保留最簡單的系統配置 。 介紹 1、運行主類,…

解決idea 中web項目無法正常顯示的問題

轉載于:https://www.cnblogs.com/nulijiushimeili/p/10575364.html

Hadoop小知識點

hdfs命令行 上傳 hadoop fs -put 文件名 hdfs://主機名:9000/... 下載 hadoop fs -get hdfs://主機名:9000/... 文件名 /hadoop/share/hadoop/mapreduce 文件夾下有測試程序 提交MapReduce任務命令 #hadoop jar hadoop-mapreduce-examples-2.4.1.jar pi 5 5 hadoop fs -m…

copy 擴展名 包含子文件夾 文件 到某個 文件夾

比如我在d:\fff下面有很多子文件夾,子文件夾里還有子文件夾,里面有些文件夾里有.ppm.bz2的后綴的文件,需要把他們找出來復制到d:\fff2里面,應該怎么用批處理寫?最佳答案1234echo offfor /r d:\fff %%a in (*.ppm.bz2) …

在線視頻常見加密方式及安全性透析

信息化時代,多媒體的應用日漸成為人們生活中不可或缺的部分,無論是獲取最新資訊還是教育學習,視頻都是直觀高效的媒介之一。 基于互聯網的快速傳播,眾多培訓機構也逐漸將線下原創版權課程遷移到在線平臺中,一方面可以更…

分享一個前后端分離的web項目(vue+spring boot)

Github地址:https://github.com/smallsnail-wh 前端項目名為wh-web后端項目名為wh-server項目展示地址為我的github pages(https://smallsnail-wh.github.io)用戶名:admin,密碼admin(第一次啟動會比較慢&am…

部署php項目到linux

服務器:39.106.26.67rootBayou2009 數據庫:rootbayou2009 項目文件夾路徑:/home/www/項目文件夾名稱:education.bayou-tech.cn 綁定域名:education.bayou-tech.cn 綁定域名: 用ftp把配置文件下班到windows修…

ionic最新安裝教程

公司最近開發webapp,研究了一下ionicangularjs開發。 安裝過程中碰到許多問題,發現網上有好多資料都已經過時,在這里把最新的流程記錄一下。 首先是安裝node.js,通過nodejs官網下載,沒什么問題。npm已經默認安裝&#…

ZooKeeper安裝配置

配置 1、在conf目錄下創建一個配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLimit5 syncLimit2 server.1server1:2888:3888 server.2server2:2888:3888 server.3server3:2888:3888 ?tickTime&#…

1.1 算法編譯與調試

編程要保持簡單(KISS, keep it simple and stupid)。 算法競賽中的輸入輸出框架: 輸入數據保存在文件中,輸出數據也保存在文件中。 幾乎所有算法競賽的輸入數據和標準答案都是保存在文件中的。 使用文件最簡單的方法是使用輸入…

ionic2開發的仿外賣點餐系統(Ionic2+Angular2

github上的項目源碼 Run this Project(運行該項目) first(首先): make sure your computer install ionic 確保你的電腦安裝了ionic2,不懂自行百度 second(其次):$ ionic start wechat_restaurant tutorial…

Container Injection

Container的歷史: 2000 年的時候 FreeBSD 開發了一個類似于 chroot 的容器技術 Jails,這是最早期,也是功能最多的容器技術。Jails 英譯過來是監獄的意思,這個“監獄”(用沙盒更為準確)包含了文件系統、用戶…

HadoopHA集群搭建

三臺主機: 192.168.143.111 hdp1 192.168.143.112 hdp2 192.168.143.113 hdp3 1、安裝配置ZooKeeper; (1)在conf目錄下創建配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLim…

node搭建服務器,寫接口,調接口,跨域

剛開始學node,今天做這個也是累死寶寶了,以后可以自己寫接口自己用了,再也不用麻煩人家后臺人員了,這些年我們欠他們的太多了,說多了都是淚,不多說,往下看吧。。。 服務端項目目錄下&#xff1a…

ThreadPoolExcutor 線程池 異常處理 (上篇)

前言 最近看到crossoverJie的一篇文章:一個線程罷工的詭異事件 首先感謝原作者的分享,自己獲益匪淺。然后是回想到自己的一次面試經歷,面試官提問了線程池中的線程出現了異常該怎樣捕獲?會導致什么樣的問題? 示例代碼 …

3 MapReduce計算模型

MapReduce被廣泛應用于日志分析、海量數據排序、在海量數據中查找特定模式等場景中。 MapReduceJob 在Hadoop中,每個MapReduce任務都被初始化為一個Job。 每個Job又可以分為兩個階段:Map階段和Reduce階段。這兩個階段分別用Map函數和Reduce函數來表示。…

ionic3 調用本地相冊并上傳圖片

前言在APP中啟動相冊選擇器或者拍照上傳圖片這些功能是非常常見的。對于Ionic2,我們只能通過cordova插件實現調用原生的功能。下面將簡單的封裝一個選擇相冊或拍照上傳圖片的ImgService服務。具體如下。 Cordova準備下載安裝所需的Cordovar插件: Image P…

Mapreduce中maptask過程詳解

一、Maptask并行度與決定機制 1.一個job任務的map階段的并行度默認是由該任務的大小決定的; 2.一個split切分分配一個maprask來并行處理; 3.默認情況下,split切分的大小等于blocksize大小; 4.切片不是mapper類中對單詞的切片&…

4 開發MapReduce應用程序

系統參數配置 Configuration類由源來設置,每個源包含以XML形式出現的一系列屬性/值對。如: configuration-default.xml configuration-site.xml Configuration conf new Configuration(); conf.addResource("configuraition-default.xml"…