前言
本博主將用CSDN記錄軟件開(kāi)發(fā)求學(xué)之路上親身所得與所學(xué)的心得與知識(shí),有興趣的小伙伴可以關(guān)注博主!也許一個(gè)人獨(dú)行,可以走的很快,但是一群人結(jié)伴而行,才能走的更遠(yuǎn)!
一、介紹
開(kāi)閉原則(Open Closed Principle)是編程中最基礎(chǔ)、最重要的設(shè)計(jì)原則
一個(gè)軟件實(shí)體如類(lèi),模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放(對(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ì)模式的目的就是遵循開(kāi)閉原則。
二、代碼演示
1、版本一
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());
}
}
//這是一個(gè)用于繪圖的類(lèi) [使用方]
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(" 繪制三角形 ");
}
}
//Shape類(lèi),基類(lèi)
class Shape {
int m_type;
}
class Rectangle extends Shape {
Rectangle() {
super.m_type = 1;
}
}
class Circle extends Shape {
Circle() {
super.m_type = 2;
}
}
//新增畫(huà)三角形
class Triangle extends Shape {
Triangle() {
super.m_type = 3;
}
}
優(yōu)缺點(diǎn):
優(yōu)點(diǎn)是比較好理解,簡(jiǎn)單易操作。
缺點(diǎn)是違反了設(shè)計(jì)模式的ocp原則,即對(duì)擴(kuò)展開(kāi)放(提供方),對(duì)修改關(guān)閉(使用方)。即當(dāng)我們給類(lèi)增加新功能的時(shí)候,盡量不修改代碼,或者盡可能少修改代碼.
比如我們這時(shí)要新增加一個(gè)圖形種類(lèi)三角形,我們需要做如下修改,修改的地方較多。
改進(jìn)的思路分析
思路:把創(chuàng)建Shape類(lèi)做成抽象類(lèi),并提供一個(gè)抽象的draw方法,讓子類(lèi)去實(shí)現(xiàn)即可,這樣我們有新的圖形種類(lèi)時(shí),只需要讓新的圖形類(lèi)繼承Shape,并實(shí)現(xiàn)draw方法即可,文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-442318.html
使用方的代碼就不需要修改-> 滿(mǎn)足了開(kāi)閉原則文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-442318.html
2、版本二
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());
graphicEditor.drawShape(new OtherGraphic());
}
}
//這是一個(gè)用于繪圖的類(lèi) [使用方]
class GraphicEditor {
//接收Shape對(duì)象,調(diào)用draw方法
public void drawShape(Shape s) {
s.draw();
}
}
//Shape類(lèi),基類(lèi)
abstract class Shape {
int m_type;
public abstract void draw();//抽象方法
}
class Rectangle extends Shape {
Rectangle() {
super.m_type = 1;
}
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println(" 繪制矩形 ");
}
}
class Circle extends Shape {
Circle() {
super.m_type = 2;
}
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println(" 繪制圓形 ");
}
}
//新增畫(huà)三角形
class Triangle extends Shape {
Triangle() {
super.m_type = 3;
}
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println(" 繪制三角形 ");
}
}
//新增一個(gè)圖形
class OtherGraphic extends Shape {
OtherGraphic() {
super.m_type = 4;
}
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println(" 繪制其它圖形 ");
}
}
到了這里,關(guān)于設(shè)計(jì)模式(三):開(kāi)放封閉原則(詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!