基本介绍:
- 开闭原则是编程中最基础,最重要的设计原则
- 一个软件实体类,模块,和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节
- 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改自己的已有的代码来实现变化。
- 编程中遵循其他原则,以及使用设计模型的目的就是遵循开闭原则。
实现画图,用非开闭原则实现
Shape类:
public class Shape { int mType; }
Circle类:
public class Circle extends Shape{ public Circle(){ super.mType = 2; } }
Rectangle类:
public class Rectangle extends Shape{ public Rectangle(){ super.mType=1; } }
主类:
public class kaibiyuanze { public void drawshape(Shape s){ if (s.mType == 1){ drawRectangle(s); } else if (s.mType==2){ drawCircle(s); } } public void drawRectangle(Shape r){ System.out.println("绘制矩形"); } public void drawCircle(Shape r){ System.out.println("绘制圆形"); } }
加入在加入一个绘制三角形
代码修改则是修改许多:
Trianle类:
public class Triangle extends Shape{ public Triangle(){ super.mType=3; } }
主类:
public class kaibiyuanze { public void drawshape(Shape s){ if (s.mType == 1){ drawRectangle(s); } else if (s.mType==2){ drawCircle(s); } else if (s.mType==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("绘制三角形"); } }
这种写法:
/** * 方式一的优缺点 * 1.优点是比较好理解,简单易操作 * 2.缺点是违背了设计模型的ocp原则,即对扩展开放,对修改关闭。即使我们给类添加新的动能也尽量不要去修改代码,我们需要尽可能少修改代码 *3.比如我们这时要增加一个图形种类,我们需要做如下修改,修改的地方较多 * 4.新增一个三角形 * */使用开闭原则实现:
/** * 方式yi的改进的思路分析 * * 把创建Shape类做出抽象类,并且提供一个抽象的draw类,让子类去实现即可, * 这样子我有新的图形种类时,只需要让新的图形继承Shape,并且实现draw方法即可 */Shape抽象类:
public abstract class Shape { int mType; public abstract void draw(); }
Circle类:
public class Circle extends Shape { public Circle(){ super.mType = 2; } @Override public void draw() { System.out.println("绘制圆"); } }
Rectangle类:
public class Rectangle extends Shape { public Rectangle(){ super.mType=1; } @Override public void draw() { System.out.println("绘制矩形"); } }
添加新的三角形绘制则只需要添加相应的类即可
Triangle类:
public class Triangle extends Shape { public Triangle(){ super.mType=3; } @Override public void draw() { System.out.println("绘制三角形"); } }