基本介绍
1. 开闭原则(Open Closed Principle)是编程中最基础、 最重要的设计原则——面向对象设计的终极目标
2. 一个软件实体如类,模块和函数应该对扩展开放 (对提供方),对修改关闭(对使用方)。用抽象构建 框架,用实现扩展细节。
3. 当软件需要变化时,尽量通过扩展软件实体的行 为来实现变化,而不是通过修改已有的代码来实现 变化。
4. 编程中遵循其它原则,以及使用设计模式的目的 就是遵循开闭原则。
实现一个画图形的类
方式1
class Rectangle{
void draw(){ System.out.println("矩形 ");
}
class Circle {
void draw(){ System.out.println(" 圆形");
}
class Triangle{ //新增三角形一肯定 要改
void draw(){ System.out.println("三角形");
}
class GraphicDraw {
void drawgraph(int type){
if(type= =1){
Rectangle rec=new RectangleO;
rec.drawO;
}else if(type= = =2){
Circle c=new Circle();
c.drawO;}
else if(type== -3){ //新增绘制三角形
Triangle t=new Triangle();
t.draw0;}
——尽量不改一其中就不能出现具体的类
public class graphDraw {
public static void main(String[] args) {
GraphicDraw graphicdraw=new GraphicDraw(); graphicdraw.drawgraph(2); //客户端肯定要改
}
}
}
方式1的优缺点:
1)优点是比较好理解,简单易操作。
2)缺点是违反了开闭原则(对扩展(提供方)开放,对 修改(使用方)关闭):需要给类增加新功能的时候, 尽量不要修改代码,或者尽可能少修改代码。
3)本例,需要新增一个图形种类时,修改的地方比较多。
改进思路:
发现Rectangle和Circle有共同的draw方法,创 建抽象Shape类做成基类,并提供抽象的draw方法,让子类 去实现,当需要新的图形时,只需要让新的图形继承Shape, 并实现draw方法。 画图类GraphicDraw不出现具体的类, 用抽象类Shape。
这样使用方的代码就不需要修改,满足开 闭原则。
方式2:
//Shape类,基类
abstract class Shape {
public abstract void draw(); //抽象方法
}
class GraphicDraw { //新增绘制图形不需修改此类
void drawgraph(Shape s){
s.draw();
}
}
class Rectangle extends Shape {
void draw(){ System.out.println("矩形"); }
}
class Circle extends Shape {
void draw(){ System.out.println("圆形"); }
}
class Triangle extends Shape { //新增三角形
void draw(){ System.out.println("三角形"); }
}
public class graphDraw {
public static void main(String[] args) {
GraphicDraw graphicdraw=new GraphicDraw(); graphicdraw.drawgraph(new Circle()); graphicdraw.drawgraph(new Rectangle()); graphicdraw.drawgraph(new Triangle()); }
}
开放-封闭原则
-
Open-Closed Principle原则:一个软件实体应当对扩展开放,对修改关闭。
-
开闭原则(OCP)是面向对象设计中“可复用设计”的 基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。
-
开闭原则中“开”,是指对于组件功能的扩展是开放的, 是允许对其进行功能扩展的;
-
开闭原则中“闭”,是指对于原有代码的修改是封闭的, 即不应该修改原有的代码。