国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

設(shè)計(jì)模式的原則

2019-11-18 12:17:51
字體:
供稿:網(wǎng)友

  近年來,大家都開始注重設(shè)計(jì)模式。那么,到底我們?yōu)槭裁匆迷O(shè)計(jì)模式呢?這么多設(shè)計(jì)模式為什么要這么設(shè)計(jì)呢?說實(shí)話,以前我還真沒搞清楚。就是看大家一口一個(gè)"Design pattern",心就有點(diǎn)發(fā)虛。于是就買了本"四人幫"的設(shè)計(jì)模式,結(jié)果看得似懂非懂:看得時(shí)候似乎是懂了,過一會(huì)就忘了。可能是本人比較"愚鈍"吧:))最近,有了點(diǎn)感悟。"獨(dú)樂不如眾樂",與大家分享一下,還望指教!
  為什么要提倡"Design Pattern"呢?根本原因是為了代碼復(fù)用,增加可維護(hù)性。那么怎么才能實(shí)現(xiàn)代碼復(fù)用呢?OO界有前輩的幾個(gè)原則:"開-閉"原則(Open Closed PRincipal)、里氏代換原則、合成復(fù)用原則。設(shè)計(jì)模式就是實(shí)現(xiàn)了這些原則,從而達(dá)到了代碼復(fù)用、增加可維護(hù)性的目的。
  
  一、"開-閉"原則
  
  此原則是由"Bertrand Meyer"提出的。原文是:"Software entities should be open for extension,but closed for modification"。就是說模塊應(yīng)對(duì)擴(kuò)展開放,而對(duì)修改關(guān)閉。模塊應(yīng)盡量在不修改原(是"原",指原來的代碼)代碼的情況下進(jìn)行擴(kuò)展。那么怎么擴(kuò)展呢?我們看工廠模式"factory pattern":假設(shè)中關(guān)村有一個(gè)賣盜版盤和毛片的小子,我們給他設(shè)計(jì)一"光盤銷售治理軟件"。我們應(yīng)該先設(shè)計(jì)一"光盤"接口。如圖:
  
  設(shè)計(jì)模式的原則
  
  而盜版盤和毛片是其子類。小子通過"DiscFactory"來治理這些光盤。代碼為:
  
  public class DiscFactory{  public static 光盤 getDisc(String name){    return (光盤)Class.forName(name).getInstance();  }}
  有人要買盜版盤,怎么實(shí)現(xiàn)呢?
  
  public class 小子{  public static void main(String[] args){    光盤 d=DiscFactory.getDisc("盜版盤");    光盤.賣();  }}
  
  假如有一天,這小子良心發(fā)現(xiàn)了,開始賣正版軟件。沒關(guān)系,我們只要再創(chuàng)建一個(gè)"光盤"的子類"正版軟件"就可以了。不需要修改原結(jié)構(gòu)和代碼。怎么樣?對(duì)擴(kuò)展開發(fā),對(duì)修改關(guān)閉。"開-閉原則"
  工廠模式是對(duì)具體產(chǎn)品進(jìn)行擴(kuò)展,有的項(xiàng)目可能需要更多的擴(kuò)展性,要對(duì)這個(gè)"工廠"也進(jìn)行擴(kuò)展,那就成了"抽象工廠模式"。
  
  二、里氏代換原則
  
  里氏代換原則是由"Barbara Liskov"提出的。假如調(diào)用的是父類的話,那么換成子類也完全可以運(yùn)行。比如:
  光盤 d=new 盜版盤();
  d.賣();
  現(xiàn)在要將"盜版盤"類改為"毛片"類,沒問題,完全可以運(yùn)行。java編譯程序會(huì)檢查程序是否符合里氏代換原則。還記得java繼續(xù)的一個(gè)原則嗎?子類overload方法的訪問權(quán)限不能小于父類對(duì)應(yīng)方法的訪問權(quán)限。比如"光盤"中的方法"賣"訪問權(quán)限是"public",那么"盜版盤"和"毛片"中的"賣"方法就不能是package或private,編譯不能通過。為什么要這樣呢?你想啊:假如"盜版盤"的"賣"方法是private。那么下面這段代碼就不能執(zhí)行了:
  光盤 d=new 盜版盤();
  d.賣();
  可以說:里氏代換原則是繼續(xù)復(fù)用的一個(gè)基礎(chǔ)。
  
  三、合成復(fù)用原則
  
  就是說要少用繼續(xù),多用合成關(guān)系來實(shí)現(xiàn)。我曾經(jīng)這樣寫過程序:有幾個(gè)類要與數(shù)據(jù)庫打交道,就寫了一個(gè)數(shù)據(jù)庫操作的類,然后別的跟數(shù)據(jù)庫打交道的類都繼續(xù)這個(gè)。結(jié)果后來,我修改了數(shù)據(jù)庫操作類的一個(gè)方法,各個(gè)類都需要改動(dòng)。"牽一發(fā)而動(dòng)全身"!面向?qū)ο笫且巡▌?dòng)限制在盡量小的范圍。
  
  
  在Java中,應(yīng)盡量針對(duì)Interface編程,而非實(shí)現(xiàn)類。這樣,更換子類不會(huì)影響調(diào)用它方法的代碼。要讓各個(gè)類盡可能少的跟別人聯(lián)系,"不要與生疏人說話"。這樣,城門失火,才不至于殃及池魚。擴(kuò)展性和維護(hù)性才能提高
  
  理解了這些原則,再看設(shè)計(jì)模式,只是在具體問題上怎么實(shí)現(xiàn)這些原則而已。張無忌學(xué)太極拳,忘記了所有招式,打倒了"玄冪二老",所謂"心中無招"。設(shè)計(jì)模式可謂招數(shù),假如先學(xué)通了各種模式,又忘掉了所有模式而隨心所欲,可謂OO之最高境界。呵呵,搞笑,搞笑!
  
  這是我的一點(diǎn)心得,大家可能理解得更深刻。還望指教!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 正蓝旗| 中卫市| 广昌县| 孟州市| 佳木斯市| 甘孜| 和林格尔县| 宜兰县| 沂源县| 二连浩特市| 汾西县| 新丰县| 巴马| 都江堰市| 鹿邑县| 张家口市| 张家川| 贵州省| 阜宁县| 永城市| 广河县| 临沧市| 潜山县| 克东县| 桐梓县| 佛冈县| 凤冈县| 西华县| 乡城县| 泾川县| 石屏县| 九江市| 景泰县| 乡城县| 焦作市| 定结县| 清涧县| 南靖县| 吉林市| 建平县| 都兰县|