淺談23種設計模式

淺談23種設計模式

類之間的關聯關系:在使用Java、C#和C++等編程語言實現關聯關系時,通常將一個類作為另一個類的屬性。
  (1)雙向關聯,兩個類互相為各自的屬性,比如顧客類Customer和商品類Product,顧客擁有商品,商品與某個顧客相關聯。
  (2)單向關聯,一個類作為另一個類的屬性,顧客Customer擁有地址Address,UML圖用帶箭頭的直線表示,由Customer指向Address。
  (3)自關聯,此類的屬性對象類型屬于該類本身,例如節點類Node的成員又是節點對象。
  (4)多重關聯,Form類的對象包含多個Button類,一個Button只與一個Form相關聯。
  (5)聚合關系,是一種特殊的關聯關系,強調部分與整體,比如汽車Car和引擎Engine,引擎可以脫離汽車單獨存在,但是是汽車的組成部分,UML圖中用帶空心菱形的直線表示,由汽車指向引擎,表示汽車contains引擎。(Engine類可以在Car類的外部實例化,然后作為參數傳入Car類)
  (6)組合關系,是一種特殊的關聯關系,也強調部分與整體關系,比如頭Head和嘴Mouth,Mouth不能脫離Head單獨存在,UML圖用帶實心菱形的直線表示,由Head指向Mouth,表示頭has嘴。(Mouth類在Head類的構造函數中實例化,Head銷毀則Mouth也銷毀)
*組合關系和聚合關系與普通的關聯關系主要是語義上的區別,表示關聯的程度。

類之間的依賴關系:表示某個類的方法使用另一個類的對象作為參數,UML圖用帶箭頭的虛線表示,由依賴方指向被依賴方。

泛化關系:即繼承關系,UML圖中用帶空心三角形的直線表示,例如Student類 is-a-kind-of Person類

接口與實現關系:表示類實現接口中所聲明的操作。UML圖中用帶空心三角形的虛線表示。

?

面向對象設計原則:
  (1)單一職責原則:類的職責要單一,不能將太多的職責放在一個類中。
  (2)開閉原則:可以在不修改一個軟件實體的基礎上去擴展其他功能。
  (3)里氏代換原則:在軟件系統中,一個可以接受基類對象的地方必然可以接受一個子類對象。
  (4)依賴倒轉原則:針對抽象層編程,不要針對具體類編程。
  (5)接口隔離原則:使用多個專門的接口來替代一個統一的接口。
  (6)合成復用原則:在系統中盡量多使用組合和聚合關系,盡量少使用甚至不使用繼承關系。
  (7)迪米特法則:一個軟件實體對其他實體引用越少越好,或者說如果兩個類不必彼此直接通信,那么兩個類就不應當發生直接的相互作用,而是引入一個第三者發生間接交互。

設計模式定義:設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

?

五種對象創建型模式:
1.工廠方法模式
  工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。
2.抽象工廠模式
  提供一個創建一系列相關或依賴對象的接口,而無須指定他們具體的類。
3.建造者模式
  將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一步一步創建一個復雜的對象,它允許用戶只通過指定復雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。
4.原型模式
  用原型實例指定創建對象的種類,并且通過復制這些原型創建新的對象。原型模式允許一個對象再創建另外一個可定制的對象,無須知道任何創建的細節。原型模式的基本工作原理是通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象復制原型來實現創建過程。
5.單例模式
  單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例,這個類稱為單例類,它提供全局訪問的方法。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。

七種結構型模式:
1.適配器模式
  將一個接口轉換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作。
2.橋接模式
  將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
3.組合模式
  組合多個對象形成樹形結構以表示“整體-部分”的結構層次。組合模式對單個對象(葉子對象)和組合對象(容器對象)的使用具有一致性。
4.裝飾模式
  動態地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現更為靈活。
5.外觀模式
  外部與一個子系統通信必須通過一個統一的外觀對象進行,為子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子接口更加容易使用。
6.享元模式
  運用共享技術有效地支持大量細粒度對象的復用。系統只使用少量的對象,而這些對象都很相似,狀態變化很小,可以實現對象的多次復用。
7.代理模式
  給某一個對象提供一個代理,并由代理對象控制對原對象的引用。

十一種行為型模式:
1.職責鏈模式
  避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止
2.命令模式
  將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。
3.解釋器模式
  定義語法的文法,并且建立一個解釋器來解釋語言中的句子,這里的“語言”意思是使用規定格式和語法的代碼。
4.迭代器模式
  提供一種方法來訪問聚合對象,而不是暴露這個對象的內部表示。
5.中介者模式
  用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
6.備忘錄模式
  在不破壞封裝的前提下,捕捉一個對象的內部狀態,并在該對象之外保存這個狀態,這樣可以在以后將對象恢復到原先保存的狀態。
7.觀察者模式
  定義對象間的一種一對多依賴關系,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知并自動更新。
8.狀態模式
  允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。
9.策略模式
  定義一系列算法,將每一個算法封裝起來,并讓他們可以相互替換。
10.模板方法模式
  定義一個操作中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
11.訪問者模式
  表示一個作用于某對象結構中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

?

轉載于:https://www.cnblogs.com/jianglingjun/p/6664292.html

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

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

相關文章

網頁布局基礎

1、盒子模型的第一層到第五層: border、padding content、background-image、background-color、margin 2、清除浮動。對受到浮動影響的標簽作以下操作: 1、clear: both; 2、clear: right; clear: left; 3、設置寬度width: 100%(或者固定寬度) overflow…

mysql與串口通信_虛擬機串口與主機串口通信·小程序(下)

上次說到的,不能做到實時通信。那么開兩個進程就可以了,一個用來監聽是否有消息傳來,一個用來等待用戶輸入。那么,先來復習一下進程的相關概念。進程結構linux中進程包含PCB(進程控制塊)、程序以及程序所操縱的數據結構集&#xf…

淺談我所見的CSS命名風格

在兩年工作中,總結一下我所見的css命名風格。 1.單一class命名 .header {width: 500px; } .item {text-indent: 20%; } 優點:簡單,渲染效率高。 缺點:零散,沒有模塊化。 2. 后代選擇器class命名 .header .item a {font…

Java規范請求中的數字

你們都了解Java社區流程 (JCP),不是嗎? JCP是為Java技術開發標準技術規范的機制。 任何人都可以注冊該站點并參與對Java規范請求(JSR)的審查和提供反饋,并且任何人都可以注冊成為JCP成員&#x…

ORACLE MOS 翻譯

http://blog.csdn.net/msdnchina/article/details/53174196轉載于:https://www.cnblogs.com/zengkefu/p/6665950.html

自從我這樣擼代碼以后,公司網頁的瀏覽量提高了107%!

歡迎大家前往騰訊云 社區,獲取更多騰訊海量技術實踐干貨哦~ 本文由騰訊IVWEB團隊發表于云 社區專欄 作者:yangchunwen HTTP協議是前端性能乃至安全中一個非常重要的話題,最近在看《web性能權威指南(High Performance Browser Networking)》&a…

python數列分段_按范圍分段的Python數組

首先,定義你的“極”數第二,根據這些“極”數生成間隔第三,定義盡可能多的列表。在然后,對于每個間隔,掃描列表并在相關列表中添加屬于該間隔的項代碼:source [1, 4, 7, 9, 2, 10, 5, 8]poles (0,3,6,25)…

51nod 1278 相離的圓

基準時間限制:1 秒 空間限制:131072 KB 分值: 10 難度:2級算法題 平面上有N個圓,他們的圓心都在X軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。例如:4個圓分別位于1, 2, 3, 4的位置&…

讓我們將包變成模塊系統!

使用構建系統將許多項目分為模塊/子項目( Maven , Gradle , SBT …); 編寫模塊化代碼通常是一件好事。 將代碼分為構建模塊主要用于: 隔離代碼部分(減少耦合) api / impl拆分 僅將…

R語言日期的表示和運算(詳細總結)

1、取出當前日期 Sys.Date() [1] "2014-10-29" date() #注意:這種方法返回的是字符串類型 [1] "Wed Oct 29 20:36:07 2014" 2、在R中日期實際是double類型,是從1970年1月1日以來的天數 typeof(Sys.Date()) [1] "double" …

html高度塌陷問題解決

高度塌陷的問題: 當開啟元素的BFC以后,元素將會有如下的特性 1 父元素的垂直外邊距不會和子元素重疊 開啟BFC的元素不會被浮動元素所覆蓋 開啟BFC的元素可以包含浮動的子元素 如何開啟元素的BFC 設置元素浮動 設置元素絕對定位 …

java空格鍵_Java KeyPressed-如果其他鍵也太舊,則無法檢測是否按下了空格鍵

如標題所示,在我的Java游戲中,無法檢測是否同時按下空格鍵和其他鍵。例如,空格鍵是射擊鍵,而箭頭鍵則使玩家移動。如果我按下向上箭頭鍵,向左箭頭鍵和空格鍵,那么它應該向左上方發射子彈。但是,…

How to fix the bug “Expected required, optional, or repeated.”?

參考:https://github.com/tensorflow/models/issues/1834 You need to download protoc version 3.3 (already compiled). Used protoc inside bin directory to run this command like this:tensorflow$ mkdir protoc_3.3tensorflow$ cd protoc_3.3tensorflow/prot…

立面設計模式–設計觀點

在上一篇文章中,我們描述了適配器設計模式 。 在今天的文章中,我們將展示另一種類似的“四結構幫派”模式 。 顧名思義,結構模式用于從許多不同的對象形成更大的對象結構。 外觀模式就是這樣一種模式,它為系統內的一組接口提供了簡…

Java第三次作業 1502 馬 帥

《Java技術》第三次作業 (一)學習總結 1.書中對面向對象封裝性的定義為:指把對象的屬性和行為看成一個密不可分的整體,把不需要讓外界知道的信息隱蔽起來。簡單來說,就是定義的一些對象,只有在本類中才可以…

sass運算

sass具有運算的特性,可以對數值型的Value(如:數字、顏色、變量等)進行加減乘除四則運算。 請注意運算符前后請留一個空格,不然會出錯。 scss.style css.style 本文轉載于:猿2048https://www.mk2048.com/blog/blog.php?idiij12j&titles…

163 coremail_Icoremail企業郵箱

高速穩定iCoremail企業郵箱于國內外多個網絡運營商的主干網數據中心放置郵件服務器,同時采用我司自主研發的Coremail電子郵件系統,從多方面保障了用戶的流暢體驗。安全可靠iCoremail企業郵箱使用歐洲最大的反病毒安全提供商的Sophos反病毒系列產品&#…

jquery-基礎事件[下]

<script>$(function () {mouseover mouseout mouseenter mouseleave的區別$(div).mouseover(function () {$(this).css(background, red);}).mouseout(function () {$(this).css(background, green);});$(div).mouseenter(function () {$(this).css(background, red);}).…

JavaOne 2012:NetBeans.Next –未來路線圖

我從Continental Ballroom 4和一個NetBeans主題&#xff08; 項目Easel &#xff09;到Continental Ballroom 5&#xff0c;走了必要的幾個步驟&#xff0c;以查看另一個面向NetBeans的演示文稿&#xff1a;“ NetBeans.Next –未來路線圖”。 Ashwin Rao發起了“羽毛之鳥”&am…

LeetCode day30

LeetCode day30 害&#xff0c;昨天和今天在搞數據結構的報告&#xff0c;后面應該也會把哈夫曼的大作業寫上來。 今天認識認識貪心算法。(&#xff61;&#xff65;?&#xff65;)&#xff89; 2697. 字典序最小回文串 給你一個由 小寫英文字母 組成的字符串 s &#xff0c;…