基本介绍
- 开闭原则是编程中最基本、最重要的设计原则、
- 一个软件实体如类,模块和函数应该对外扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节
- 当软件需求发生变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化
-
代码说明问题
```bash public class Application { public static void main(String[] args) {
GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Circle());graphicEditor.drawShape(new Rectangle());
} } class GraphicEditor { public void drawShape(Shape s){
if (s.m_type == 1)drawRectangle(s);else if (s.m_type == 2)drawCircle(s);
}
public void drawRectangle(Shape s){
System.out.println("绘制矩形");
} public void drawCircle(Shape s){
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; } }
运行结果```bashE:\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绘制圆形绘制矩形Process finished with exit code 0
需求变更 新增画三角形
public class Application {public static void main(String[] args) {GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Circle());graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Triangle());}}class GraphicEditor {public void drawShape(Shape s){if (s.m_type == 1)drawRectangle(s);else if (s.m_type == 2)drawCircle(s);else if (s.m_type == 3)drawTriangle(s);}public void drawRectangle(Shape s){System.out.println("绘制矩形");}public void drawCircle(Shape s){System.out.println("绘制圆形");}public void drawTriangle(Shape s){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;}}class Triangle extends Shape {Triangle(){super.m_type = 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=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绘制圆形绘制矩形绘制三角形Process finished with exit code 0
方案一优缺点
- 优点是比较好理解,简单易操作
- 缺点是违反了设计模式OCP原则,即对外扩展开放,对对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或尽可能少修改代码。
- 比如这时候我们要增加一个三角形图形种类,我们需要做以上修改,修改的地方较多
改进思路
把创建Shape类做成一个抽象类,并提供一个抽象的draw方法,让子类去实现即可,这样我们有新的图形种类时,只需要让新的图形类继承SHape,并实现draw方法即可,使用放代码就不需要修改-》满足开闭原则。
方案二
public class Application {public static void main(String[] args) {GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Circle());graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Triangle());graphicEditor.drawShape(new Other());}}class GraphicEditor {public void drawShape(Shape s){s.draw();}}//Shape类 基类abstract class Shape{int m_type;public abstract void draw();}class Rectangle extends Shape {Rectangle(){super.m_type = 1;}@Overridepublic void draw() {System.out.println("绘制矩形");}}class Circle extends Shape {Circle(){super.m_type = 2;}@Overridepublic void draw() {System.out.println("绘制圆形");}}class Triangle extends Shape {Triangle(){super.m_type = 3;}@Overridepublic void draw() {System.out.println("绘制三角形");}}class Other extends Shape {Other(){super.m_type = 4;}@Overridepublic void draw() {System.out.println("绘制其他图形");}}
运行结果
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绘制圆形绘制矩形绘制三角形绘制其他图形Process finished with exit code 0
