乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      設(shè)計(jì)模式學(xué)習(xí)筆記(一)——面向?qū)ο笤O(shè)計(jì)模式與原則

       skywood 2007-08-06

       今天聽(tīng)了《C#面向?qū)ο笤O(shè)計(jì)模式縱橫談(1):面向?qū)ο笤O(shè)計(jì)模式與原則》課程??偨Y(jié)了一些筆記。
       首先介紹了什么是設(shè)計(jì)模式:設(shè)計(jì)模式描述了軟件設(shè)計(jì)過(guò)程中某一類(lèi)常見(jiàn)問(wèn)題的一般性的解決方案。
       下面主要討論面向?qū)ο笤O(shè)計(jì)模式。
       面向?qū)ο笤O(shè)計(jì)模式描述了類(lèi)與相互通信的對(duì)象之間的組織關(guān)系。目的是應(yīng)對(duì)變化、提高復(fù)用、減少改變。
       那到底什么是對(duì)象:
        1、從概念層面講,對(duì)象是某種擁有職責(zé)的抽象;
        2、從規(guī)格層面講,對(duì)象是一系列可以被其他對(duì)象使用的公共接口;
        3、從語(yǔ)言實(shí)現(xiàn)層面來(lái)看,對(duì)象封裝了代碼和數(shù)據(jù)(也就是行為和狀態(tài))。
        對(duì)于這三點(diǎn),我理解最深的應(yīng)該是第三點(diǎn)。這可能和我把大多精力放在了代碼實(shí)現(xiàn)上有關(guān),然而忽略了編程的的思想。如果我們拋開(kāi)代碼的實(shí)現(xiàn)來(lái)看對(duì)象的概念,那 么它應(yīng)該就像一個(gè)具體的物體,比如說(shuō):榔頭,從概念層面講,榔頭有它的職責(zé),也就是它是做什么用的(用來(lái)砸釘子,當(dāng)然還會(huì)有其他用途,如防身),從規(guī)格層 面講,比如人使用榔頭砸釘子。
       面向?qū)ο蟮脑O(shè)計(jì)模式有三大原則:
        1、這對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。在知道設(shè)計(jì)模式之前,我對(duì)接 口的出現(xiàn)很不理解。不明白為什么這個(gè)什么都不能實(shí)現(xiàn)的東西會(huì)存在,當(dāng)然,也對(duì)多態(tài)表示茫然。實(shí)際上我是還沒(méi)有理解面向?qū)ο缶幊痰乃枷?。在?duì)設(shè)計(jì)模式略有了 解后發(fā)現(xiàn)接口的確是一個(gè)好東西,用它實(shí)現(xiàn)多態(tài)的確減少了代碼的修改。
       比如說(shuō)在《Head First Design Patterns》中有一個(gè)例子,說(shuō)一個(gè)有關(guān)鴨子的游戲。游戲當(dāng)中有很多種的鴨子,如:野鴨,木頭鴨,鴨子模型。我們首先會(huì)想到做一個(gè)抽象類(lèi): abstract class Duck,Duck當(dāng)中有很多的抽象屬性和方法,如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");
        }
       }
      當(dāng) 程序成型后,我們有了很多種鴨子,突然,我們發(fā)現(xiàn)有的鴨子會(huì)飛,我們會(huì)在Duck中在加上一個(gè)抽象方法abstract void fly();于是我們不得不在所有的子類(lèi)當(dāng)中添加fly的實(shí)現(xiàn),有人會(huì)說(shuō),如果我們?cè)贒uck中直接添加fly的實(shí)現(xiàn),不久不用在子類(lèi)中添加實(shí)現(xiàn)了嗎?那 老板就該問(wèn)你:你見(jiàn)過(guò)木頭鴨子滿天飛(哦,天?。∧绢^鴨子也飛起來(lái)了,這是什么世界?。?。對(duì)不起老板,現(xiàn)在咱們都見(jiàn)到了。
       這時(shí)我們換一種想法,如果我們把這些方法都提取出來(lái),把它變成Duck的成員,好像問(wèn)題就會(huì)簡(jiǎn)單些。
       哈哈,好像扯的有點(diǎn)遠(yuǎn)了,現(xiàn)在回來(lái)接著記我的筆記。
        2、優(yōu)先使用對(duì)象組合,而不是類(lèi)的繼承。
       這就使說(shuō)多使用“has a”,少使用“is a”,哈哈,我又想說(shuō)回剛才的例子。換個(gè)角度考慮Duck及其功能,我們?cè)O(shè)計(jì)一個(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");
        }
       } 
       好了,對(duì)于Duck來(lái)說(shuō),現(xiàn)在它應(yīng)該有一個(gè)(has a)fly的方法
       public abstract class Duck
       {
        public Duck()
        {}
        public FlyBehavior flybehavior; 
       }
       現(xiàn)在我們?cè)賮?lái)實(shí)現(xiàn)兩種鴨子
       public class ModelDuck:Duck
       {
        public ModelDuck()
        {
         flybehavior = new FlyNoWay();
        }
       }
       
       public class MallardDuck:Duck
       {
        public MallardDuck()
        {
         flybehavior = new FlyWithWing();
        }
       }
       這樣如果要是在加上某種行為的話,我們就不必在每一種鴨子上下功夫。把注意力放在我們關(guān)心的鴨子品種上(別太使勁關(guān)注,小心禽流感,“阿切!”)。
        3、封裝變化點(diǎn),實(shí)現(xiàn)松耦合,這點(diǎn)不用多說(shuō)了。
       課程中提到,編碼當(dāng)中的設(shè)計(jì)模式使用不是我們?cè)诰幊讨蹙投ㄏ聛?lái)的,應(yīng)該是重構(gòu)得到設(shè)計(jì)模式(Refactoring to Patterns)。哦,原來(lái)是這樣,也好理解。在編碼中遇到問(wèn)題,然后想想應(yīng)對(duì)方式。哈哈,我原來(lái)認(rèn)為開(kāi)始編程時(shí)就指定我們用什么設(shè)計(jì)模式呢。
       下面說(shuō)說(shuō)設(shè)計(jì)原則:
        1、單一職責(zé)原則(SRP):一個(gè)類(lèi)應(yīng)僅有一個(gè)引起它變化的原因。
        2、 開(kāi)放封閉原則(OCP):類(lèi)模塊應(yīng)可擴(kuò)展,不可修改。這里要說(shuō)明一下,擴(kuò)展和修改是不同的。比如:我們要在加一種ModelDuck,那么我們寫(xiě)一個(gè) ModelDuck的類(lèi)繼承Duck,這叫擴(kuò)展,不是修改。什么是修改,就好像我們開(kāi)始說(shuō)的那種作法,為了加一個(gè)fly的功能,我們要把所有的子類(lèi)中加入 不同的實(shí)現(xiàn),這叫修改。
        3、Liskov替換原則:子類(lèi)可替換基類(lèi)。
        4、依賴(lài)倒置原則:高層模塊不依賴(lài)于低層模塊,二者都依賴(lài)于抽象。還是剛才的例子:Duck是一個(gè)高層模塊,fly是低層模塊。Duck不依賴(lài)于fly,高層模塊的改變慢,而低層模塊的改變慢。
           抽象不應(yīng)依賴(lài)于實(shí)現(xiàn)細(xì)節(jié),實(shí)現(xiàn)細(xì)節(jié)應(yīng)依賴(lài)于抽象。fly是一個(gè)抽象,它不依賴(lài)如何飛行。
        5、接口隔離原則:不強(qiáng)迫客戶程序依賴(lài)于它們不用的方法(有道理,木頭鴨子不會(huì)飛為什么要讓它實(shí)現(xiàn)飛的功能。)
        最后有人提問(wèn)接口和抽象類(lèi)的區(qū)別:
         接口可以多繼承,抽象類(lèi)只能但繼承。接口定義組件間的合同。使用抽象類(lèi)為一個(gè)is a的關(guān)系。

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

      FeedBack:
      # 
      建議作者使用摘要方式發(fā)布, 請(qǐng)參考: http://www.cnblogs.com/dudu/articles/52480.aspx 第四項(xiàng)。  回復(fù)  更多評(píng)論
        
      # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(一)——面向?qū)ο笤O(shè)計(jì)模式與原則 2006-03-29 17:07 Terrylee
      呵呵,總結(jié)得不錯(cuò)

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

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

      2、當(dāng)我們?cè)O(shè)計(jì)一個(gè)應(yīng)用程序的用戶界面時(shí),某些情況下可以使用合成模式,請(qǐng)舉一例。

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

      4、為保護(hù)公眾安全,英國(guó)決定部署交通系統(tǒng)聯(lián)合防護(hù)網(wǎng):如果任何地方發(fā)生了某類(lèi)可疑事件,這個(gè)消息將會(huì)被立即發(fā)送給網(wǎng)絡(luò)內(nèi)所有機(jī)構(gòu),注意:網(wǎng)絡(luò)內(nèi) 的機(jī)構(gòu)是動(dòng)態(tài)變化的,可以加入或者退出,可疑事件的類(lèi)型也是可能動(dòng)態(tài)擴(kuò)展的。請(qǐng)使用面向?qū)ο蟮脑O(shè)計(jì)模式,簡(jiǎn)述此類(lèi)需求的解決方案。
        回復(fù)  更多評(píng)論
        
      # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(一)——面向?qū)ο笤O(shè)計(jì)模式與原則 2006-05-17 11:09 kid_li
      @ssgrl
      1、聽(tīng)了一些C#2.0的東西,其中提到了Java中的范型實(shí)現(xiàn),據(jù)說(shuō)在Java1.5中已實(shí)現(xiàn),但并不是在虛擬機(jī)層面上,而是編譯器層上的,也 只是用java.lang中的object類(lèi)型進(jìn)行類(lèi)似裝箱拆箱,也就是對(duì)類(lèi)型的轉(zhuǎn)換。但是這種方式有一定的危險(xiǎn)性,而且性能不是很理想。危險(xiǎn)性在于,在 將object類(lèi)型轉(zhuǎn)換成其他類(lèi)型的時(shí)候,你必須確定object對(duì)象能夠轉(zhuǎn)換,性能不高是因?yàn)?,這種轉(zhuǎn)換畢竟不如范型的類(lèi)型參數(shù)效率高。
      當(dāng)然,對(duì)于Java,我了解得不多,以后我會(huì)加強(qiáng)這方面的學(xué)習(xí)。
      2、對(duì)于合成模式,大概看了一下,給我很重要的感覺(jué)是它可以將“一對(duì)多”的關(guān)系轉(zhuǎn)化為“一對(duì)一”的關(guān)系解決。我覺(jué)得,類(lèi)似樹(shù)形的實(shí)現(xiàn)可以采用這種 模式。我是剛開(kāi)始學(xué)習(xí)設(shè)計(jì)模式,設(shè)計(jì)模式的Blog也在繼續(xù)寫(xiě),今后寫(xiě)到合成模式時(shí),我想我會(huì)有更深的理解,到時(shí)候,我會(huì)再好好想想你的問(wèn)題。
      對(duì)于你省下的問(wèn)題,比較具體,現(xiàn)在工作有點(diǎn)忙。如果不急,近期我會(huì)發(fā)Email給你我的想法  回復(fù)  更多評(píng)論
        
      # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(一)——面向?qū)ο笤O(shè)計(jì)模式與原則 2006-06-04 21:57 main
      最近一直在聽(tīng)下載的視頻資料,多交流,一起分享!  回復(fù)  更多評(píng)論
        
      # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(一)——面向?qū)ο笤O(shè)計(jì)模式與原則 2006-07-18 13:59 大雁
      作 者提到:"突然,我們發(fā)現(xiàn)有的鴨子會(huì)飛,我們會(huì)在Duck中在加上一個(gè)抽象方法abstract void fly();于是我們不得不在所有的子類(lèi)當(dāng)中添加fly的實(shí)現(xiàn)" ,這里我有點(diǎn)不解,既然是某些鴨子會(huì)飛,如果加了抽象方法那不是所有的實(shí)現(xiàn)子類(lèi)都要實(shí)現(xiàn)飛的方法?
      作者還提到“如果我們把這些方法都提取出來(lái),把它變成Duck的成員” 那不所有的鴨子子類(lèi)都有飛的屬性?
      我覺(jué)得在這里可以單獨(dú)設(shè)計(jì)一個(gè)接口,會(huì)飛的鴨子就實(shí)現(xiàn)這個(gè)接口不就行了  回復(fù)  更多評(píng)論
        
      # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(一)——面向?qū)ο笤O(shè)計(jì)模式與原則 2006-07-18 14:36 kid_li
      @大雁
      例子是為了說(shuō)明在抽象類(lèi)中加入抽象方法或方法,以造成了對(duì)于子模塊中出現(xiàn)的一些問(wèn)題,也就是繼承增加了父子模塊的偶合度。設(shè)計(jì)模式中希望用組合的方式代替繼承方式,以減小模塊間的偶合。
      對(duì)于第一個(gè)問(wèn)題,哈哈,子類(lèi)繼承父類(lèi)后,要實(shí)現(xiàn)父類(lèi)中的所有抽象方法,否則此子類(lèi)還是一個(gè)抽象類(lèi)。
      對(duì)于第二個(gè)問(wèn)題,你說(shuō)的有道理,設(shè)計(jì)模式中提倡面向接口編程  回復(fù)  更多評(píng)論

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多