基本介紹 1、開閉(ocp)原則時編程中最基礎、最重要的設計原則 2、一個軟體實體如類、木塊和函數應該對擴展開放,對修改關閉。用抽象構建框架,用實現擴展細節。 即對提供方開放,對使用方關閉 。 3、當軟體需要變化時,儘量 通過擴展軟體實體的行為類實現變化,而不是通過修改已有代碼來實現變化 4、編程中 ...
基本介紹
1、開閉(ocp)原則時編程中最基礎、最重要的設計原則
2、一個軟體實體如類、木塊和函數應該對擴展開放,對修改關閉。用抽象構建框架,用實現擴展細節。即對提供方開放,對使用方關閉。
3、當軟體需要變化時,儘量通過擴展軟體實體的行為類實現變化,而不是通過修改已有代碼來實現變化
4、編程中遵循其他原則,以及使用設計模式的目的就是遵循開閉原則。
先來一段代碼展示
public class Ocp {
public static void main(String[] args) {
// 使用,看看存在的問題
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawCircle(new Shape());
graphicEditor.drawRectangle(new Shape());
graphicEditor.drawOther(new Shape());
}
}
//這是一個用於繪圖的類
class GraphicEditor {
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) {
// 需在使用方添加(else if)代碼快
drawOther(s);
}
}
public void drawRectangle(Shape s) {
System.out.println("這是矩形");
}
public void drawCircle(Shape s) {
System.out.println("這是圓形");
}
// 需在使用方添加新的方法
public void drawOther(Shape s) {
System.out.println("這是其他圖形");
}
}
class Shape {
int m_type;
}
class Rectangle extends Shape {
Rectangle() {
super.m_type = 1;
}
}
class Circle extends Shape {
Circle() {
super.m_type = 2;
}
}
class Other extends Shape {
Other() {
super.m_type = 3;
}
}
分析這段代碼中存在的問題
1、代碼簡單易懂,思路清晰。
2、但違反了設計模式的ocp原則,即對擴展開放,對修改關閉。即當我們給類增加新功能的時候,儘量不修改代碼,或者儘可能少修改代碼。
3、每增加一個功能都要需在使用方添加(else if)代碼快,過多的(else if)會使代碼過於臃腫,運行效率不高。
改進思路
創建一個Shape類,並提供一個抽象的draw()方法,讓子類實現該方法。每當增加一個圖形種類時,讓該圖形種類繼承Shape類,並實現draw()方法。這樣,使用方只需編寫一個drawShape方法,傳入一個圖形類的對象,即可使用其相應的繪圖方法。只需要修改提供方的代碼,不需要修改使用方的代碼,遵循ocp原則
使用ocp原則
public class Ocp {
public static void main(String[] args) {
// 遵循ocp原則
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawShape(new Other());
}
}
//這是一個用於繪圖的類,[使用方]
class GraphicEditor {
// 接收Shape對象,調用其對應的draw方法
public void drawShape(Shape s) {
s.draw();
}
}
//Shape類,基類
abstract class Shape {
public 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 Other extends Shape {
Other() {
super.m_type = 3;
}
@Override
public void draw() {
System.out.println("這是其他圖形");
}
}