开闭原则
开闭原则
基本介绍
- 1.开闭原则(Open Close Principle)是编程中最基础,也最重要的原则。
- 2.一个软件实体如类,模块,和函数应该对扩展(增加)开放,对修改关闭。用抽象扩展结构,用实现扩展细节。
- 3.当软件需求变化时,尽量通过扩展软件实体的方式来实现需求,而不是通过修改已有的代码开实现新需求。当然这一点很苛刻,因为有些需求,会不可避免的修改原有的软件实体。所以,OCP即是原则也是遵循其他原则和使用设计模式的目标。
应用案例
/**
* @author 长名06
* @version 1.0
* 开闭原则 案例
*
*/
public class Ocp1 {
public static void main(String[] args) {
new GraphicEditor().drawShape(new Circular());
new GraphicEditor().drawShape(new Rectangle());
}
}
class GraphicEditor {
public void drawShape(Shape s) {
if (s.type == 1)
drawRectangle();
else if(s.type == 2)
drawCircular();
}
public void drawRectangle() {
System.out.println("画出矩形");
}
public void drawCircular() {
System.out.println("画出圆形");
}
}
class Shape {
int type;
}
class Rectangle extends Shape {
public Rectangle() {
super.type = 1;
}
}
class Circular extends Shape {
public Circular() {
super.type = 2;
}
}
分析
优点,好理解,代码实现简单。缺点,违反ocp原则,如果要新增一个图形三角形,需要修改的地方很多。
案例改进
改进思路,把创建Shape类做成抽象类,并提供一个抽象的draw()方法,让子类继承实现方法即可。这样有新的图形种类时,只需让新的图形种类继承Shape,并实现draw()方法即可,使用方的代码不用修改,符合了ocp要求。
/**
* @author 长名06
* @version 1.0
*/
public class Ocp {
public static void main(String[] args) {
Shape rectangle = new Rectangle();
Shape circular = new Circular();
Shape triangle = new Triangle();
Shape diamond = new Diamond();
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(rectangle);
graphicEditor.drawShape(circular);
graphicEditor.drawShape(triangle);
graphicEditor.drawShape(diamond);
}
}
//符合ocp原则的代码设计
//ocp Open Close Principle 开闭原则
//开闭原则,对于使用方关闭修改 对于提供方开放修改
//在实现功能的新增时,最好是扩展(新增)代码,而不是修改代码
class GraphicEditor{
public void drawShape(Shape s){
s.draw();
}
}
abstract class Shape{
public abstract void draw();
}
class Rectangle extends Shape{
@Override
public void draw() {
System.out.println("画出矩形");
}
}
class Circular extends Shape{
@Override
public void draw() {
System.out.println("画出圆形");
}
}
class Triangle extends Shape{
@Override
public void draw() {
System.out.println("画出三角形");
}
}
class Diamond extends Shape{
@Override
public void draw() {
System.out.println("画出菱形");
}
}
细节
ocp是系统设计的目标,只是尽可能达到ocp的要求,并不是一定要严格遵守这种原则,其他的原则也一样的,后面的设计模式的设计,就不是都满足七大原则。
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。