您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Java中什么是開閉原則,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
開閉原則(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í),盡量通過(guò)擴(kuò)展軟件實(shí)體的行為來(lái)實(shí)現(xiàn)變化,而不是通過(guò)修改已有的代碼來(lái)實(shí)現(xiàn)變化。
編程中遵循其它原則,以及使用設(shè)計(jì)模式的目的就是遵循開閉原則。
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,來(lái)繪制不同的圖形 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) { //使用看看存在的問(wèn)題 GraphicEditor graphicEditor = new GraphicEditor(); graphicEditor.drawShape(new Rectangle()); graphicEditor.drawShape(new Circle()); } }
根據(jù)上面的代碼及運(yùn)行結(jié)果來(lái)看,沒(méi)一點(diǎn)問(wèn)題,我們?nèi)缭傅漠嫵隽司匦?、圓形。但是現(xiàn)在有了一個(gè)新的需求,說(shuō) 要增添一個(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,來(lái)繪制不同的圖形 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) { //使用看看存在的問(wèn)題 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ī)則,也就是說(shuō)增添一個(gè)三角形的時(shí)候,我們只需要在提供方做修改,在使用方是無(wú)需修改的。
也就是說(shuō),當(dāng)我們給一個(gè)類增添新的功能時(shí),盡量不修改代碼,或者是盡量少的修改代碼。
思路: 把創(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 類,它來(lái)完成對(duì)三角形的繪制。而自始至終我們的使用方 GraphicEditor 類都沒(méi)有做任何的修改。
這就自然而然的滿足了開閉原則中的 對(duì)擴(kuò)展開發(fā)、對(duì)修改關(guān)閉 了。
關(guān)于“Java中什么是開閉原則”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。