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

Java設計模式之開閉原則精解

 更新時間:2022年02月07日 16:59:58   作者:張起靈-小哥  
設計模式(Design?pattern)代表了最佳的實踐,通常被有經(jīng)驗的面向?qū)ο蟮能浖_發(fā)人員所采用。設計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設計模式七大原則之一的開閉原則

1.什么是開閉原則?

  • 開閉原則(Open Closed Principle)是編程中最基礎、最重要的設計原則。
  • 一個軟件實體如類,模塊和函數(shù)應該對擴展開放(對提供方),對修改關(guān)閉(對使用方)。用抽象構(gòu)建框架,用實現(xiàn)擴展細節(jié)。
  • 當軟件需要變化時,盡量通過擴展軟件實體的行為來實現(xiàn)變化,而不是通過修改已有的代碼來實現(xiàn)變化。
  • 編程中遵循其它原則,以及使用設計模式的目的就是遵循開閉原則。

2.違反Ocp代碼案例

package com.szh.principle.ocp;
 
/**
 *
 */
//Shape類,基類
class Shape {
    int m_type;
}
 
class Rectangle extends Shape {
    Rectangle() {
        super.m_type = 1;
    }
}
 
class Circle extends Shape {
    Circle() {
        super.m_type = 2;
    }
}
 
//這是一個用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對象,然后根據(jù)type,來繪制不同的圖形
    public void drawShape(Shape s) {
        if (s.m_type == 1)
            drawRectangle(s);
        else if (s.m_type == 2)
            drawCircle(s);
    }
 
    //繪制矩形
    public void drawRectangle(Shape r) {
        System.out.println(" 繪制矩形 ");
    }
 
    //繪制圓形
    public void drawCircle(Shape r) {
        System.out.println(" 繪制圓形 ");
    }
}
 
public class Ocp {
    public static void main(String[] args) {
        //使用看看存在的問題
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
    }
}

根據(jù)上面的代碼及運行結(jié)果來看,沒一點問題,我們?nèi)缭傅漠嫵隽司匦?、圓形。但是現(xiàn)在有了一個新的需求,說 要增添一個圖形(三角形),使代碼完成對三角形的繪制,那么我們就需要對上面的代碼進行修改。

package com.szh.principle.ocp;
 
/**
 *
 */
//Shape類,基類
class Shape {
    int m_type;
}
 
class Rectangle extends Shape {
    Rectangle() {
        super.m_type = 1;
    }
}
 
class Circle extends Shape {
    Circle() {
        super.m_type = 2;
    }
}
 
//新增畫三角形
class Triangle extends Shape {
    Triangle() {
        super.m_type = 3;
    }
}
 
//這是一個用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對象,然后根據(jù)type,來繪制不同的圖形
    public void drawShape(Shape s) {
        if (s.m_type == 1)
            drawRectangle(s);
        else if (s.m_type == 2)
            drawCircle(s);
        else if (s.m_type == 3)
            drawTriangle(s);
    }
 
    //繪制矩形
    public void drawRectangle(Shape r) {
        System.out.println(" 繪制矩形 ");
    }
 
    //繪制圓形
    public void drawCircle(Shape r) {
        System.out.println(" 繪制圓形 ");
    }
 
    //繪制三角形
    public void drawTriangle(Shape r) {
        System.out.println(" 繪制三角形 ");
    }
}
 
public class Ocp {
    public static void main(String[] args) {
        //使用看看存在的問題
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }
}

對代碼的修改完成了,也按照要求繪制出了三角形。但是大家仔細對比上面這兩段代碼,你會發(fā)現(xiàn):第一,改動的地方偏多;第二,在使用方 GraphicEditor 類中也做了修改。  這就明顯違反了開閉原則中的 對修改關(guān)閉 這個規(guī)則。

我們需要的是 對擴展開放,對修改關(guān)閉 的規(guī)則,也就是說增添一個三角形的時候,我們只需要在提供方做修改,在使用方是無需修改的。

也就是說,當我們給一個類增添新的功能時,盡量不修改代碼,或者是盡量少的修改代碼。

3.遵守Ocp代碼案例

思路:  把創(chuàng)建Shape類做成抽象類,并提供一個抽象的draw方法,讓子類去實現(xiàn)即可,這樣我們有新的圖形種類時,只需要讓新的圖形類繼承Shape,并實現(xiàn) draw方法即可,使用方的代碼就不需要修 → 滿足了開閉原則。

package com.szh.principle.ocp.improve;
 
/**
 *
 */
//Shape類,基類
abstract class Shape {
    int m_type;
    public abstract void draw();//抽象方法
}
 
class Rectangle extends Shape {
    Rectangle() {
        super.m_type = 1;
    }
 
    @Override
    public void draw() {
        System.out.println(" 繪制矩形 ");
    }
}
 
class Circle extends Shape {
    Circle() {
        super.m_type = 2;
    }
 
    @Override
    public void draw() {
        System.out.println(" 繪制圓形 ");
    }
}
 
//這是一個用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對象,調(diào)用draw方法
    public void drawShape(Shape s) {
        s.draw();
    }
}
 
public class Ocp {
    public static void main(String[] args) {
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
    }
}

上面是改進之后的代碼,此時我們還像之前的案例一樣,增添一個新的圖形(三角形),并完成對三角形的繪制,那么對上面代碼的修改就少之又少了。

修改代碼如下:??????

package com.szh.principle.ocp.improve;
 
/**
 *
 */
//Shape類,基類
abstract class Shape {
    int m_type;
    public abstract void draw();//抽象方法
}
 
class Rectangle extends Shape {
    Rectangle() {
        super.m_type = 1;
    }
 
    @Override
    public void draw() {
        System.out.println(" 繪制矩形 ");
    }
}
 
class Circle extends Shape {
    Circle() {
        super.m_type = 2;
    }
 
    @Override
    public void draw() {
        System.out.println(" 繪制圓形 ");
    }
}
 
//新增畫三角形
class Triangle extends Shape {
    Triangle() {
        super.m_type = 3;
    }
 
    @Override
    public void draw() {
        System.out.println(" 繪制三角形 ");
    }
}
 
//這是一個用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對象,調(diào)用draw方法
    public void drawShape(Shape s) {
        s.draw();
    }
}
 
public class Ocp {
    public static void main(String[] args) {
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }
}

可以看到,我們對提供方代碼中新增了一個 Triangle 類,它來完成對三角形的繪制。而自始至終我們的使用方 GraphicEditor 類都沒有做任何的修改。

這就自然而然的滿足了開閉原則中的 對擴展開發(fā)、對修改關(guān)閉 了。

到此這篇關(guān)于Java設計模式之開閉原則精解的文章就介紹到這了,更多相關(guān)Java 開閉原則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用C和JAVA分別創(chuàng)建鏈表的實例

    用C和JAVA分別創(chuàng)建鏈表的實例

    使用用C和JAVA分別創(chuàng)建鏈表的方法,創(chuàng)建鏈表、往鏈表中插入數(shù)據(jù)、刪除數(shù)據(jù)等操作。
    2013-10-10
  • java字符串相加時的內(nèi)存表現(xiàn)和原理分析

    java字符串相加時的內(nèi)存表現(xiàn)和原理分析

    這篇文章主要介紹了java字符串相加時的內(nèi)存表現(xiàn)和原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 淺談java中的TreeMap 排序與TreeSet 排序

    淺談java中的TreeMap 排序與TreeSet 排序

    下面小編就為大家?guī)硪黄獪\談java中的TreeMap 排序與TreeSet 排序。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Spring Boot 如何自定義返回錯誤碼錯誤信息

    Spring Boot 如何自定義返回錯誤碼錯誤信息

    這篇文章主要介紹了Spring Boot 如何自定義返回錯誤碼錯誤信息的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Java編碼算法與哈希算法深入分析使用方法

    Java編碼算法與哈希算法深入分析使用方法

    首先,我們一起來學習一下編碼算法,舉例說明,ASCII碼就是我們常見的一種編碼,字母a的編碼是十六進制的0x61,字母b是0x62,以此類推。哈希算法,可被稱為摘要算法。因此,哈希算法的加密是單向的,不可用密文解密得到明文
    2022-11-11
  • Springboot-Shiro基本使用詳情介紹

    Springboot-Shiro基本使用詳情介紹

    這篇文章主要介紹了Springboot-Shiro基本使用詳情,文章根據(jù)官網(wǎng)依據(jù)官網(wǎng)快速搭建Quickstart,配置pom.xml依賴等操作,需要的小伙伴可以參考下面文章內(nèi)容
    2022-01-01
  • ssm框架+PageHelper插件實現(xiàn)分頁查詢功能

    ssm框架+PageHelper插件實現(xiàn)分頁查詢功能

    今天小編教大家如何通過ssm框架+PageHelper插件實現(xiàn)分頁查詢功能,首先大家需要新建一個maven工程引入jar包,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-06-06
  • Java并發(fā)工具類CountDownLatch CyclicBarrier使用詳解

    Java并發(fā)工具類CountDownLatch CyclicBarrier使用詳解

    這篇文章主要為大家介紹了Java并發(fā)工具類CountDownLatch CyclicBarrier使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

    手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

    這篇文章主要介紹了詳解Spring Boot自動裝配Ribbon哪些核心操作的哪些操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • java限流算法詳細

    java限流算法詳細

    這篇文章詳細的介紹了java限流算法常用到的算法計數(shù)算法、漏桶算法、令牌桶等算法的相關(guān)資料,需要的朋友可以參考下文,希望本篇文章能幫助到您
    2021-09-09

最新評論

陇西县| 茌平县| 榆中县| 恩平市| 庆元县| 都匀市| 大庆市| 渝中区| 高青县| 望都县| 奉化市| 海南省| 永胜县| 洛宁县| 清新县| 昭觉县| 阳高县| 丰镇市| 修武县| 彰武县| 荔波县| 札达县| 嘉义县| 富锦市| 柘荣县| 安义县| 扶沟县| 保康县| 永定县| 资兴市| 凉山| 文水县| 临漳县| 铜鼓县| 永丰县| 赣榆县| 灵丘县| 板桥市| 大新县| 普兰店市| 营口市|