設(shè)計模式設(shè)計模式七大原則_第1頁
設(shè)計模式設(shè)計模式七大原則_第2頁
設(shè)計模式設(shè)計模式七大原則_第3頁
設(shè)計模式設(shè)計模式七大原則_第4頁
設(shè)計模式設(shè)計模式七大原則_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、設(shè)計模式021主要內(nèi)容設(shè)計模式準備:7大設(shè)計原則2七大設(shè)計原則單一職責原則開-閉原則里氏代換原則依賴倒轉(zhuǎn)原則接口隔離原則合成/聚合復(fù)用原則迪米特原則3單一職責原則一個類只有一種職責SRP Single Responsibility Principle prinspl原則:若想到多于一個的動機去改變一個類,那么這個類就具有多于一個的職責軟件設(shè)計真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責并且把職責相互分離為什么?高內(nèi)聚、低耦合、多復(fù)用4一個例子GameLogin()Exit()Left()Right()Fire()getUserName()getHighScore()5思考問題這個類中有幾個職責?用戶是否登

2、陸的方法跟用戶玩游戲的方法是否有關(guān)?獲得用戶信息跟其他兩個職責是否有關(guān)?如何優(yōu)化代碼?6優(yōu)化完成UML類圖userStateLogin()Exit()PlayLeft()Right()Fire()userInforgetUserName()getHighScore()內(nèi)聚高還是低?耦合度呢?7開-閉原則對擴展開放、對更改封閉Open for extension Closed for modification開放-封閉原則是面向?qū)ο笤O(shè)計的核心所在做一個例子:寫個代碼片段:完成對兩個數(shù)字的加分和減法8開-閉原則大部分人的做法:若要添加乘法和除法呢?9開-閉原則OperaterGetResult(a

3、,b)減GetResult(a,b)加GetResult(a,b)符合開閉原則10里氏代換原則Barbara Liskow 在1988年發(fā)表的1972年Barbara成為麻省理工學(xué)院的教授是美國獲得計算機科學(xué)博士學(xué)位的第一人11里氏代換原則Liskow Substitution Principle (LSP):子類必須能夠替換掉它們的父類型只要是基類出現(xiàn)的地方,一定能夠出現(xiàn)子類!LSP指導(dǎo)繼承,是繼承的基石龍生龍,鳳生鳳,老鼠的兒子會打洞。12LSP例子:一個例子:長方形和正方形某軟件 while(長=寬),將寬+1.父類沒問題,但子類就回出現(xiàn)死循環(huán)正方形不可以繼承長方形13LSP例子孫悟空勾

4、掉生死簿中所有猴子的名字,那么獼猴、石猴、長臂猿等的名字是否都勾掉了?乘馬,乘白馬、乘驪馬注意LSP反之不成立!墨子 小取娣,美人也,愛娣,非愛美人也.盜,人也;惡盜,非惡人也 14一個例子15依賴虛線普通箭頭表示依賴依賴和關(guān)聯(lián)的區(qū)別A和B關(guān)聯(lián),A只認識B,知道B的屬性和方法,可以雙關(guān)聯(lián),但不建議使用。A依賴BB的改變影響A的結(jié)果。通常依賴是單向的16如果父類的某些方法在子類中已經(jīng)發(fā)生畸變,則建議斷開父子關(guān)系!1718總結(jié)LSP拒絕子類有自己的個性一旦子類有了“個性”,則與父類之間的關(guān)系難以調(diào)和會讓代碼的耦合變得撲朔迷離19依賴倒轉(zhuǎn)原則要針對接口編程,不要針對實現(xiàn)編程。Program to a

5、n interface, not an implementation.高層模塊不應(yīng)該依賴底層模塊,兩者應(yīng)該都依賴抽象High-level module should not depend upon bottom module. both should depend upon abstractions20依賴倒轉(zhuǎn)原則減少類之間的耦合度降低風險一個例子司機開車Driverdriver(Benz bz)BenzRun()21依賴倒轉(zhuǎn)原則司機還要開寶馬,如何實現(xiàn)?增加寶馬類,但是需要修改司機類BMWRun()Driverdriver(Benz bz)driver(BMW bmw)BenzRun()22

6、如何解決針對接口編程23實現(xiàn)場景代碼:張三開奔馳IDriver 張3 = new Driver();ICar benz=new Benz();張3.driver(benz);24練習最初:光明農(nóng)場養(yǎng)牛擴展:多種牛場、喂養(yǎng)多種動物最初類圖如下,按照依賴倒轉(zhuǎn)原則畫出正確類圖光明農(nóng)場Feed(Cow c)Cow25接口隔離原則Interface Segregation Principle ISP客戶端不應(yīng)該依賴它不需要的方法類間的依賴關(guān)系應(yīng)該建立在最小的接口上 26一個例子一個接口:內(nèi)容是雇傭者有吃飯和做工作的方法雇傭的男、女都可以使用該接口有一天,雇傭者來了一個機器人。機器人不吃飯27例子 -錯誤

7、Interface IWorkervoid eat();void work();Class Worker:IWorker public void eat ()/eat 相關(guān)代碼 public void work()/work相關(guān)代碼28ISP例子的缺陷胖接口,造成了對接口的污染如何解決?客戶端不應(yīng)該依賴它不需要的方法 類間的依賴關(guān)系應(yīng)該建立在最小的接口上 一個接口只做一件事29例子-符合ISPInterface IWorkerEat void eat();Interface IWorkerWorkvoid work();Class Worker:IWorkerEat,IWorkerWork p

8、ublic void eat ()/eat 相關(guān)代碼 public void work()/work相關(guān)代碼Class Robot:IWorkerWork public void work() /work相關(guān)代碼面向接口編程,而非實現(xiàn)編程30ISP胖接口容易導(dǎo)致啞方法瘦接口更健康!31合成/聚合復(fù)用原則Composite/Aggregate Reuse PrincipleCARP 合成和聚合合成是強烈的關(guān)聯(lián),部分(將)和整體(主)生命周期一樣,整體(主)對部分(將)有支配權(quán),包括創(chuàng)建和銷毀。聚合是部分和整體的普通關(guān)聯(lián)32合成和聚合劉邦和韓信33CARP原則合成: class Personpri

9、vate Hand hand; public Person() hand = new Hand(); 34CARP原則聚合: class Person private Computer computer; private A a; public setComputer() computer = new Computer(); public setA() a= new a(); 35CARP原則盡量使用合成/聚合,而不是使用繼承 繼承的優(yōu)點新的實現(xiàn)較為容易,因為基類的大部分功能可以通過繼承的關(guān)系自動進入子類。 修改和擴展繼承而來的實現(xiàn)較為容易。繼承的缺點繼承將基類的實現(xiàn)細節(jié)暴露給子類。稱“白箱”

10、復(fù)用。 如果基類發(fā)生改變,那么子類的實現(xiàn)也不得不發(fā)生改變。 多繼承不利于維護36CARP特點優(yōu)點:依賴少,條條框框的限制少幾乎可以用到任何環(huán)境中容易實現(xiàn)修改和擴展容易缺點:對象多,需要管理37迪米特原則The Law of DemeterLoD不要和陌生人說話又叫最少知識原則小國寡民,鄰國相望,雞犬之聲相聞,民至老死,不相往來38迪米特法則一個對象應(yīng)當對其他對象有盡可能少的了解,不和陌生人說話最少知識、不相往來talk only to your immediate friends 建議多使用Private和Protect,而少使用public39迪米特法則40迪米特法則的優(yōu)點相當弱的類耦合利于復(fù)用只要有可能類就可以設(shè)計成不變類41迪米特法則的缺點造成大量的小方法,散落在系統(tǒng)的各個角落這些方法僅僅是傳遞間接的調(diào)用容易引起第一次了解系統(tǒng)人的困惑42迪米特法則和設(shè)計模式Faade模式和Mediator模式都符合迪米特法則43總結(jié)泛化、依賴、關(guān)聯(lián)、聚合、組合泛化(繼承)class Aclass B : A依賴:class A public void Function(B b)class B 44關(guān)聯(lián)class A B b = new B();class B 聚合class A B b = new B(); C c = new C();class B clas

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論