基本介绍

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

    代码说明问题

    ```bash public class Application { public static void main(String[] args) {

    1. GraphicEditor graphicEditor = new GraphicEditor();
    2. graphicEditor.drawShape(new Circle());
    3. graphicEditor.drawShape(new Rectangle());

    } } class GraphicEditor { public void drawShape(Shape s){

    1. if (s.m_type == 1)
    2. drawRectangle(s);
    3. else if (s.m_type == 2)
    4. drawCircle(s);

    }

    public void drawRectangle(Shape s){

    1. System.out.println("绘制矩形");

    } public void drawCircle(Shape s){

    1. System.out.println("绘制圆形");

    }

} //Shape类 基类 class Shape{ int m_type; } class Rectangle extends Shape { Rectangle(){ super.m_type = 1; } } class Circle extends Shape { Circle(){ super.m_type = 2; } }

  1. 运行结果
  2. ```bash
  3. E:\Java\jdk\jdk1.8.0_191\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar=55243:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath "E:\Java\jdk\jdk1.8.0_191\jre\lib\charsets.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\deploy.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\cldrdata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\dnsns.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jaccess.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jfxrt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\localedata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\nashorn.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunec.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunmscapi.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\zipfs.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\javaws.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jce.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfr.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfxswt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jsse.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\management-agent.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\plugin.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\resources.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\rt.jar;E:\study\jvm_study\chapter_01\target\classes;E:\Program Files\Maven\repository\org\redisson\redisson-spring-boot-starter\3.13.6\redisson-spring-boot-starter-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-actuator\2.4.1\spring-boot-starter-actuator-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.4.1\spring-boot-actuator-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator\2.4.1\spring-boot-actuator-2.4.1.jar;E:\Program Files\Maven\repository\io\micrometer\micrometer-core\1.6.2\micrometer-core-1.6.2.jar;E:\Program Files\Maven\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;E:\Program Files\Maven\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-data-redis\2.4.1\spring-boot-starter-data-redis-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-redis\2.4.2\spring-data-redis-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-keyvalue\2.4.2\spring-data-keyvalue-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-commons\2.4.2\spring-data-commons-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-tx\5.3.2\spring-tx-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-oxm\5.3.2\spring-oxm-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context-support\5.3.2\spring-context-support-5.3.2.jar;E:\Program Files\Maven\repository\org\redisson\redisson\3.13.6\redisson-3.13.6.jar;E:\Program Files\Maven\repository\io\netty\netty-common\4.1.55.Final\netty-common-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec\4.1.55.Final\netty-codec-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-buffer\4.1.55.Final\netty-buffer-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-transport\4.1.55.Final\netty-transport-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver\4.1.55.Final\netty-resolver-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver-dns\4.1.55.Final\netty-resolver-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec-dns\4.1.55.Final\netty-codec-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-handler\4.1.55.Final\netty-handler-4.1.55.Final.jar;E:\Program Files\Maven\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;E:\Program Files\Maven\repository\io\projectreactor\reactor-core\3.4.1\reactor-core-3.4.1.jar;E:\Program Files\Maven\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;E:\Program Files\Maven\repository\io\reactivex\rxjava2\rxjava\2.2.20\rxjava-2.2.20.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.10.Final\jboss-marshalling-river-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling\2.0.10.Final\jboss-marshalling-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;E:\Program Files\Maven\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.11.3\jackson-dataformat-yaml-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;E:\Program Files\Maven\repository\net\bytebuddy\byte-buddy\1.10.18\byte-buddy-1.10.18.jar;E:\Program Files\Maven\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;E:\Program Files\Maven\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;E:\Program Files\Maven\repository\org\redisson\redisson-spring-data-23\3.13.6\redisson-spring-data-23-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;E:\Program Files\Maven\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;E:\Program Files\Maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;E:\Program Files\Maven\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;E:\Program Files\Maven\repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;E:\Program Files\Maven\repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;E:\Program Files\Maven\repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar" design.Application
  4. 绘制圆形
  5. 绘制矩形
  6. Process finished with exit code 0

需求变更 新增画三角形

  1. public class Application {
  2. public static void main(String[] args) {
  3. GraphicEditor graphicEditor = new GraphicEditor();
  4. graphicEditor.drawShape(new Circle());
  5. graphicEditor.drawShape(new Rectangle());
  6. graphicEditor.drawShape(new Triangle());
  7. }
  8. }
  9. class GraphicEditor {
  10. public void drawShape(Shape s){
  11. if (s.m_type == 1)
  12. drawRectangle(s);
  13. else if (s.m_type == 2)
  14. drawCircle(s);
  15. else if (s.m_type == 3)
  16. drawTriangle(s);
  17. }
  18. public void drawRectangle(Shape s){
  19. System.out.println("绘制矩形");
  20. }
  21. public void drawCircle(Shape s){
  22. System.out.println("绘制圆形");
  23. }
  24. public void drawTriangle(Shape s){
  25. System.out.println("绘制三角形");
  26. }
  27. }
  28. //Shape 基类
  29. class Shape{
  30. int m_type;
  31. }
  32. class Rectangle extends Shape {
  33. Rectangle(){
  34. super.m_type = 1;
  35. }
  36. }
  37. class Circle extends Shape {
  38. Circle(){
  39. super.m_type = 2;
  40. }
  41. }
  42. class Triangle extends Shape {
  43. Triangle(){
  44. super.m_type = 3;
  45. }
  46. }

运行结果

  1. E:\Java\jdk\jdk1.8.0_191\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar=55304:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath "E:\Java\jdk\jdk1.8.0_191\jre\lib\charsets.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\deploy.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\cldrdata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\dnsns.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jaccess.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jfxrt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\localedata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\nashorn.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunec.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunmscapi.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\zipfs.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\javaws.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jce.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfr.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfxswt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jsse.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\management-agent.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\plugin.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\resources.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\rt.jar;E:\study\jvm_study\chapter_01\target\classes;E:\Program Files\Maven\repository\org\redisson\redisson-spring-boot-starter\3.13.6\redisson-spring-boot-starter-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-actuator\2.4.1\spring-boot-starter-actuator-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.4.1\spring-boot-actuator-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator\2.4.1\spring-boot-actuator-2.4.1.jar;E:\Program Files\Maven\repository\io\micrometer\micrometer-core\1.6.2\micrometer-core-1.6.2.jar;E:\Program Files\Maven\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;E:\Program Files\Maven\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-data-redis\2.4.1\spring-boot-starter-data-redis-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-redis\2.4.2\spring-data-redis-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-keyvalue\2.4.2\spring-data-keyvalue-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-commons\2.4.2\spring-data-commons-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-tx\5.3.2\spring-tx-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-oxm\5.3.2\spring-oxm-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context-support\5.3.2\spring-context-support-5.3.2.jar;E:\Program Files\Maven\repository\org\redisson\redisson\3.13.6\redisson-3.13.6.jar;E:\Program Files\Maven\repository\io\netty\netty-common\4.1.55.Final\netty-common-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec\4.1.55.Final\netty-codec-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-buffer\4.1.55.Final\netty-buffer-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-transport\4.1.55.Final\netty-transport-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver\4.1.55.Final\netty-resolver-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver-dns\4.1.55.Final\netty-resolver-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec-dns\4.1.55.Final\netty-codec-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-handler\4.1.55.Final\netty-handler-4.1.55.Final.jar;E:\Program Files\Maven\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;E:\Program Files\Maven\repository\io\projectreactor\reactor-core\3.4.1\reactor-core-3.4.1.jar;E:\Program Files\Maven\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;E:\Program Files\Maven\repository\io\reactivex\rxjava2\rxjava\2.2.20\rxjava-2.2.20.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.10.Final\jboss-marshalling-river-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling\2.0.10.Final\jboss-marshalling-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;E:\Program Files\Maven\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.11.3\jackson-dataformat-yaml-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;E:\Program Files\Maven\repository\net\bytebuddy\byte-buddy\1.10.18\byte-buddy-1.10.18.jar;E:\Program Files\Maven\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;E:\Program Files\Maven\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;E:\Program Files\Maven\repository\org\redisson\redisson-spring-data-23\3.13.6\redisson-spring-data-23-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;E:\Program Files\Maven\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;E:\Program Files\Maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;E:\Program Files\Maven\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;E:\Program Files\Maven\repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;E:\Program Files\Maven\repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;E:\Program Files\Maven\repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar" design.Application
  2. 绘制圆形
  3. 绘制矩形
  4. 绘制三角形
  5. Process finished with exit code 0

方案一优缺点

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

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

方案二

  1. public class Application {
  2. public static void main(String[] args) {
  3. GraphicEditor graphicEditor = new GraphicEditor();
  4. graphicEditor.drawShape(new Circle());
  5. graphicEditor.drawShape(new Rectangle());
  6. graphicEditor.drawShape(new Triangle());
  7. graphicEditor.drawShape(new Other());
  8. }
  9. }
  10. class GraphicEditor {
  11. public void drawShape(Shape s){
  12. s.draw();
  13. }
  14. }
  15. //Shape 基类
  16. abstract class Shape{
  17. int m_type;
  18. public abstract void draw();
  19. }
  20. class Rectangle extends Shape {
  21. Rectangle(){
  22. super.m_type = 1;
  23. }
  24. @Override
  25. public void draw() {
  26. System.out.println("绘制矩形");
  27. }
  28. }
  29. class Circle extends Shape {
  30. Circle(){
  31. super.m_type = 2;
  32. }
  33. @Override
  34. public void draw() {
  35. System.out.println("绘制圆形");
  36. }
  37. }
  38. class Triangle extends Shape {
  39. Triangle(){
  40. super.m_type = 3;
  41. }
  42. @Override
  43. public void draw() {
  44. System.out.println("绘制三角形");
  45. }
  46. }
  47. class Other extends Shape {
  48. Other(){
  49. super.m_type = 4;
  50. }
  51. @Override
  52. public void draw() {
  53. System.out.println("绘制其他图形");
  54. }
  55. }

运行结果

  1. E:\Java\jdk\jdk1.8.0_191\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar=55463:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath "E:\Java\jdk\jdk1.8.0_191\jre\lib\charsets.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\deploy.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\cldrdata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\dnsns.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jaccess.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jfxrt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\localedata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\nashorn.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunec.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunmscapi.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\zipfs.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\javaws.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jce.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfr.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfxswt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jsse.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\management-agent.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\plugin.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\resources.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\rt.jar;E:\study\jvm_study\chapter_01\target\classes;E:\Program Files\Maven\repository\org\redisson\redisson-spring-boot-starter\3.13.6\redisson-spring-boot-starter-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-actuator\2.4.1\spring-boot-starter-actuator-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.4.1\spring-boot-actuator-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator\2.4.1\spring-boot-actuator-2.4.1.jar;E:\Program Files\Maven\repository\io\micrometer\micrometer-core\1.6.2\micrometer-core-1.6.2.jar;E:\Program Files\Maven\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;E:\Program Files\Maven\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-data-redis\2.4.1\spring-boot-starter-data-redis-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-redis\2.4.2\spring-data-redis-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-keyvalue\2.4.2\spring-data-keyvalue-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-commons\2.4.2\spring-data-commons-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-tx\5.3.2\spring-tx-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-oxm\5.3.2\spring-oxm-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context-support\5.3.2\spring-context-support-5.3.2.jar;E:\Program Files\Maven\repository\org\redisson\redisson\3.13.6\redisson-3.13.6.jar;E:\Program Files\Maven\repository\io\netty\netty-common\4.1.55.Final\netty-common-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec\4.1.55.Final\netty-codec-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-buffer\4.1.55.Final\netty-buffer-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-transport\4.1.55.Final\netty-transport-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver\4.1.55.Final\netty-resolver-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver-dns\4.1.55.Final\netty-resolver-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec-dns\4.1.55.Final\netty-codec-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-handler\4.1.55.Final\netty-handler-4.1.55.Final.jar;E:\Program Files\Maven\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;E:\Program Files\Maven\repository\io\projectreactor\reactor-core\3.4.1\reactor-core-3.4.1.jar;E:\Program Files\Maven\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;E:\Program Files\Maven\repository\io\reactivex\rxjava2\rxjava\2.2.20\rxjava-2.2.20.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.10.Final\jboss-marshalling-river-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling\2.0.10.Final\jboss-marshalling-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;E:\Program Files\Maven\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.11.3\jackson-dataformat-yaml-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;E:\Program Files\Maven\repository\net\bytebuddy\byte-buddy\1.10.18\byte-buddy-1.10.18.jar;E:\Program Files\Maven\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;E:\Program Files\Maven\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;E:\Program Files\Maven\repository\org\redisson\redisson-spring-data-23\3.13.6\redisson-spring-data-23-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;E:\Program Files\Maven\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;E:\Program Files\Maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;E:\Program Files\Maven\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;E:\Program Files\Maven\repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;E:\Program Files\Maven\repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;E:\Program Files\Maven\repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar" design.Application
  2. 绘制圆形
  3. 绘制矩形
  4. 绘制三角形
  5. 绘制其他图形
  6. Process finished with exit code 0