亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java設(shè)計(jì)模式之開閉原則精解

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

1.什么是開閉原則?

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

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;
    }
}
 
//這是一個(gè)用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對(duì)象,然后根據(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ù)上面的代碼及運(yùn)行結(jié)果來看,沒一點(diǎn)問題,我們?nèi)缭傅漠嫵隽司匦?、圓形。但是現(xiàn)在有了一個(gè)新的需求,說 要增添一個(gè)圖形(三角形),使代碼完成對(duì)三角形的繪制,那么我們就需要對(duì)上面的代碼進(jì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;
    }
}
 
//這是一個(gè)用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對(duì)象,然后根據(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());
    }
}

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

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

也就是說,當(dāng)我們給一個(gè)類增添新的功能時(shí),盡量不修改代碼,或者是盡量少的修改代碼。

3.遵守Ocp代碼案例

思路:  把創(chuàng)建Shape類做成抽象類,并提供一個(gè)抽象的draw方法,讓子類去實(shí)現(xiàn)即可,這樣我們有新的圖形種類時(shí),只需要讓新的圖形類繼承Shape,并實(shí)現(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(" 繪制圓形 ");
    }
}
 
//這是一個(gè)用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對(duì)象,調(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());
    }
}

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

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

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(" 繪制三角形 ");
    }
}
 
//這是一個(gè)用于繪圖的類 [使用方]
class GraphicEditor {
    //接收Shape對(duì)象,調(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());
    }
}

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

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

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

相關(guān)文章

最新評(píng)論