设计模式六原则 - 开闭原则

image

开闭原则(Open-Closed Principle, OCP)

用抽象构建框架,用实现扩展细节。

  • 抽象化是开闭原则的关键

  • 系统中对扩展开放,对修改关闭,模块应该在不修改原有代码的基础上进行扩展开发过程中,对系统进行抽象化设计,抽象化是开闭原则的关键,仅对程序中出现变化的地方做出抽象,拒绝不成熟的抽象和抽象本身一样重要。

  • 修改配置文件xml或者properties而没有对源代码进行修改,认为该次修改是符合开闭原则的。

问题

第一个版本需求只有绘制圆圈的功能,第二个版本则增加了绘制线条的功能。改进方式是在源码处进行了修改增加判断else if逻辑,这样就违反了开闭原则。

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Line{
public void draw(){
System.out.println("draw a line.....");
}
}

public class Circle{
public void draw() {
System.out.println("draw a circle.....");
}
}

public class Canvas {
/**
* 绘制
* 增加绘制线条,则修改CanvasDraw这个类源码,增加判断逻辑,违反开闭原则
*/
public void draw(String type){
if(type.equals("circle")){
Circle circle = new Circle();
circle.draw();
}else if( type.equals("line")){
Line line = new Line();
line.draw();
}
}

}
1
2
3
4
5
6
7
8
public class Main {

public static void main(String[] args){
Canvas canvas = new Canvas();
canvas.draw("circle");
canvas.draw("line");
}
}

解决

image

所以还是应该用到抽象!将图形类型进行抽象化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Line extends AbstractGraph{
@Override
public void draw(){
System.out.println("draw a line.....");
}
}

public class Circle extends AbstractGraph{
@Override
void draw() {
System.out.println("draw a circle.....");
}
}

public class Canvas {
AbstractGraph abstractGraph;
public void draw(){
abstractGraph.draw();
}
public void setAbstractGraph(AbstractGraph graph){
abstractGraph = graph;
}

}
1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args){
//符合开闭原则的设计
Canvas draw = new Canvas();
draw.setAbstractGraph(new Line());
draw.draw();
draw.setAbstractGraph(new Circle());
draw.draw();

}
}

六大设计原则:

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器