开闭原则

This commit is contained in:
2018-09-18 17:02:00 +08:00
commit 6a72751bd4
14 changed files with 366 additions and 0 deletions

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
designpattern

13
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="Design-pattern" />
</profile>
</annotationProcessing>
</component>
</project>

6
.idea/encodings.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
</component>
</project>

View File

@@ -0,0 +1,36 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="date" />
</inspection_tool>
</profile>
</component>

14
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

2
Design-pattern.iml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />

86
pom.xml Normal file
View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.fjy8018</groupId>
<artifactId>designpattern</artifactId>
<version>1.0-SNAPSHOT</version>
<name>designpattern</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@@ -0,0 +1,10 @@
package top.fjy8018;
/**
* 设计模式实践引导类
*/
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

View File

@@ -0,0 +1,35 @@
package top.fjy8018.designpattern.principle.openclose;
import java.math.BigDecimal;
/**
* 课程接口
* 对于面向接口编程,接口应当是稳定的
* 根据开闭原则,在此体现为对接口的增加和修改时关闭的,因为会导致所有实现类的变化
* 而对课程类的扩展extend是开放的
*
* @author F嘉阳
* @date 2018-09-18 16:28
*/
public interface Course {
/**
* 获取课程ID
*
* @return
*/
Integer getId();
/**
* 获取课程名称
*
* @return
*/
String getName();
/**
* 获取课程价格
*
* @return
*/
BigDecimal getPrice();
}

View File

@@ -0,0 +1,47 @@
package top.fjy8018.designpattern.principle.openclose;
import java.math.BigDecimal;
/**
* 课程实现类
*
* @author F嘉阳
* @date 2018-09-18 16:30
*/
public class JavaCourse implements Course {
private Integer id;
private String name;
private BigDecimal price;
public JavaCourse(Integer id, String name, BigDecimal price) {
this.id = id;
this.name = name;
this.price = price;
}
@Override
public Integer getId() {
return this.id;
}
@Override
public String getName() {
return this.name;
}
@Override
public BigDecimal getPrice() {
return this.price;
}
@Override
public String toString() {
return "JavaCourse{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price.setScale(2, BigDecimal.ROUND_HALF_UP) +
'}';
}
}

View File

@@ -0,0 +1,53 @@
package top.fjy8018.designpattern.principle.openclose;
import java.math.BigDecimal;
/**
* Java课程促销
* 根据开闭原则:对于扩展是开放的,对于修改是关闭的
* 故通过继承方式实现
*
* @author F嘉阳
* @date 2018-09-18 16:43
*/
public class JavaDiscountCourse extends JavaCourse {
public JavaDiscountCourse(Integer id, String name, BigDecimal price) {
super(id, name, price);
}
@Override
public Integer getId() {
return super.getId();
}
@Override
public String getName() {
return super.getName();
}
/**
* 获取原价
*
* @return
*/
public BigDecimal getOriginPrice() {
return super.getPrice();
}
/**
* 实现打折价格逻辑
*
* @return
*/
@Override
public BigDecimal getPrice() {
// BigDecimal推荐使用String构造器防止精度转换问题
return super.getPrice().multiply(new BigDecimal("0.8"));
}
@Override
public String toString() {
return super.toString();
}
}

View File

@@ -0,0 +1,18 @@
package top.fjy8018;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
/**
* Unit test for simple App.
*/
public class AppTest {
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue() {
assertTrue(true);
}
}

View File

@@ -0,0 +1,39 @@
package top.fjy8018.designpattern.principle.openclose;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import static org.junit.jupiter.api.Assertions.*;
/**
* 开闭原则单元测试
*/
@Slf4j
class JavaCourseTest {
/**
* 普通情况
*/
@Test
public void normal() {
Course javaCourse = new JavaCourse(1, "Java课程", new BigDecimal("99"));
log.info("课程Id{},课程名称:{},价格:{}", javaCourse.getId(), javaCourse.getName(), javaCourse.getPrice());
}
/**
* 促销打折情况
*/
@Test
public void discount() {
Course course = new JavaDiscountCourse(1, "Java课程", new BigDecimal("99"));
JavaDiscountCourse javaCourse = (JavaDiscountCourse) course;
log.info("课程Id{},课程名称:{},原价:{},折后价格:{}",
javaCourse.getId(), javaCourse.getName(), javaCourse.getOriginPrice(),
javaCourse.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP));
}
}