欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
設計模式學(xué)習筆記(一)——面向對象設計模式與原則

 今天聽(tīng)了《C#面向對象設計模式縱橫談(1):面向對象設計模式與原則》課程??偨Y了一些筆記。
 首先介紹了什么是設計模式:設計模式描述了軟件設計過(guò)程中某一類(lèi)常見(jiàn)問(wèn)題的一般性的解決方案。
 下面主要討論面向對象設計模式。
 面向對象設計模式描述了類(lèi)與相互通信的對象之間的組織關(guān)系。目的是應對變化、提高復用、減少改變。
 那到底什么是對象:
  1、從概念層面講,對象是某種擁有職責的抽象;
  2、從規格層面講,對象是一系列可以被其他對象使用的公共接口;
  3、從語(yǔ)言實(shí)現層面來(lái)看,對象封裝了代碼和數據(也就是行為和狀態(tài))。
 對于這三點(diǎn),我理解最深的應該是第三點(diǎn)。這可能和我把大多精力放在了代碼實(shí)現上有關(guān),然而忽略了編程的的思想。如果我們拋開(kāi)代碼的實(shí)現來(lái)看對象的概念,那么它應該就像一個(gè)具體的物體,比如說(shuō):榔頭,從概念層面講,榔頭有它的職責,也就是它是做什么用的(用來(lái)砸釘子,當然還會(huì )有其他用途,如防身),從規格層面講,比如人使用榔頭砸釘子。
 面向對象的設計模式有三大原則:
  1、這對接口編程,而不是針對實(shí)現編程。在知道設計模式之前,我對接口的出現很不理解。不明白為什么這個(gè)什么都不能實(shí)現的東西會(huì )存在,當然,也對多態(tài)表示茫然。實(shí)際上我是還沒(méi)有理解面向對象編程的思想。在對設計模式略有了解后發(fā)現接口的確是一個(gè)好東西,用它實(shí)現多態(tài)的確減少了代碼的修改。
 比如說(shuō)在《Head First DesignPatterns》中有一個(gè)例子,說(shuō)一個(gè)有關(guān)鴨子的游戲。游戲當中有很多種的鴨子,如:野鴨,木頭鴨,鴨子模型。我們首先會(huì )想到做一個(gè)抽象類(lèi):abstract class Duck,Duck當中有很多的抽象屬性和方法,如quack。我們用子類(lèi)繼承的時(shí)候都會(huì )實(shí)例化這個(gè)方法。
 public abstract class Duck
 {
  public abstract void quack()
 }
 
 public class MallardDuck:Duck
 {
  public override void quack()
  {
   Console.Write("I can quack");
  }
 }
當程序成型后,我們有了很多種鴨子,突然,我們發(fā)現有的鴨子會(huì )飛,我們會(huì )在Duck中在加上一個(gè)抽象方法abstract voidfly();于是我們不得不在所有的子類(lèi)當中添加fly的實(shí)現,有人會(huì )說(shuō),如果我們在Duck中直接添加fly的實(shí)現,不久不用在子類(lèi)中添加實(shí)現了嗎?那老板就該問(wèn)你:你見(jiàn)過(guò)木頭鴨子滿(mǎn)天飛(哦,天??!木頭鴨子也飛起來(lái)了,這是什么世界?。?。對不起老板,現在咱們都見(jiàn)到了。
 這時(shí)我們換一種想法,如果我們把這些方法都提取出來(lái),把它變成Duck的成員,好像問(wèn)題就會(huì )簡(jiǎn)單些。
 哈哈,好像扯的有點(diǎn)遠了,現在回來(lái)接著(zhù)記我的筆記。
  2、優(yōu)先使用對象組合,而不是類(lèi)的繼承。
 這就使說(shuō)多使用“has a”,少使用“is a”,哈哈,我又想說(shuō)回剛才的例子。換個(gè)角度考慮Duck及其功能,我們設計一個(gè)fly的接口和一些具體的飛行方法。
 public interface FlyBehavior
 {
  void fly();
 }

 public class FlyWithWing:FlyBehavior
 {
  public void fly()
  {
   Console.Write("I can fly\n");
  }
 }

 public class FlyNoWay:FlyBehavior
 {
  public void fly()
  {
   Console.Write("I can‘t fly\n");
  }
 } 
 好了,對于Duck來(lái)說(shuō),現在它應該有一個(gè)(has a)fly的方法
 public abstract class Duck
 {
  public Duck()
  {}
  public FlyBehavior flybehavior; 
 }
 現在我們再來(lái)實(shí)現兩種鴨子
 public class ModelDuck:Duck
 {
  public ModelDuck()
  {
   flybehavior = new FlyNoWay();
  }
 }
 
 public class MallardDuck:Duck
 {
  public MallardDuck()
  {
   flybehavior = new FlyWithWing();
  }
 }
 這樣如果要是在加上某種行為的話(huà),我們就不必在每一種鴨子上下功夫。把注意力放在我們關(guān)心的鴨子品種上(別太使勁關(guān)注,小心禽流感,“阿切!”)。
  3、封裝變化點(diǎn),實(shí)現松耦合,這點(diǎn)不用多說(shuō)了。
 課程中提到,編碼當中的設計模式使用不是我們在編程之初就定下來(lái)的,應該是重構得到設計模式(Refactoring to Patterns)。哦,原來(lái)是這樣,也好理解。在編碼中遇到問(wèn)題,然后想想應對方式。哈哈,我原來(lái)認為開(kāi)始編程時(shí)就指定我們用什么設計模式呢。
 下面說(shuō)說(shuō)設計原則:
  1、單一職責原則(SRP):一個(gè)類(lèi)應僅有一個(gè)引起它變化的原因。
  2、開(kāi)放封閉原則(OCP):類(lèi)模塊應可擴展,不可修改。這里要說(shuō)明一下,擴展和修改是不同的。比如:我們要在加一種ModelDuck,那么我們寫(xiě)一個(gè)ModelDuck的類(lèi)繼承Duck,這叫擴展,不是修改。什么是修改,就好像我們開(kāi)始說(shuō)的那種作法,為了加一個(gè)fly的功能,我們要把所有的子類(lèi)中加入不同的實(shí)現,這叫修改。
  3、Liskov替換原則:子類(lèi)可替換基類(lèi)。
  4、依賴(lài)倒置原則:高層模塊不依賴(lài)于低層模塊,二者都依賴(lài)于抽象。還是剛才的例子:Duck是一個(gè)高層模塊,fly是低層模塊。Duck不依賴(lài)于fly,高層模塊的改變慢,而低層模塊的改變慢。
     抽象不應依賴(lài)于實(shí)現細節,實(shí)現細節應依賴(lài)于抽象。fly是一個(gè)抽象,它不依賴(lài)如何飛行。
  5、接口隔離原則:不強迫客戶(hù)程序依賴(lài)于它們不用的方法(有道理,木頭鴨子不會(huì )飛為什么要讓它實(shí)現飛的功能。)
  最后有人提問(wèn)接口和抽象類(lèi)的區別:
   接口可以多繼承,抽象類(lèi)只能但繼承。接口定義組件間的合同。使用抽象類(lèi)為一個(gè)is a的關(guān)系。

posted on 2006-03-29 17:00 KiddLee 閱讀(1979) 評論(12)  編輯 收藏 引用 網(wǎng)摘 所屬分類(lèi): 設計模式

FeedBack:
# 
建議作者使用摘要方式發(fā)布, 請參考: http://www.cnblogs.com/dudu/articles/52480.aspx 第四項。  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-03-29 17:07 Terrylee
呵呵,總結得不錯

有一個(gè)筆誤:應該是“開(kāi)放封閉原則”,不是“開(kāi)發(fā)封閉原則”  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-03-29 17:55 csdn shit!
這個(gè)講師對抽象類(lèi)理解的不到位。
其實(shí)在實(shí)際編程中抽象類(lèi)的應用不比接口少。原因在于它既可以定義供繼承的方法(避免重復),又可以象接口一樣規定必須實(shí)現的方法。ms也是對抽象類(lèi)推崇備至的。  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-03-29 23:13 Dflying Chen
接口實(shí)現契約,是不變的。繼承實(shí)現擴展與重用,是可變的。  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-04-22 14:50 ivan
其實(shí)上面那個(gè)例子舉得不是很好,抽象類(lèi)應該是可實(shí)現抽象方法或都不實(shí)現抽象方法的,如果有的鴨子要飛那么就調用抽象類(lèi)中的fly的方法.這樣都不用去修改其它子類(lèi)呀,為什么要說(shuō)成要修改其它子類(lèi)的呢~!  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-04-22 16:08 kid_li
@ivan
抽象類(lèi)中的抽象方法如果不被繼承的子類(lèi)實(shí)現,那么子類(lèi)還是一個(gè)抽象類(lèi),也就無(wú)法實(shí)例化,從模型的角度看,如果某個(gè)屬性或方法與這個(gè)模型的本身沒(méi)有關(guān)系,那么這個(gè)模型為什么要擁有這個(gè)屬性或方法呢?例如:木鴨子不會(huì )飛,就不應該它實(shí)現fly的方法。  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-04-22 16:19 kid_li
@ivan
上面說(shuō)的例子是游戲的設計者在第一版游戲中沒(méi)有用到鴨子飛行的方法,但是在第二版游戲中需要添加這個(gè)功能,如果在抽象類(lèi)中加入fly的話(huà),所有的子類(lèi)都要對這個(gè)方法就行實(shí)現(不會(huì )飛的鴨子類(lèi)不應該要變動(dòng)),這是因為繼承的依賴(lài)性。如果我們改成“has a”的關(guān)系,那么問(wèn)題就簡(jiǎn)單多了  回復  更多評論
  
# 請教幾個(gè)問(wèn)題 2006-05-16 16:25 ssgrl
有幾個(gè)設計模式方面的問(wèn)題想請教一下:

1、JAVA語(yǔ)言不支持泛型技術(shù),那么如何在JAVA中構造同構容器?請簡(jiǎn)述思路。

2、當我們設計一個(gè)應用程序的用戶(hù)界面時(shí),某些情況下可以使用合成模式,請舉一例。

3、在足球賽中,參與者有球隊,球員,教練,比賽,裁判等。一個(gè)球隊由11名球員和一個(gè)教練組成(為簡(jiǎn)化,我們不考慮替補),每場(chǎng)比賽有兩個(gè)隊,一位裁判(為簡(jiǎn)化,我們僅考慮主裁判),整個(gè)比賽有N場(chǎng)比賽(為簡(jiǎn)化,我們不考慮小組賽,淘汰賽等細節區別),請對這個(gè)案例建立對象模型(描述建立哪些類(lèi)或對象,彼此的關(guān)系)。請使用文字描述,并畫(huà)出UML圖。

4、為保護公眾安全,英國決定部署交通系統聯(lián)合防護網(wǎng):如果任何地方發(fā)生了某類(lèi)可疑事件,這個(gè)消息將會(huì )被立即發(fā)送給網(wǎng)絡(luò )內所有機構,注意:網(wǎng)絡(luò )內的機構是動(dòng)態(tài)變化的,可以加入或者退出,可疑事件的類(lèi)型也是可能動(dòng)態(tài)擴展的。請使用面向對象的設計模式,簡(jiǎn)述此類(lèi)需求的解決方案。
  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-05-17 11:09 kid_li
@ssgrl
1、聽(tīng)了一些C#2.0的東西,其中提到了Java中的范型實(shí)現,據說(shuō)在Java1.5中已實(shí)現,但并不是在虛擬機層面上,而是編譯器層上的,也只是用java.lang中的object類(lèi)型進(jìn)行類(lèi)似裝箱拆箱,也就是對類(lèi)型的轉換。但是這種方式有一定的危險性,而且性能不是很理想。危險性在于,在將object類(lèi)型轉換成其他類(lèi)型的時(shí)候,你必須確定object對象能夠轉換,性能不高是因為,這種轉換畢竟不如范型的類(lèi)型參數效率高。
當然,對于Java,我了解得不多,以后我會(huì )加強這方面的學(xué)習。
2、對于合成模式,大概看了一下,給我很重要的感覺(jué)是它可以將“一對多”的關(guān)系轉化為“一對一”的關(guān)系解決。我覺(jué)得,類(lèi)似樹(shù)形的實(shí)現可以采用這種模式。我是剛開(kāi)始學(xué)習設計模式,設計模式的Blog也在繼續寫(xiě),今后寫(xiě)到合成模式時(shí),我想我會(huì )有更深的理解,到時(shí)候,我會(huì )再好好想想你的問(wèn)題。
對于你省下的問(wèn)題,比較具體,現在工作有點(diǎn)忙。如果不急,近期我會(huì )發(fā)Email給你我的想法  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-06-04 21:57 main
最近一直在聽(tīng)下載的視頻資料,多交流,一起分享!  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-07-18 13:59 大雁
作者提到:"突然,我們發(fā)現有的鴨子會(huì )飛,我們會(huì )在Duck中在加上一個(gè)抽象方法abstract voidfly();于是我們不得不在所有的子類(lèi)當中添加fly的實(shí)現",這里我有點(diǎn)不解,既然是某些鴨子會(huì )飛,如果加了抽象方法那不是所有的實(shí)現子類(lèi)都要實(shí)現飛的方法?
作者還提到“如果我們把這些方法都提取出來(lái),把它變成Duck的成員” 那不所有的鴨子子類(lèi)都有飛的屬性?
我覺(jué)得在這里可以單獨設計一個(gè)接口,會(huì )飛的鴨子就實(shí)現這個(gè)接口不就行了  回復  更多評論
  
# re: 設計模式學(xué)習筆記(一)——面向對象設計模式與原則 2006-07-18 14:36 kid_li
@大雁
例子是為了說(shuō)明在抽象類(lèi)中加入抽象方法或方法,以造成了對于子模塊中出現的一些問(wèn)題,也就是繼承增加了父子模塊的偶合度。設計模式中希望用組合的方式代替繼承方式,以減小模塊間的偶合。
對于第一個(gè)問(wèn)題,哈哈,子類(lèi)繼承父類(lèi)后,要實(shí)現父類(lèi)中的所有抽象方法,否則此子類(lèi)還是一個(gè)抽象類(lèi)。
對于第二個(gè)問(wèn)題,你說(shuō)的有道理,設計模式中提倡面向接口編程  回復  更多評論
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
【設計模式】設計原則--面向接口編程你理解的對嗎?
設計模式隨筆系列:鴨子-策略模式(Strategy)[原] - Justin's Tec...
設計模式之歡迎來(lái)到設計模式世界(二)
WEB架構師成長(cháng)系列索引
我給媳婦解釋設計模式:第一部分
分類(lèi):
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久