设计模式系列之七大原则之——开闭原则

Posted zyzblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式系列之七大原则之——开闭原则相关的知识,希望对你有一定的参考价值。

最重要最基础的一个原则:其他的原则实际上都是为了遵循开闭原则

①对扩展开放(提供方),对修改关闭(使用方)

②当软件需要变化的时候,尽量是通过扩展来实现,而不是修改已有的代码来实现

③编程中其他的原则都是为了遵循开闭原则

我的理解是有点像面向接口编程

举一个最经典的画图形的栗子:

 1 public class Ocp 
 2 
 3     public static void main(String[] args) 
 4         //使用看看存在的问题
 5         GraphicEditor graphicEditor = new GraphicEditor();
 6         graphicEditor.drawShape(new Rectangle());
 7         graphicEditor.drawShape(new Circle());
 8         graphicEditor.drawShape(new Triangle());
 9     
10 
11 
12 
13 //这是一个用于绘图的类 [使用方]
14 class GraphicEditor 
15     //接收Shape对象,然后根据type,来绘制不同的图形
16     public void drawShape(Shape s) 
17         if (s.m_type == 1)
18             drawRectangle(s);
19         else if (s.m_type == 2)
20             drawCircle(s);
21         else if (s.m_type == 3)
22             drawTriangle(s);
23     
24 
25     //绘制矩形
26     public void drawRectangle(Shape r) 
27         System.out.println(" 绘制矩形 ");
28     
29 
30     //绘制圆形
31     public void drawCircle(Shape r) 
32         System.out.println(" 绘制圆形 ");
33     
34     
35     //绘制三角形
36     public void drawTriangle(Shape r) 
37         System.out.println(" 绘制三角形 ");
38     
39 
40 
41 //Shape类,基类
42 class Shape 
43     int m_type;
44 
45 
46 class Rectangle extends Shape 
47     Rectangle() 
48         super.m_type = 1;
49     
50 
51 
52 class Circle extends Shape 
53     Circle() 
54         super.m_type = 2;
55     
56 
57 
58 //新增画三角形
59 class Triangle extends Shape 
60     Triangle() 
61         super.m_type = 3;
62     
63 

这样如果新增一个三角形,原来的类都需要进行修改。

改善后

 1 public class Ocp 
 2 
 3     public static void main(String[] args) 
 4         //使用看看存在的问题
 5         GraphicEditor graphicEditor = new GraphicEditor();
 6         graphicEditor.drawShape(new Rectangle());
 7         graphicEditor.drawShape(new Circle());
 8         graphicEditor.drawShape(new Triangle());
 9         graphicEditor.drawShape(new OtherGraphic());
10     
11 
12 
13 
14 //这是一个用于绘图的类 [使用方]
15 class GraphicEditor 
16     //接收Shape对象,调用draw方法
17     public void drawShape(Shape s) 
18         s.draw();
19     
20 
21     
22 
23 
24 //Shape类,基类
25 abstract class Shape 
26     int m_type;
27     
28     public abstract void draw();//抽象方法
29 
30 
31 class Rectangle extends Shape 
32     Rectangle() 
33         super.m_type = 1;
34     
35 
36     @Override
37     public void draw() 
38         // TODO Auto-generated method stub
39         System.out.println(" 绘制矩形 ");
40     
41 
42 
43 class Circle extends Shape 
44     Circle() 
45         super.m_type = 2;
46     
47     @Override
48     public void draw() 
49         // TODO Auto-generated method stub
50         System.out.println(" 绘制圆形 ");
51     
52 
53 
54 //新增画三角形
55 class Triangle extends Shape 
56     Triangle() 
57         super.m_type = 3;
58     
59     @Override
60     public void draw() 
61         // TODO Auto-generated method stub
62         System.out.println(" 绘制三角形 ");
63     
64 
65 
66 //新增一个图形
67 class OtherGraphic extends Shape 
68     OtherGraphic() 
69         super.m_type = 4;
70     
71 
72     @Override
73     public void draw() 
74         // TODO Auto-generated method stub
75         System.out.println(" 绘制其它图形 ");
76     
77 

其实我还是想强调一句话,这个其实就是面向接口/抽象编程

其实我还是想强调一句话,这个其实就是面向接口/抽象编程

其实我还是想强调一句话,这个其实就是面向接口/抽象编程

 

以上是关于设计模式系列之七大原则之——开闭原则的主要内容,如果未能解决你的问题,请参考以下文章

设计模式七大原则之开闭原则学习

软件设计七大原则之开闭原则

GoF 23种设计模式之七大设计原则

设计模式之七大原则

设计模式之七大原则

设计模式之七大原则