最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

開放封閉原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年08月09日 10:36:25   作者:yysyangyangyangshan  
這篇文章主要介紹了開放封閉原則,開放-封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

定義:軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該是可以擴(kuò)展的,但是不可修改。對(duì)于擴(kuò)展是開放的,對(duì)于更改是封閉的。關(guān)鍵是抽象,將一個(gè)功能的通用部分和實(shí)現(xiàn)細(xì)節(jié)部分清晰的分離開來。

這里要求我們寫代碼要有抽象的概念。什么是抽象?指由實(shí)體抽離出概念的思考過程。就是從眾多的對(duì)象中抽離出共同的本質(zhì)的特征。在寫代碼的過程中,需要抽象類的地方,只需要抓住這個(gè)類的本質(zhì)功能,不要老想著它在這個(gè)工程中的具體功能。

我們繼續(xù)看開放封閉原則,這個(gè)原則要求,將一個(gè)功能的共用部分和實(shí)現(xiàn)部分清晰地分離開來。因?yàn)樵谧畛醮罱軜?gòu)的時(shí)候你不能預(yù)測(cè)到所有將要發(fā)生的變化,那么這個(gè)類也就不是一塵不變的,隨著在各個(gè)模塊中具體實(shí)現(xiàn)的時(shí)候,你發(fā)現(xiàn)抽象的類適合這個(gè)功能,但是對(duì)另一個(gè)功能又不適合。那么是否要返回去修改抽象類呢?這個(gè)代價(jià)是很大的,需要重新全盤思考,還要調(diào)整具體細(xì)節(jié)。如果程序還沒發(fā)布還好一些,一旦程序發(fā)布了,那么返回修改抽象類,影響將更大。所以在開始抽象的時(shí)候就要防止這樣的現(xiàn)象發(fā)生,要遵循開放封閉原則。抽象類、接口是一種標(biāo)準(zhǔn),在程序中一旦定義好,就不能輕易去修改,需求有變化,怎么辦呢?可以擴(kuò)展這個(gè)接口,重寫方法,或者繼承后增加新的方法,但是一定不要去修改。

下面用兩個(gè)例子來說明開放封閉原則。

1、連接數(shù)據(jù)庫(kù)為例。

比如在程序中用到的不同類型的數(shù)據(jù)庫(kù)連接,Access和Oracle。直接連接如下:

class ConnectAccess 
{ 
  public string ConnectString() 
  { 
    string dataPath = "數(shù)據(jù)庫(kù)路徑"; 
    return string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Persist Security Info=True;Jet OLEDB:Database Password={1}", dataPath, "密碼"); 
  } 
} 
class ConnectOracle 
{ 
  public string ConnectString() 
  { 
    return @"server=localhost;database=命名空間;uid=用戶名;pwd=密碼"; 
  } 
} 

調(diào)用

static void Main(string[] args) 
 { 
   //連接Access 
  ConnectAccess connAccess = new ConnectAccess(); 
 
  OleDbConnection accessConnection = new OleDbConnection(connAccessConnectString()); 
 
   //連接Oracle 
  ConnectOracle connOracle = new ConnectOracle(); 
 
  OracleConnection oracleConnection = new OracleConnection(connOracleConnectString()); 
 } 

這樣每次都要去考慮OleDbConnection的參數(shù)到底用哪個(gè)。下面修改一下。抽象一個(gè)接口。

interface ConnectDataBase 
{ 
  string ConnectString(); 
} 
 
class ConnectAccess : ConnectDataBase 
{ 
  #region ConnectDataBase 成員 
 
  public string ConnectString() 
  { 
    string dataPath = "數(shù)據(jù)庫(kù)路徑"; 
 
    return stringFormat("Provider=MicrosoftJetOLEDB0;Data Source={0};Persist Security Info=True;Jet OLEDB:Database Password={1}", dataPath, "密碼"); 
  } 
 
  #endregion 
} 
 
class ConnectOracle : ConnectDataBase 
{ 
  #region ConnectDataBase 成員 
 
  public string ConnectString() 
  { 
    return @"server=localhost;database=命名空間;uid=用戶名;pwd=密碼"; 
  } 
 
  #endregion 
} 

調(diào)用

static void Main(string[] args) 
{ 
  ConnectDataBase conn = null; 
 
  //連接Access 
  conn = new ConnectAccess(); 
 
  OleDbConnection accessConnection = new OleDbConnection(connConnectString()); 
 
  //連接Oracle 
  conn = new ConnectOracle(); 
 
  OracleConnection oracleConnection = new OracleConnection(connConnectString()); 
} 

改過后,只需關(guān)心conn用哪一個(gè)類實(shí)例化,就可以了。不過大家可能看到,由于Oracle的連接必須OracleConnection,可能優(yōu)勢(shì)不容易看出來。

2、基本類型作為方法參數(shù)為例。

一般的設(shè)計(jì)原則之所以強(qiáng)調(diào)方法參數(shù)盡量避免基本類型,原因正在于此。比較如下兩個(gè)方法定義:

//定義1  
bool Connect(string userName, string password, string wifiAddress, int port) 
{ 
  return false; 
} 
//定義2  
bool Connect(Account account) 
{ 
  return false; 
} 
public class Account 
{ 
  public string UserName 
  { 
    get; 
    set; 
  } 
  public string Password 
  { 
    get; 
    set; 
  } 
  public string WifiAddress 
  { 
    get; 
    set; 
  } 
  public int Port 
  { 
    get; 
    set; 
  } 
} 

相比較而言,定義2多了一個(gè)Account類的定義,Connect()方法明顯更加穩(wěn)定。如果Connect()方法wifiAddress發(fā)生改變,定義1必須修改該方法的接口,對(duì)應(yīng)的,所有調(diào)用Connect()方法的對(duì)象都會(huì)受到影響;而定義2只需要修改Account類,由于Connect()方法的接口保持不變,而對(duì)于Connect()方法的調(diào)用者并不需wifiAddress,這樣的修改就完全不會(huì)影響調(diào)用者,從而降低需求變化帶來的影響。

總之開放封閉原則最關(guān)鍵的是抽象,但是也并不是說一旦抽象接口、類確定就一定不能修改。只是,我們?cè)诔橄蟮臅r(shí)候就要全面思考,爭(zhēng)取做到不用修改,一旦需求有變化,只需在實(shí)現(xiàn)的時(shí)候有變動(dòng)。當(dāng)然,需求是千變?nèi)f化的,一旦需要改動(dòng)抽象的部分,那么只要前面嚴(yán)格遵循了該原則,影響也會(huì)小得多。當(dāng)然了如果修改了,一定要進(jìn)行單元測(cè)試,凡是用到的地方都要測(cè)試正確。

相關(guān)文章

  • Java時(shí)間工具類Date的常用處理方法

    Java時(shí)間工具類Date的常用處理方法

    在Java中獲取當(dāng)前時(shí)間,可以使用 java.util.Date 類和 java.util.Calendar 類完成。其中,Date 類主要封裝了系統(tǒng)的日期和時(shí)間的信息,下面將詳細(xì)介紹Date類的常用處理方法,需要的可以參考一下
    2022-05-05
  • java Iterator.remove()實(shí)例方法分析

    java Iterator.remove()實(shí)例方法分析

    在本篇文章里小編給大家整理了一篇關(guān)于java Iterator.remove()實(shí)例方法分析,有興趣的朋友們跟著學(xué)習(xí)下。
    2021-01-01
  • java類的組成結(jié)構(gòu)詳解

    java類的組成結(jié)構(gòu)詳解

    大家好,本篇文章主要講的是java類的組成結(jié)構(gòu)詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java中字符串替換的幾種常用方法總結(jié)

    Java中字符串替換的幾種常用方法總結(jié)

    這篇文章主要介紹了Java中字符串替換的幾種常用方法,包括String類的replace、replaceAll和replaceFirst方法,使用StringBuilder或StringBuffer類,自定義替換方法,以及使用第三方庫(kù)如Apache?Commons?Lang,需要的朋友可以參考下
    2025-04-04
  • SpringBoot中Redis自動(dòng)配置的介紹、原理和使用詳解

    SpringBoot中Redis自動(dòng)配置的介紹、原理和使用詳解

    這篇文章主要介紹了SpringBoot中Redis自動(dòng)配置的介紹、原理和使用詳解,Redis是一種高性能的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù),它支持多種數(shù)據(jù)結(jié)構(gòu)和豐富的功能,如緩存、消息隊(duì)列、計(jì)數(shù)器、分布式鎖等,需要的朋友可以參考下
    2023-08-08
  • Java 無參數(shù)構(gòu)造函數(shù)的應(yīng)用

    Java 無參數(shù)構(gòu)造函數(shù)的應(yīng)用

    本篇文章主要介紹了Java 無參數(shù)構(gòu)造函數(shù)的應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java NIO服務(wù)器端開發(fā)詳解

    Java NIO服務(wù)器端開發(fā)詳解

    這篇文章主要介紹了Java NIO服務(wù)器端開發(fā)詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • JavaTCP上傳文本文件代碼

    JavaTCP上傳文本文件代碼

    今天小編就為大家分享一篇關(guān)于JavaTCP上傳文本文件代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Java實(shí)現(xiàn)生成pdf并解決表格分割的問題

    Java實(shí)現(xiàn)生成pdf并解決表格分割的問題

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)生成pdf,并解決表格分割的問題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • feign客戶端設(shè)置超時(shí)時(shí)間操作

    feign客戶端設(shè)置超時(shí)時(shí)間操作

    這篇文章主要介紹了feign客戶端設(shè)置超時(shí)時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評(píng)論

大理市| 陵川县| 丰宁| 尚志市| 明水县| 泽普县| 吴堡县| 新建县| 高雄市| 永胜县| 新昌县| 罗江县| 体育| 乐清市| 三原县| 虹口区| 蒲江县| 永靖县| 忻州市| 广水市| 兖州市| 陆良县| 东源县| 栖霞市| 昌邑市| 集贤县| 西吉县| 桃源县| 罗田县| 康平县| 交城县| 灵武市| 寻乌县| 松江区| 宜兰县| 北流市| 锡林郭勒盟| 浦江县| 观塘区| 讷河市| 潍坊市|