基本介绍

1) 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则
2) 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用
方)。用抽象构建框架,用实现扩展细节
3) 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改
有的代码来实现变化。
4) 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

1.错误示范

方式1的优缺点
1) 优点是比较好理解,简单易操作。
2) 缺点是违反了设计模式的ocp原则,即对扩展开放(提供方),对修改关闭(使用方)
即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
3) 比如我们这时要新增加一个图形种类 三角形,修改的地方较多,需要改调用的地方的判断和调用的方法。

  1. package com.kris.designmode.principle.ocp;
  2. public class Ocp {
  3. public static void main(String[] args) {
  4. }
  5. }
  6. /**
  7. * 这是一个用户与绘图的类
  8. */
  9. class GraphicEditor{
  10. public void drawShape(Shape s){
  11. if(s.mType == 1){
  12. drawRectangle(s);
  13. }else if(s.mType == 2){
  14. drawCircle(s);
  15. }
  16. }
  17. public void drawRectangle(Shape r){
  18. System.out.println("绘制矩形");
  19. }
  20. public void drawCircle(Shape r){
  21. System.out.println("绘制圆形");
  22. }
  23. }
  24. /**
  25. * 基类
  26. */
  27. class Shape{
  28. int mType;
  29. }
  30. class Rectangle extends Shape{
  31. Rectangle(){
  32. super.mType=1;
  33. }
  34. }
  35. class Circle extends Shape{
  36. Circle(){
  37. super.mType=2;
  38. }
  39. }

2.正确示范

方式1的改进的思路分析
改进的思路分析
思路:把创建Shape类做成抽象类,并提供一个抽象的draw方法,让子类去实现即可,
这样我们有新的图形种类时,只需要让新的图形类继承Shape,并实现draw方法即可,
使用方的代码就不需要修 -> 满足了开闭原则

  1. package com.kris.designmode.principle.ocp.improve;
  2. public class Ocp {
  3. public static void main(String[] args) {
  4. GraphicEditor graphicEditor = new GraphicEditor();
  5. graphicEditor.draw(new Rectangle());
  6. graphicEditor.draw(new Circle());
  7. }
  8. }
  9. /**
  10. * 这是一个用户与绘图的类
  11. */
  12. class GraphicEditor{
  13. public void draw(Shape s){
  14. s.draw();
  15. }
  16. }
  17. /**
  18. * 基类
  19. * 提供一个抽象的方法draw
  20. * 把实现交给子类
  21. */
  22. abstract class Shape{
  23. int mType;
  24. abstract void draw();
  25. }
  26. class Rectangle extends Shape {
  27. Rectangle(){
  28. super.mType=1;
  29. }
  30. void draw() {
  31. System.out.println("绘制矩形");
  32. }
  33. }
  34. class Circle extends Shape {
  35. Circle(){
  36. super.mType=2;
  37. }
  38. void draw() {
  39. System.out.println("绘制圆形");
  40. }
  41. }