欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析Java編程中設(shè)計模式的開閉原則的運用

 更新時間:2016年02月03日 11:35:12   作者:lixiang0522  
這篇文章主要介紹了解析Java編程中設(shè)計模式的開閉原則的運用,開閉原則多應(yīng)用于Java程序的擴展開發(fā)方面,需要的朋友可以參考下

開閉原則(Open Closed Principle)是Java世界里最基礎(chǔ)的設(shè)計原則,它指導(dǎo)我們?nèi)绾谓⒁粋€穩(wěn)定的、靈活的系統(tǒng)。

定義:

一個軟件實體如類、模塊和函數(shù)應(yīng)該對擴展開放,對修改關(guān)閉。

Softeware entities like classes,modules and functions should be open for extension but closed for modifications.

開閉原則的含義是說一個軟件實體應(yīng)該通過擴展來實現(xiàn)變化,而不是通過修改已有代碼來實現(xiàn)變化。

軟件實體包括以下幾個部分:

  • 項目或軟件產(chǎn)品中按照一定的邏輯規(guī)則劃分的模塊
  • 抽象和類
  • 方法

開閉原則是為軟件實體的未來事物而制定的對現(xiàn)行開發(fā)設(shè)計進行約束的一個原則。

注意:開閉原則對擴展開放,對修改關(guān)閉,并不意味著不做任何修改,低層模塊的變更,必然要有高層模塊進行耦合,否則就是一個孤立無意義的代碼片段了。


變化的類型:

  • 邏輯變化
  • 子模塊變化
  • 可見試圖變化

一個項目的基本路徑應(yīng)該是這樣的:項目開發(fā)、重構(gòu)、測試、投產(chǎn)、運維,其中的重構(gòu)可以對原有的設(shè)計和代碼進行修改,運維盡量減少對原有代碼修改,保持歷史代碼的純潔性,提高系統(tǒng)的穩(wěn)定性。


開閉原則的重要性:

1.開閉原則對測試的影響
開閉原則可是保持原有的測試代碼仍然能夠正常運行,我們只需要對擴展的代碼進行測試就可以了。

2.開閉原則可以提高復(fù)用性
在面向?qū)ο蟮脑O(shè)計中,所有的邏輯都是從原子邏輯組合而來的,而不是在一個類中獨立實現(xiàn)一個業(yè)務(wù)邏輯。只有這樣代碼才可以復(fù)用,粒度越小,被復(fù)用的可能性就越大。

3.開閉原則可以提高可維護性
面向?qū)ο箝_發(fā)的要求。
 

如何使用開閉原則:

1.抽象約束
第一,通過接口或者抽象類約束擴展,對擴展進行邊界限定,不允許出現(xiàn)在接口或抽象類中不存在的public方法;

第二,參數(shù)類型、引用對象盡量使用接口或者抽象類,而不是實現(xiàn)類;

第三,抽象層盡量保持穩(wěn)定,一旦確定即不允許修改。

2.元數(shù)據(jù)(metadata)控制模塊行為
元數(shù)據(jù)就是用來描述環(huán)境和數(shù)據(jù)的數(shù)據(jù),通俗地說就是配置參數(shù),參數(shù)可以從文件中獲得,也可以從數(shù)據(jù)庫中獲得。

Spring容器就是一個典型的元數(shù)據(jù)控制模塊行為的例子,其中達到極致的就是控制反轉(zhuǎn)(Inversion of Control)

3.制定項目章程
在一個團隊中,建立項目章程是非常重要的,因為章程中指定了所有人員都必須遵守的約定,對項目來說,約定優(yōu)于配置。

4.封裝變化
對變化的封裝包含兩層含義:

第一,將相同的變化封裝到一個接口或者抽象類中;

第二,將不同的變化封裝到不同的接口或抽象類中,不應(yīng)該有兩個不同的變化出現(xiàn)在同一個接口或抽象類中。

例子

下面來個例子,先是不好的例子:

class GraphicEditor { 
  public void drawShape(Shape s) { 
    if (s.m_type==1) 
      drawRectangle(s); 
    else if (s.m_type==2) 
      drawCircle(s); 
  } 
  public void drawCircle(Circle r) {....} 
  public void drawRectangle(Rectangle r) {....} 
 } 
  
 class Shape { 
  int m_type; 
 } 
  
 class Rectangle extends Shape { 
  Rectangle() { 
    super.m_type=1; 
  } 
 } 
  
 class Circle extends Shape { 
  Circle() { 
    super.m_type=2; 
  } 
 }  

當(dāng)我們要擴展一個形狀時,需要先了解GraphicEditor類,然后在drawShape中添加新的類型,然后再添加函數(shù)。下面是改進后的代碼:

class GraphicEditor { 
  public void drawShape(Shape s) { 
    s.draw(); 
  } 
 } 
  
 class Shape { 
  abstract void draw(); 
 } 
  
 class Rectangle extends Shape { 
  public void draw() { 
    // draw the rectangle 
  } 
 }  


不需要了解繪制邏輯,把具體實現(xiàn)放到了子類。

總結(jié):
1. 遵守開閉原則可以提高軟件擴展性和維護性。
2. 大部分的設(shè)計模式和設(shè)計原則都是在實現(xiàn)開閉原則。

相關(guān)文章

  • 手把手帶你理解java線程池之工作隊列workQueue

    手把手帶你理解java線程池之工作隊列workQueue

    這篇文章主要介紹了java線程池之工作隊列workQueue,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • SpringBoot+SpringSecurity處理Ajax登錄請求問題(推薦)

    SpringBoot+SpringSecurity處理Ajax登錄請求問題(推薦)

    這篇文章主要介紹了SpringBoot+SpringSecurity處理Ajax登錄請求問題,本文給大家介紹的非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-12-12
  • 解決運行jar包出錯:ClassNotFoundException問題

    解決運行jar包出錯:ClassNotFoundException問題

    這篇文章主要介紹了解決運行jar包出錯:ClassNotFoundException問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java日常練習(xí)題,每天進步一點點(60)

    Java日常練習(xí)題,每天進步一點點(60)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • ChatGpt都使用的Java BPE分詞算法不要了解一下

    ChatGpt都使用的Java BPE分詞算法不要了解一下

    Byte Pair Encoding(BPE)是一種文本壓縮算法,它通常用于自然語言處理領(lǐng)域中的分詞、詞匯表構(gòu)建等任務(wù),本文將對 BPE 算法進行全面、詳細(xì)的講解,并提供 Java 相關(guān)的代碼示例,希望對大家有所幫助
    2023-06-06
  • 解決springcloud集成nacos遇到的問題

    解決springcloud集成nacos遇到的問題

    這篇文章介紹了如何解決springcloud集成nacos遇到的問題,文章中有詳細(xì)的代碼示例,需要的朋友可以參考一下
    2023-04-04
  • java實現(xiàn)小球碰撞功能

    java實現(xiàn)小球碰撞功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)小球碰撞功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 詳解Java并發(fā)包基石AQS

    詳解Java并發(fā)包基石AQS

    Java并發(fā)包(JUC)中提供了很多并發(fā)工具,這其中,很多我們耳熟能詳?shù)牟l(fā)工具,譬如ReentrangLock、Semaphore,它們的實現(xiàn)都用到了一個共同的基類--AbstractQueuedSynchronizer,簡稱AQS。本文將從幾個方面來詳細(xì)介紹:基本實現(xiàn)原理、自定義同步器、源碼分析
    2021-06-06
  • Flask接口如何返回JSON格式數(shù)據(jù)自動解析

    Flask接口如何返回JSON格式數(shù)據(jù)自動解析

    這篇文章主要介紹了Flask接口如何返回JSON格式數(shù)據(jù)自動解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Redis 集成Spring的示例代碼(spring-data-redis)

    Redis 集成Spring的示例代碼(spring-data-redis)

    本篇文章主要介紹了Redis 集成Spring的示例代碼(spring-data-redis) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評論