usersList){
+ if (usersList == null) {
+ System.out.println("没有邮件发送");
+ return;
+ }
+
+ for (UserInfo info : usersList){
+ if (!info.getEmail().isEmpty()) {
+ String emailInfo = generatePromotionEmail(info);
+ try {
+ sendPromotionEmail(emailInfo);
+ } catch (SMTPConnectionFailedException e){
+ System.out.println("SMTP主副服务器连接失败,请手动发送以下邮件: \n");
+ System.out.println(e.getMessage());
+ }
+ }
+ }
+ }
+
+ /**
+ * 假装在发邮件。默认使用主SMTP发送,若发送失败则使用备用SMTP发送。
+ * 仍然失败,则抛出SMTPConnectFailException异常。
+ * @param emailInfo 要发送的邮件内容
+ * @throws SMTPConnectionFailedException 若主副SMTP服务器均连接失败,抛出异常。异常中包含完整的发送失败的邮件内容。可通过getMessage()方法获得邮件内容。
+ */
+ private static void sendPromotionEmail(String emailInfo) throws SMTPConnectionFailedException{
+ //默认以SMTP_SERVER 发送
+ //如果发送失败以ALT_SMTP_SERVER 重新发送
+ //如果还失败,throw new SMTPConnectionFailedException(emailInfo).
+ }
+
+ /**
+ * 根据用户信息生成促销邮件内容。
+ * @param userInfo 用户信息。
+ * @return 返回生成的邮件。
+ */
+ private static String generatePromotionEmail(UserInfo userInfo){
+ StringBuilder buffer = new StringBuilder();
+
+ buffer.append("From:").append(EMAIL_ADMIN).append("\n");
+ buffer.append("To:").append(userInfo.getEmail()).append("\n");
+ buffer.append("Subject:").append("您关注的产品降价了").append("\n");
+ buffer.append("Content:").append("尊敬的").append(userInfo.getName());
+ buffer.append(", 您关注的产品 ").append(userInfo.getProductDesc());
+ buffer.append(" 降价了,欢迎购买!").append("\n");
+
+ System.out.println(buffer.toString());
+
+ return buffer.toString();
+ }
+}
diff --git a/students/370677080/ood-assignment/test.txt b/students/370677080/ood-assignment/test.txt
new file mode 100644
index 0000000000..cb2d21edc4
--- /dev/null
+++ b/students/370677080/ood-assignment/test.txt
@@ -0,0 +1,5 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
+p123
diff --git a/students/395860968/OCP/AbstractNotifier.java b/students/395860968/OCP/AbstractNotifier.java
new file mode 100644
index 0000000000..4aaffa4dc3
--- /dev/null
+++ b/students/395860968/OCP/AbstractNotifier.java
@@ -0,0 +1,10 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public abstract class AbstractNotifier {
+ public void send(String logMsg) {
+
+ }
+}
diff --git a/students/395860968/OCP/ConsoleUtil.java b/students/395860968/OCP/ConsoleUtil.java
new file mode 100644
index 0000000000..e7a1e5e0ad
--- /dev/null
+++ b/students/395860968/OCP/ConsoleUtil.java
@@ -0,0 +1,11 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public class ConsoleUtil extends AbstractNotifier {
+ public void send(String logMsg) {
+ // TODO Auto-generated method stub
+ System.out.println("Console send: " + logMsg);
+ }
+}
diff --git a/students/395860968/OCP/DateFormatter.java b/students/395860968/OCP/DateFormatter.java
new file mode 100644
index 0000000000..37719ae800
--- /dev/null
+++ b/students/395860968/OCP/DateFormatter.java
@@ -0,0 +1,13 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public class DateFormatter extends Formatter {
+ @Override
+ public String formatMessage(String msg) {
+ String txtDate = DateUtil.getCurrentDateAsString();
+ return txtDate + " : " + msg;
+
+ }
+}
diff --git a/students/395860968/OCP/DateUtil.java b/students/395860968/OCP/DateUtil.java
new file mode 100644
index 0000000000..5d0e77a475
--- /dev/null
+++ b/students/395860968/OCP/DateUtil.java
@@ -0,0 +1,10 @@
+package com.company;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return "20170101";
+ }
+
+}
diff --git a/students/395860968/OCP/Formatter.java b/students/395860968/OCP/Formatter.java
new file mode 100644
index 0000000000..453d2a98d9
--- /dev/null
+++ b/students/395860968/OCP/Formatter.java
@@ -0,0 +1,10 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public class Formatter {
+ public String formatMessage(String msg) {
+ return msg;
+ }
+}
diff --git a/students/395860968/OCP/Logger.java b/students/395860968/OCP/Logger.java
new file mode 100644
index 0000000000..29b4396cb4
--- /dev/null
+++ b/students/395860968/OCP/Logger.java
@@ -0,0 +1,15 @@
+package com.company;
+
+public class Logger {
+ private AbstractNotifier notifier;
+ private Formatter formatter;
+ public Logger(Formatter formatter, AbstractNotifier notifier){
+ this.formatter = formatter;
+ this.notifier = notifier;
+ }
+ public void log(String msg){
+ String logMsg = this.formatter.formatMessage(msg);
+ notifier.send(logMsg);
+ }
+}
+
diff --git a/students/395860968/OCP/MailUtil.java b/students/395860968/OCP/MailUtil.java
new file mode 100644
index 0000000000..3b38eb1630
--- /dev/null
+++ b/students/395860968/OCP/MailUtil.java
@@ -0,0 +1,11 @@
+package com.company;
+
+public class MailUtil extends AbstractNotifier {
+
+ @Override
+ public void send(String logMsg) {
+ // TODO Auto-generated method stub
+ System.out.println("Mail send: " + logMsg);
+ }
+
+}
diff --git a/students/395860968/OCP/Main.java b/students/395860968/OCP/Main.java
new file mode 100644
index 0000000000..cee3424004
--- /dev/null
+++ b/students/395860968/OCP/Main.java
@@ -0,0 +1,17 @@
+package com.company;
+
+public class Main {
+
+ public static void main(String[] args) {
+ // write your code here
+ ConsoleUtil consoleUtil = new ConsoleUtil();
+ Formatter formatter = new Formatter();
+ Logger logger = new Logger(formatter,consoleUtil);
+ logger.log("abc");
+ MailUtil mailUtil = new MailUtil();
+ DateFormatter dateformatter = new DateFormatter();
+ Logger logger2 = new Logger(dateformatter,mailUtil);
+ logger2.log("efg");
+
+ }
+}
diff --git a/students/395860968/OCP/SMSUtil.java b/students/395860968/OCP/SMSUtil.java
new file mode 100644
index 0000000000..1bd29a0613
--- /dev/null
+++ b/students/395860968/OCP/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.company;
+
+public class SMSUtil extends AbstractNotifier {
+
+ public void send(String logMsg) {
+ // TODO Auto-generated method stub
+ System.out.println("SMS send: " + logMsg);
+ }
+
+}
diff --git a/students/395860968/ood-assignment/Configuration.java b/students/395860968/SRP/Configuration.java
similarity index 100%
rename from students/395860968/ood-assignment/Configuration.java
rename to students/395860968/SRP/Configuration.java
diff --git a/students/395860968/ood-assignment/ConfigurationKeys.java b/students/395860968/SRP/ConfigurationKeys.java
similarity index 100%
rename from students/395860968/ood-assignment/ConfigurationKeys.java
rename to students/395860968/SRP/ConfigurationKeys.java
diff --git a/students/395860968/ood-assignment/DBUtil.java b/students/395860968/SRP/DBUtil.java
similarity index 100%
rename from students/395860968/ood-assignment/DBUtil.java
rename to students/395860968/SRP/DBUtil.java
diff --git a/students/395860968/ood-assignment/FileUtil.java b/students/395860968/SRP/FileUtil.java
similarity index 100%
rename from students/395860968/ood-assignment/FileUtil.java
rename to students/395860968/SRP/FileUtil.java
diff --git a/students/395860968/ood-assignment/MailUtil.java b/students/395860968/SRP/MailUtil.java
similarity index 100%
rename from students/395860968/ood-assignment/MailUtil.java
rename to students/395860968/SRP/MailUtil.java
diff --git a/students/395860968/ood-assignment/Product.java b/students/395860968/SRP/Product.java
similarity index 100%
rename from students/395860968/ood-assignment/Product.java
rename to students/395860968/SRP/Product.java
diff --git a/students/395860968/ood-assignment/PromotionMail.java b/students/395860968/SRP/PromotionMail.java
similarity index 100%
rename from students/395860968/ood-assignment/PromotionMail.java
rename to students/395860968/SRP/PromotionMail.java
diff --git a/students/395860968/ood-assignment/product_promotion.txt b/students/395860968/SRP/product_promotion.txt
similarity index 100%
rename from students/395860968/ood-assignment/product_promotion.txt
rename to students/395860968/SRP/product_promotion.txt
diff --git a/students/395860968/ood-assignment/src b/students/395860968/SRP/src
similarity index 100%
rename from students/395860968/ood-assignment/src
rename to students/395860968/SRP/src
diff --git a/students/41689722.eulerlcs/regularexpression/pom.xml b/students/41689722.eulerlcs/regularexpression/pom.xml
new file mode 100644
index 0000000000..86657499f5
--- /dev/null
+++ b/students/41689722.eulerlcs/regularexpression/pom.xml
@@ -0,0 +1,111 @@
+
+ 4.0.0
+ com.github.eulerlcs
+ jmr-71-regularexpression
+ 0.0.1-SNAPSHOT
+ eulerlcs regular expression
+
+
+
+ 1.7.24
+ 4.12
+ 2.17
+ 1.8
+ 1.8
+
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.16.14
+ provided
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+ org.slf4j
+ slf4j-log4j12
+ ${slf4j.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.0.1
+
+
+ attach-source
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.1
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.0.2
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.10.4
+
+ true
+ 1.8
+ protected
+ UTF-8
+ UTF-8
+ UTF-8
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.19.1
+
+
+ org.apache.maven.plugins
+ maven-surefire-report-plugin
+ 2.19.1
+
+ true
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+
+
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java b/students/41689722.eulerlcs/regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
new file mode 100644
index 0000000000..aa5e45c5ed
--- /dev/null
+++ b/students/41689722.eulerlcs/regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
@@ -0,0 +1,27 @@
+package com.github.eulerlcs.regularexpression;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class Utils {
+
+ public static String readAllFromResouce(String resourceName) {
+ byte[] fileContentBytes;
+ try {
+ Path path = Paths.get(ClassLoader.getSystemResource(resourceName).toURI());
+ fileContentBytes = Files.readAllBytes(path);
+ String fileContentStr = new String(fileContentBytes, StandardCharsets.UTF_8);
+
+ return fileContentStr;
+ } catch (IOException | URISyntaxException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return "";
+ }
+}
diff --git a/students/41689722.eulerlcs/regularexpression/src/main/resources/.gitkeep b/students/41689722.eulerlcs/regularexpression/src/main/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/regularexpression/src/main/resources/log4j.xml b/students/41689722.eulerlcs/regularexpression/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/regularexpression/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/regularexpression/src/test/java/.gitkeep b/students/41689722.eulerlcs/regularexpression/src/test/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java b/students/41689722.eulerlcs/regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
new file mode 100644
index 0000000000..3fa9e25c8d
--- /dev/null
+++ b/students/41689722.eulerlcs/regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
@@ -0,0 +1,316 @@
+package com.github.eulerlcs.regularexpression;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+// http://www.cnblogs.com/playing/archive/2011/03/15/1984943.html
+
+public class UtilsTest {
+
+ /**
+ * 多行模式-1
+ */
+ @Test
+ public void test01_01() {
+ String t1 = Utils.readAllFromResouce("01.txt");
+
+ // 默认 单行模式
+ Pattern p1 = Pattern.compile("^def$");
+ Matcher m1 = p1.matcher(t1);
+
+ if (m1.find()) {
+ System.out.println("found!");
+ } else {
+ System.out.println("not found!");
+ }
+ }
+
+ /**
+ *
+ * 多行模式-2
+ * (?m) Pattern.MULTILINE
+ *
+ */
+ @Test
+ public void test01_02() {
+ String t1 = Utils.readAllFromResouce("01.txt");
+
+ // 多行模式 写法一
+ // Pattern p1 = Pattern.compile("(?m)^def$");
+ // 多行模式 写法二
+ Pattern p1 = Pattern.compile("^def$", Pattern.MULTILINE);
+
+ Matcher m1 = p1.matcher(t1);
+
+ if (m1.find()) {
+ System.out.println("found!");
+ } else {
+ System.out.println("not found!");
+ }
+ }
+
+ /**
+ * flag设定和(?X)的等价关系
+ *
+ *
+ * (?m) Pattern.MULTILINE
+ * (?i) Pattern.CASE_INSENSITIVE
+ * (?u) Pattern.UNICODE_CASE
+ * (?s) Pattern.DOTALL
+ * (?d) Pattern.UNIX_LINES
+ * (?x) Pattern.COMMENTS
+ *
+ */
+
+ /**
+ *
+ * ascii大小写
+ * (?i) Pattern.CASE_INSENSITIVE
+ *
+ */
+ @Test
+ public void test02_01() {
+ String t1 = "abc AbC aCd abc ABc 2343";
+ String r1 = "abc";
+
+ // 默认 区分大小写
+ // Pattern p1 = Pattern.compile(r1);
+
+ // 忽略ascii大小,写法一
+ Pattern p1 = Pattern.compile("(?i)abc");
+
+ // 忽略ascii大小,写法而
+ // Pattern p1 = Pattern.compile(r1, Pattern.CASE_INSENSITIVE );
+
+ Matcher m1 = p1.matcher(t1);
+
+ while (m1.find()) {
+ System.out.println(m1.group());
+ }
+ }
+
+ /**
+ *
+ * unicode大小写
+ * (?u) Pattern.UNICODE_CASE
+ *
+ */
+ @Test
+ public void test03_01() {
+ String t1 = "abc AbC aCd abc ABc 2343";
+ String r1 = "abc";// 日文输入法下,全角abc,也就是宽字体
+
+ // 默认 区分大小写只适用于ascii
+ // Pattern p1 = Pattern.compile((?i)abc);
+
+ // 忽略ascii大小,写法一
+ Pattern p1 = Pattern.compile("(?iu)abc");
+
+ // 忽略ascii大小,写法而
+ // Pattern p1 = Pattern.compile(r1, Pattern.UNICODE_CASE);
+
+ Matcher m1 = p1.matcher(t1);
+
+ while (m1.find()) {
+ System.out.println(m1.group());
+ }
+ }
+
+ /** 通过设定标志位忽略大小写 */
+ @Test
+ public void test03_02() {
+ String t1 = "abc AbC aCd\nABCD 2343";
+ String r1 = "(?i)(?m)abc";
+ Pattern p1 = Pattern.compile(r1);
+ Matcher m1 = p1.matcher(t1);
+
+ while (m1.find()) {
+ System.out.println(m1.group());
+ }
+ }
+
+ @Test
+ public void test04_01_dotall() {
+ Pattern p = null;
+ Matcher m = null;
+
+ String text1 = "width height";
+ String text2 = "width\nheight";
+ // Pattern p = Pattern.compile("(?s)width.height");
+ p = Pattern.compile("width.height", Pattern.DOTALL);
+
+ m = p.matcher(text1);
+ boolean result1 = m.find();
+ if (result1) {
+ System.out.println("text1 found");
+ } else {
+ System.out.println("text1 not found");
+ }
+
+ m = p.matcher(text2);
+ boolean result2 = m.find();
+ if (result2) {
+ System.out.println("text2 found");
+ } else {
+ System.out.println("text2 not found");
+ }
+ }
+
+ /**
+ * group
+ *
+ *
+ * group(0):正则表达式的匹配值
+ * group(1):第一个子串
+ *
+ */
+ @Test
+ public void test05_01() {
+ Pattern p = Pattern.compile("([a-z]+)-(\\d+)");
+ Matcher m = p.matcher("type x-235, type y-3, type zw-465");
+
+ while (m.find()) {
+ for (int i = 0; i < m.groupCount() + 1; i++) {
+ System.out.println("group(" + i + ")=" + m.group(i));
+ }
+ System.out.println("---------------------");
+ }
+ }
+
+ /**
+ * 字符串分割的例子
+ */
+ @Test
+ public void test05_02() {
+ String abc = "a///b/c";
+
+ // 分割后的数组中包含空字符
+ String[] array1 = abc.split("/");
+ for (String str : array1) {
+ System.out.println(str);
+ }
+
+ System.out.println("---------------------");
+
+ // 分割后的数组中取出了空字符
+ String[] array2 = abc.split("/+");
+ for (String str : array2) {
+ System.out.println(str);
+ }
+ }
+
+ /**
+ * 替换
+ */
+ @Test
+ public void test06_01() {
+ String str = "Orange is 100yuan, Banana is 180 yuan.";
+ String regex = "\\d+\\s*yuan";
+ Pattern p = Pattern.compile(regex);
+
+ Matcher m = p.matcher(str);
+ System.out.println(m.find());
+ String result = m.replaceFirst("_$0_");
+
+ System.out.println(result);
+ }
+
+ /**
+ * 替换
+ */
+ @Test
+ public void test06_02() {
+ String str = "Orange is 100yuan, Banana is 180 yuan.";
+ String regex = "(\\d)\\s*(yuan)";
+
+ Pattern p = Pattern.compile(regex);
+ Matcher m = p.matcher(str);
+
+ String result = m.replaceAll("$2_$1");
+
+ System.out.println(result);
+ }
+
+ /**
+ * 命名分组,替换
+ */
+ @Test
+ public void test06_03() {
+ String pathfFilename = "aa/notepad.exe";
+
+ String regex = "^.+/(?.+)$";
+ String replacement = "${filename}";
+
+ String filename = pathfFilename.replaceFirst(regex, replacement);
+ System.out.println(filename);
+ }
+
+ /**
+ * 从文本中读取多行数据后,建议先把回车符删掉
+ */
+ @Test
+ public void test07_01() {
+ String t1 = Utils.readAllFromResouce("07.txt");
+ System.out.println("--orignal text start--");
+ System.out.print(t1);
+ System.out.println("--orignal text end --");
+
+ // 统一换行符
+ String ret1 = t1.replaceAll("(\r\n)|\r", "\n");
+ System.out.println("--统一换行符 start--");
+ System.out.print(ret1);
+ System.out.println("--统一换行符 end --");
+
+ // 行单位前后trim
+ String ret2 = ret1.replaceAll("(?m)^\\s*(.*?)\\s*$", "$1");
+ System.out.println("--行单位前后trim start--");
+ System.out.println(ret2);
+ System.out.println("--行单位前后trim end --");
+
+ assertFalse(ret2.equals(t1));
+ }
+
+ @Test
+ public void test01_04_Zz() {
+ Pattern p = null;
+ Matcher m = null;
+ boolean result1 = false;
+ boolean result2 = false;
+ boolean result3 = false;
+
+ String text1 = "abc def";
+ String text2 = "def abc";
+ String text3 = "def abc\n";
+
+ p = Pattern.compile("abc\\z");
+
+ m = p.matcher(text1);
+ result1 = m.find();
+
+ m = p.matcher(text2);
+ result2 = m.find();
+
+ m = p.matcher(text3);
+ result3 = m.find();
+
+ p = Pattern.compile("abc\\Z");
+
+ m = p.matcher(text1);
+ result1 = m.find();
+
+ m = p.matcher(text2);
+ result2 = m.find();
+
+ m = p.matcher(text3);
+ result3 = m.find();
+
+ assertFalse(result1);
+ assertTrue(result2);
+ assertTrue(result3);
+ }
+}
diff --git a/students/41689722.eulerlcs/regularexpression/src/test/resources/.gitkeep b/students/41689722.eulerlcs/regularexpression/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/regularexpression/src/test/resources/01.txt b/students/41689722.eulerlcs/regularexpression/src/test/resources/01.txt
new file mode 100644
index 0000000000..5f5521fae2
--- /dev/null
+++ b/students/41689722.eulerlcs/regularexpression/src/test/resources/01.txt
@@ -0,0 +1,2 @@
+abc
+def
diff --git a/students/41689722.eulerlcs/regularexpression/src/test/resources/07.txt b/students/41689722.eulerlcs/regularexpression/src/test/resources/07.txt
new file mode 100644
index 0000000000..be72da22ea
--- /dev/null
+++ b/students/41689722.eulerlcs/regularexpression/src/test/resources/07.txt
@@ -0,0 +1,5 @@
+ abc
+def
+
+gh
+
diff --git a/students/471398827/ood-assignment/pom.xml b/students/471398827/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/471398827/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
new file mode 100644
index 0000000000..13520f693c
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Config {
+ public static final int RAW_LOG = 1;
+ public static final int RAW_LOG_WITH_DATE = 2;
+ public static final int EMAIL_LOG = 1;
+ public static final int SMS_LOG = 2;
+ public static final int PRINT_LOG = 3;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
new file mode 100644
index 0000000000..cac875e053
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class DateMessage implements IMessage{
+ @Override
+ public String getMessage(String msg) {
+ return DateUtil.getCurrentDateAsString() + msg;
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..e9d919c378
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return "date : 8/20 ";
+ }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
new file mode 100644
index 0000000000..40a34666b8
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public interface ILog {
+ public void printLog(String msg);
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
new file mode 100644
index 0000000000..2ec8103863
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public interface IMessage {
+ public String getMessage(String msg);
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
new file mode 100644
index 0000000000..8ba78c7b1d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.srp.Mail;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class LogFactory {
+
+ static ILog produce(int logMethod) {
+ ILog log = null;
+ switch (logMethod) {
+ case Config.EMAIL_LOG:
+ log = new MailUtil();
+ break;
+ case Config.SMS_LOG:
+ log = new SMSUtil();
+ break;
+ case Config.PRINT_LOG:
+ log = new PrintUtil();
+ break;
+ }
+ return log;
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..c0579975de
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+ ILog myLog;
+ IMessage myMessage;
+
+ public Logger(int logType, int logMethod){
+ myMessage = MessageFactory.produce(logType);
+ myLog = LogFactory.produce(logMethod);
+ }
+ public void log(String msg){
+
+ myLog.printLog(myMessage.getMessage(msg));
+
+ }
+
+ public static void main(String[] args) {
+ Logger logger = new Logger(Config.RAW_LOG_WITH_DATE, Config.EMAIL_LOG);
+ logger.log("this is a log message");
+ }
+}
+
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..76d830742a
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil implements ILog{
+
+ @Override
+ public void printLog(String msg) {
+ msg = "Mail..." + "\n" + msg;
+ System.out.println(msg);
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
new file mode 100644
index 0000000000..10faf8f6d0
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class MessageFactory {
+
+ static IMessage produce(int messageType) {
+ IMessage msg = null;
+ switch (messageType) {
+ case Config.RAW_LOG:
+ msg = new RawMessage();
+ break;
+ case Config.RAW_LOG_WITH_DATE:
+ msg = new DateMessage();
+ break;
+ }
+ return msg;
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
new file mode 100644
index 0000000000..4e337a3d42
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class PrintUtil implements ILog{
+ @Override
+ public void printLog(String msg) {
+ System.out.println(msg);
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
new file mode 100644
index 0000000000..0d6c48a796
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class RawMessage implements IMessage{
+ @Override
+ public String getMessage(String msg) {
+ return msg;
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..c85286a465
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil implements ILog{
+
+ @Override
+ public void printLog(String msg) {
+ msg = "SMS..." + "\n" + msg;
+ System.out.println(msg);
+ }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..bd0db32d2a
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static boolean MAIL_DEBUG = false;
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ configurations.put(ConfigurationKeys.FILE_PATH, "/Users/szf/git/coding2017/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public static String getProperty(String key) {
+
+ return configurations.get(key);
+
+ }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..d4acd3240f
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+ public static final String FILE_PATH = "file.path";
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..140d505a65
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ String userName = "User" + i;
+ String email = "aa@bb.com";
+ User user = new User(userName, email);
+ userList.add(user);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..231947248d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Mail {
+ private String host;
+
+ public Mail(String host) {
+ this.host = host;
+ }
+
+ public boolean send(Message msg) throws Exception {
+ System.out.println("Host: " + this.host);
+ msg.print();
+ return true;
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..502a7d96f0
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+ private static Mail firstSMPTHost, secondSMPTHost;
+
+ static {
+ String host1 = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+ String host2 = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ firstSMPTHost = new Mail(host1);
+ secondSMPTHost = new Mail(host2);
+ }
+
+
+ public static void sendEmail(Message msg) throws Exception{
+ //假装发了一封邮件
+
+ if (msg != null) {
+
+ System.out.println("开始发送邮件");
+
+ if (msg.checkFormat()) {
+
+ System.out.println("发送邮件...");
+
+ try {
+
+ firstSMPTHost.send(msg);
+
+ System.out.println("发送邮件成功");
+
+ } catch (Exception e) {
+ try {
+
+ secondSMPTHost.send(msg);
+
+ } catch (Exception e2) {
+
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+
+ }
+ }
+ } else {
+
+ System.out.println("邮件格式不对");
+
+ }
+ } else {
+
+ System.out.println("没有邮件发送");
+
+ }
+ }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
new file mode 100644
index 0000000000..a0a16d2756
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
@@ -0,0 +1,65 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Message {
+ private String toAddress;
+ private String fromAddress;
+ private String subject;
+ private String message;
+
+ public Message(String toAddress, String fromAddress, String subject, String message) {
+ this.toAddress = toAddress;
+ this.fromAddress = fromAddress;
+ this.subject = subject;
+ this.message = message;
+ }
+
+ public void print() {
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+ }
+
+ public boolean checkFormat() {
+ return true;
+ }
+
+ public String getToAddress() {
+
+ return toAddress;
+ }
+
+ public void setToAddress(String toAddress) {
+ this.toAddress = toAddress;
+ }
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ public void setFromAddress(String fromAddress) {
+ this.fromAddress = fromAddress;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..5662ace67d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Product {
+ public String getProductId() {
+ return productId;
+ }
+
+ public Product(String productId, String productDesc) {
+ this.productId = productId;
+ this.productDesc = productDesc;
+ }
+
+ public Product() {
+ }
+
+ public void setProductId(String productId) {
+ this.productId = productId;
+ }
+
+ public String getProductDesc() {
+ return productDesc;
+ }
+
+ public void setProductDesc(String productDesc) {
+ this.productDesc = productDesc;
+ }
+
+ private String productId;
+ private String productDesc;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
new file mode 100644
index 0000000000..f7366c27e4
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class ProductFactory {
+ List getNewProdcuts(File file) throws IOException {
+ BufferedReader br = null;
+ List newProducts = new ArrayList<>();
+ try {
+ br = new BufferedReader(new FileReader(file));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+
+ Product product = new Product(data[0], data[1]);
+ newProducts.add(product);
+
+ System.out.println("产品ID = " + product.getProductId() + "\n");
+ System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ return newProducts;
+ }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..fa90f9a539
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,51 @@
+package com.coderising.ood.srp;
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+
+ public static void main(String[] args) throws Exception {
+
+ PromotionMail pe = new PromotionMail();
+
+ }
+
+
+ public PromotionMail() throws Exception {
+
+ if (Configuration.MAIL_DEBUG) {
+ System.out.println("debugging...");
+ }
+
+ ProductFactory factory = new ProductFactory();
+
+ File file = new File(Configuration.getProperty(ConfigurationKeys.FILE_PATH));
+ List products = factory.getNewProdcuts(file);
+
+ String productID = "1";
+ String sql = "Select name from subscriptions "
+ + "where product_id= '" + productID +"' "
+ + "and send_mail=1 ";
+
+ List users = DBUtil.query(sql);
+
+
+ for (User user : users) {
+ for (Product product : products) {
+
+ String to_address = user.getEmail();
+ String from_address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ String subject = "您关注的产品降价了";
+ String message = "尊敬的 "+ user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了,欢迎购买!" ;
+
+ Message msg = new Message(to_address, from_address, subject, message);
+
+ MailUtil.sendEmail(msg);
+ }
+
+ }
+ }
+
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..225f98b727
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class User {
+ private String Name;
+
+ public User(String name, String email) {
+ Name = name;
+ Email = email;
+ }
+
+ public String getName() {
+
+ return Name;
+ }
+
+ public void setName(String name) {
+ Name = name;
+ }
+
+ public String getEmail() {
+ return Email;
+ }
+
+ public void setEmail(String email) {
+ Email = email;
+ }
+
+ private String Email;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/495232796/OOD/UML/DiceGame-class.jpg b/students/495232796/OOD/UML/DiceGame-class.jpg
new file mode 100644
index 0000000000..869d72dd5e
Binary files /dev/null and b/students/495232796/OOD/UML/DiceGame-class.jpg differ
diff --git a/students/495232796/OOD/UML/DiceGame-sequence.jpg b/students/495232796/OOD/UML/DiceGame-sequence.jpg
new file mode 100644
index 0000000000..8d6b90e9b3
Binary files /dev/null and b/students/495232796/OOD/UML/DiceGame-sequence.jpg differ
diff --git a/students/495232796/OOD/UML/ShoppingSite.jpg b/students/495232796/OOD/UML/ShoppingSite.jpg
new file mode 100644
index 0000000000..5e05336f62
Binary files /dev/null and b/students/495232796/OOD/UML/ShoppingSite.jpg differ
diff --git a/students/495232796/OOD/ood-assignment/config/product_promotion.txt b/students/495232796/OOD/ood-assignment/config/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/config/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/495232796/OOD/ood-assignment/pom.xml b/students/495232796/OOD/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/ComSender.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/ComSender.java
new file mode 100644
index 0000000000..19f2c796b0
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/ComSender.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp;
+
+public class ComSender implements Sender {
+ public void send(String msg) {
+ System.out.println(msg);
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/LogType.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/LogType.java
new file mode 100644
index 0000000000..d33d7d0240
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/LogType.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class LogType {
+ public static final int RAW_LOG = 1;
+ public static final int RAW_LOG_WITH_DATE = 2;
+ public static final int EMAIL_LOG = 1;
+ public static final int SMS_LOG = 2;
+ public static final int PRINT_LOG = 3;
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..45525df9ba
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+ int type = 0;
+ int method = 0;
+
+ public Logger(int logType, int logMethod){
+ this.type = logType;
+ this.method = logMethod;
+ }
+ public void log(String msg){
+
+ String logMsg = msg;
+
+ if(this.type == LogType.RAW_LOG){
+ logMsg = msg;
+ } else if(this.type == LogType.RAW_LOG_WITH_DATE){
+ String txtDate = DateUtil.getCurrentDateAsString();
+ logMsg = txtDate + ": " + msg;
+ }
+
+ SenderFactory.createSender(type).send(logMsg);
+ }
+}
+
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..dff0eb9748
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil implements Sender{
+
+ public void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..be47b2c084
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil implements Sender {
+
+ public void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
new file mode 100644
index 0000000000..4bb54aa1e8
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface Sender {
+ public void send(String msg);
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java
new file mode 100644
index 0000000000..6915ff2992
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.ocp;
+
+public class SenderFactory {
+ public static Sender createSender(int type) {
+ if(type == LogType.EMAIL_LOG){
+ return new MailUtil();
+ } else if(type == LogType.SMS_LOG){
+ return new SMSUtil();
+ } else if(type == LogType.PRINT_LOG){
+ return new ComSender();
+ }
+
+ return new ComSender();
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.good;
+
+public interface Formatter {
+
+ String format(String msg);
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.good;
+
+public class FormatterFactory {
+ public static Formatter createFormatter(int type){
+ if(type == 1){
+ return new RawFormatter();
+ }
+ if (type == 2){
+ return new HtmlFormatter();
+ }
+ return null;
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.good;
+
+public class HtmlFormatter implements Formatter {
+
+ @Override
+ public String format(String msg) {
+
+ return null;
+ }
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.ocp.good;
+
+public class Logger {
+
+ private Formatter formatter;
+ private Sender sender;
+
+ public Logger(Formatter formatter,Sender sender){
+ this.formatter = formatter;
+ this.sender = sender;
+ }
+ public void log(String msg){
+ sender.send(formatter.format(msg)) ;
+ }
+
+
+}
+
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.good;
+
+public class RawFormatter implements Formatter {
+
+ @Override
+ public String format(String msg) {
+
+ return null;
+ }
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.good;
+
+public interface Sender {
+
+ void send(String msg);
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/CommonKeys.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/CommonKeys.java
new file mode 100644
index 0000000000..2980cc40ca
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/CommonKeys.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+public class CommonKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+ public static final String NAME_KEY = "NAME";
+ public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..13cc1b5890
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(CommonKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(CommonKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(CommonKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..ff8215b4d2
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put(CommonKeys.NAME_KEY, "User" + i);
+ userInfo.put(CommonKeys.EMAIL_KEY, "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailAddr.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailAddr.java
new file mode 100644
index 0000000000..239166dd11
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailAddr.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp;
+
+public class MailAddr {
+ protected String smtpHost = null;
+ protected String altSmtpHost = null;
+ protected String fromAddress = null;
+ protected String toAddress = null;
+
+ public MailAddr(Configuration config) {
+ reloadconfig(config);
+ }
+
+ public void reloadconfig(Configuration config) {
+ smtpHost = config.getProperty(CommonKeys.SMTP_SERVER);
+ altSmtpHost = config.getProperty(CommonKeys.ALT_SMTP_SERVER);
+ fromAddress = config.getProperty(CommonKeys.EMAIL_ADMIN);
+ }
+
+ public void setToAddress(String address) {
+ toAddress = address;
+ }
+
+ public String getToAddress() {
+ return toAddress;
+ }
+
+ public boolean checkToAddress() {
+ return toAddress.length() > 0;
+ }
+
+ public String getSmtpHost() {
+ return smtpHost;
+ }
+
+ public String getAltSmtpHost() {
+ return altSmtpHost;
+ }
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailMsg.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailMsg.java
new file mode 100644
index 0000000000..dd834ccfef
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailMsg.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp;
+
+public class MailMsg {
+ protected String subject = null;
+ protected String message = null;
+
+ public MailMsg(String sub, String msg) {
+ this.subject = sub;
+ this.message = msg;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..cfb2cffa7c
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+ public static void sendEmail(MailAddr mailAddr, MailMsg mailMsg, boolean debug) {
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(mailAddr.getFromAddress()).append("\n");
+ buffer.append("To:").append(mailAddr.getToAddress()).append("\n");
+ buffer.append("Subject:").append(mailMsg.getSubject()).append("\n");
+ buffer.append("Content:").append(mailMsg.getMessage()).append("\n");
+ System.out.println(buffer.toString());
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..ad68f0a7eb
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductInfo {
+ protected String productID = null;
+ protected String productDesc = null;
+
+ public ProductInfo(String path) {
+ try {
+ readFile(path);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected void readFile(String path) throws IOException
+ {
+ File f = new File(path);
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(f));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+
+ this.productID = data[0];
+ this.productDesc = data[1];
+
+ System.out.println("产品ID = " + productID + "\n");
+ System.out.println("产品描述 = " + productDesc + "\n");
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+
+ public String getProductID() {
+ return productID;
+ }
+
+ public String getProductDesc() {
+ return productDesc;
+ }
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..808caab9f8
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,89 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+ protected String sendMailQuery = null;
+ protected boolean emailDebug = false;
+ protected ProductInfo productInfo = null;
+ protected MailAddr mailAddr = null;
+ private static Configuration config;
+
+ public static void main(String[] args) throws Exception {
+ String path = "D:\\projects\\OOD\\project\\ood-assignment\\config\\product_promotion.txt";
+
+ PromotionMail pe = new PromotionMail(path, false);
+ pe.sendEmails();
+ }
+
+ public PromotionMail(String path, boolean mailDebug) throws Exception {
+ this.emailDebug = mailDebug;
+ productInfo = new ProductInfo(path);
+ config = new Configuration();
+ mailAddr = new MailAddr(config);
+ }
+
+ protected void setLoadQuery() throws Exception {
+ sendMailQuery = "Select name from subscriptions " + "where product_id= '" + this.productInfo.getProductID()
+ + "' " + "and send_mail=1 ";
+
+ System.out.println("loadQuery set");
+ }
+
+ protected MailMsg setMessage(HashMap userInfo) throws IOException {
+
+ String name = (String) userInfo.get(CommonKeys.NAME_KEY);
+
+ String subject = "您关注的产品降价了";
+ String message = "尊敬的 " + name + ", 您关注的产品 " + this.productInfo.getProductDesc() + " 降价了,欢迎购买!";
+
+ return new MailMsg(subject, message);
+ }
+
+ protected List loadMailingList() throws Exception {
+ return DBUtil.query(this.sendMailQuery);
+ }
+
+ public void sendEmails() {
+ try {
+ setLoadQuery();
+ sendEMails(emailDebug, loadMailingList());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ protected void sendEMails(boolean debug, List mailingList) throws IOException {
+ System.out.println("开始发送邮件");
+
+ if (mailingList != null) {
+ Iterator iter = mailingList.iterator();
+ while (iter.hasNext()) {
+ HashMap userInfo = (HashMap) iter.next();
+ mailAddr.setToAddress((String) userInfo.get(CommonKeys.EMAIL_KEY));
+ if (mailAddr.checkToAddress()) {
+ MailMsg mailmsg = setMessage(userInfo);
+ try {
+ MailUtil.sendEmail(mailAddr, mailmsg, debug);
+ } catch (Exception e) {
+ try {
+ MailUtil.sendEmail(mailAddr, mailmsg, debug);
+ } catch (Exception e2) {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+ }
+ } else {
+ System.out.println("没有邮件发送");
+ }
+
+ }
+}
diff --git a/students/495232796/OOD/payment/src/Affiliation/Affiliation.java b/students/495232796/OOD/payment/src/Affiliation/Affiliation.java
new file mode 100644
index 0000000000..5e2dac8fa0
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/Affiliation.java
@@ -0,0 +1,7 @@
+package Affiliation;
+
+import PayCheck.PayCheck;
+
+public abstract class Affiliation {
+ public abstract double calculateDeduction(PayCheck pc);
+}
diff --git a/students/495232796/OOD/payment/src/Affiliation/NonAffiliation.java b/students/495232796/OOD/payment/src/Affiliation/NonAffiliation.java
new file mode 100644
index 0000000000..d37c1e35ff
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/NonAffiliation.java
@@ -0,0 +1,12 @@
+package Affiliation;
+
+import PayCheck.PayCheck;
+
+public class NonAffiliation extends Affiliation{
+
+ @Override
+ public double calculateDeduction(PayCheck pc) {
+ return 0.0;
+ }
+
+}
diff --git a/students/495232796/OOD/payment/src/Affiliation/ServiceCharge.java b/students/495232796/OOD/payment/src/Affiliation/ServiceCharge.java
new file mode 100644
index 0000000000..a7faa67adb
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/ServiceCharge.java
@@ -0,0 +1,20 @@
+package Affiliation;
+
+import java.util.Date;
+
+public class ServiceCharge {
+ private Date date;
+ private double amount;
+ public double getAmount() {
+ return amount;
+ }
+ public void setAmount(double amount) {
+ this.amount = amount;
+ }
+ public Date getDate() {
+ return date;
+ }
+ public void setDate(Date date) {
+ this.date = date;
+ }
+}
diff --git a/students/495232796/OOD/payment/src/Affiliation/UnionAffiliation.java b/students/495232796/OOD/payment/src/Affiliation/UnionAffiliation.java
new file mode 100644
index 0000000000..02e645ef1f
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/UnionAffiliation.java
@@ -0,0 +1,27 @@
+package Affiliation;
+
+import java.util.Date;
+import java.util.Map;
+
+import PayCheck.PayCheck;
+import DateUtil.DateUtil;
+
+public class UnionAffiliation extends Affiliation{
+ private String memId;
+ private double weeklyDue;
+ private Map serviceCharges;
+ @Override
+ public double calculateDeduction(PayCheck pc) {
+ int fridays = DateUtil.getFridays(pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate());
+ double totalDue = fridays*this.weeklyDue;
+
+ double totalCharges = 0.0;
+ for (ServiceCharge sc : serviceCharges.values()) {
+ if (DateUtil.between(sc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+ totalCharges += sc.getAmount();
+ }
+ }
+ return totalDue+totalCharges;
+ }
+
+}
diff --git a/students/495232796/OOD/payment/src/DateUtil/DateUtil.java b/students/495232796/OOD/payment/src/DateUtil/DateUtil.java
new file mode 100644
index 0000000000..6ed884bfa8
--- /dev/null
+++ b/students/495232796/OOD/payment/src/DateUtil/DateUtil.java
@@ -0,0 +1,37 @@
+package DateUtil;
+
+import java.util.Date;
+
+public class DateUtil {
+ public static boolean isFriday(Date d) {
+ return true;
+ }
+
+ public static Date add(Date d, int days) {
+ return new Date();
+ }
+
+ public static boolean isLastDayofMonth(Date d) {
+ return false;
+ }
+
+ public static Date getFirstDay(Date d) {
+ return new Date();
+ }
+
+ public static long getDaysBetween(Date start, Date end) {
+ return 0;
+ }
+
+ public static Date parseDay(String dayStr) {
+ return new Date();
+ }
+
+ public static boolean between(Date d, Date start, Date end) {
+ return true;
+ }
+
+ public static int getFridays(Date start, Date end) {
+ return 0;
+ }
+}
diff --git a/students/495232796/OOD/payment/src/Employ/Employee.java b/students/495232796/OOD/payment/src/Employ/Employee.java
new file mode 100644
index 0000000000..b21eec7869
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Employ/Employee.java
@@ -0,0 +1,41 @@
+package Employ;
+
+import java.util.Date;
+
+import Affiliation.Affiliation;
+import PayCheck.PayCheck;
+import PaymentClassification.PaymentClassification;
+import PaymentMethod.PaymentMethod;
+import PaymentSchedule.PaymentSchedule;
+
+public class Employee {
+ private String id;
+ private String name;
+ private String address;
+ PaymentClassification payment;
+ PaymentSchedule paySch;
+ PaymentMethod payMethod;
+ Affiliation af;
+
+ public Employee(String name, String address) {
+ this.name = name;
+ this.address = address;
+ }
+ public boolean isPayDay(Date d) {
+ return this.paySch.isPayDay(d);
+ }
+
+ public Date getPayPeriodStartDate(Date d) {
+ return this.paySch.getPayPeriodStartDate(d);
+ }
+
+ public void payDay(PayCheck pc) {
+ double grossPay = payment.calculatePay(pc);
+ double dedutions = af.calculateDeduction(pc);
+ double netPay = grossPay - dedutions;
+ pc.setGrossPay(grossPay);
+ pc.setDeductions(dedutions);
+ pc.setNetPay(netPay);
+ payMethod.pay(pc);
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PayCheck/PayCheck.java b/students/495232796/OOD/payment/src/PayCheck/PayCheck.java
new file mode 100644
index 0000000000..ceea1e41fe
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PayCheck/PayCheck.java
@@ -0,0 +1,36 @@
+package PayCheck;
+
+import java.util.Date;
+
+public class PayCheck {
+ private int payPeriodStart;
+ private int payPeriodEnd;
+ private double grossPay;
+ private double deductions;
+ private double netPay;
+ public double getGrossPay() {
+ return grossPay;
+ }
+ public void setGrossPay(double grossPay) {
+ this.grossPay = grossPay;
+ }
+ public double getDeductions() {
+ return deductions;
+ }
+ public void setDeductions(double deductions) {
+ this.deductions = deductions;
+ }
+ public double getNetPay() {
+ return netPay;
+ }
+ public void setNetPay(double netPay) {
+ this.netPay = netPay;
+ }
+
+ public Date getPayPeriodStartDate() {
+ return new Date();
+ }
+ public Date getPayPeriodEndDate() {
+ return new Date();
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/CommissionClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/CommissionClassification.java
new file mode 100644
index 0000000000..e1b9edab23
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/CommissionClassification.java
@@ -0,0 +1,23 @@
+package PaymentClassification;
+
+import java.util.Date;
+import java.util.Map;
+
+import PayCheck.PayCheck;
+import DateUtil.DateUtil;
+
+public class CommissionClassification extends PaymentClassification{
+ private double rate = 0.0;
+ private double salary = 0.0;
+ private Map receipts;
+ @Override
+ public double calculatePay(PayCheck pc) {
+ double commission = 0.0;
+ for (SalesReceipt sr : receipts.values()) {
+ if (DateUtil.between(sr.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+ commission += sr.getAmount()*rate;
+ }
+ }
+ return commission+salary;
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/HourlyClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/HourlyClassification.java
new file mode 100644
index 0000000000..00ae430777
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/HourlyClassification.java
@@ -0,0 +1,38 @@
+package PaymentClassification;
+
+import java.util.Date;
+import java.util.Map;
+
+import DateUtil.DateUtil;
+import PayCheck.PayCheck;
+
+public class HourlyClassification extends PaymentClassification{
+ private double hourlyRate = 0.0;
+ private Map timeCards;
+
+ public void addTimeCard(TimeCard tc) {
+ timeCards.put(tc.getDate(), tc);
+ }
+
+ @Override
+ public double calculatePay(PayCheck pc) {
+ double total = 0.0;
+
+ for (TimeCard tc : timeCards.values()) {
+ if (DateUtil.between(tc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+ total += calculatePayForTimeCard(tc);
+ }
+ }
+
+ return total;
+ }
+
+ private double calculatePayForTimeCard(TimeCard tc) {
+ int hours = tc.getHours();
+ if (hours > 8) {
+ return 8*this.hourlyRate + (hours - 8)*this.hourlyRate*1.5;
+ } else {
+ return 8*this.hourlyRate;
+ }
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/PaymentClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/PaymentClassification.java
new file mode 100644
index 0000000000..f9b06d744f
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/PaymentClassification.java
@@ -0,0 +1,7 @@
+package PaymentClassification;
+
+import PayCheck.PayCheck;
+
+public abstract class PaymentClassification {
+ public abstract double calculatePay(PayCheck pc);
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/SalariedClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/SalariedClassification.java
new file mode 100644
index 0000000000..941bde9869
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/SalariedClassification.java
@@ -0,0 +1,12 @@
+package PaymentClassification;
+
+import PayCheck.PayCheck;
+
+public class SalariedClassification extends PaymentClassification {
+ private double salary = 0.0;
+
+ @Override
+ public double calculatePay(PayCheck pc) {
+ return salary;
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/SalesReceipt.java b/students/495232796/OOD/payment/src/PaymentClassification/SalesReceipt.java
new file mode 100644
index 0000000000..a9f07140bd
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/SalesReceipt.java
@@ -0,0 +1,20 @@
+package PaymentClassification;
+
+import java.util.Date;
+
+public class SalesReceipt {
+ private Date date;
+ private double amount;
+ public Date getDate() {
+ return date;
+ }
+ public void setDate(Date date) {
+ this.date = date;
+ }
+ public double getAmount() {
+ return amount;
+ }
+ public void setAmount(double amount) {
+ this.amount = amount;
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/TimeCard.java b/students/495232796/OOD/payment/src/PaymentClassification/TimeCard.java
new file mode 100644
index 0000000000..e4396ee603
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/TimeCard.java
@@ -0,0 +1,21 @@
+package PaymentClassification;
+
+import java.util.Date;
+
+public class TimeCard {
+ private Date date;
+ private int startTime;
+ private int endTime;
+
+ public Date getDate() {
+ return date;
+ }
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public int getHours() {
+ return endTime - startTime;
+ }
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/BankMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/BankMethod.java
new file mode 100644
index 0000000000..1ef31f13ba
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/BankMethod.java
@@ -0,0 +1,13 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public class BankMethod extends PaymentMethod{
+ private String bank;
+ private double account;
+ @Override
+ public void pay(PayCheck pc) {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/HoldMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/HoldMethod.java
new file mode 100644
index 0000000000..62d9b4439c
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/HoldMethod.java
@@ -0,0 +1,13 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public class HoldMethod extends PaymentMethod{
+
+ @Override
+ public void pay(PayCheck pc) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/MailMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/MailMethod.java
new file mode 100644
index 0000000000..f8a98e5113
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/MailMethod.java
@@ -0,0 +1,13 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public class MailMethod extends PaymentMethod{
+ private String address;
+
+ @Override
+ public void pay(PayCheck pc) {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/PaymentMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/PaymentMethod.java
new file mode 100644
index 0000000000..67093ae1a0
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/PaymentMethod.java
@@ -0,0 +1,7 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public abstract class PaymentMethod {
+ public abstract void pay(PayCheck pc);
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/BiWeeklySchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/BiWeeklySchedule.java
new file mode 100644
index 0000000000..ced0eb1d15
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/BiWeeklySchedule.java
@@ -0,0 +1,19 @@
+package PaymentSchedule;
+
+import java.util.Date;
+import DateUtil.DateUtil;
+
+public class BiWeeklySchedule implements PaymentSchedule{
+ Date firstFriday = DateUtil.parseDay("2017-01-01");
+ @Override
+ public boolean isPayDay(Date date) {
+ long interval = DateUtil.getDaysBetween(firstFriday, date);
+ return interval%14 == 0;
+ }
+
+ @Override
+ public Date getPayPeriodStartDate(Date date) {
+ return DateUtil.add(date, -13);
+ }
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/MothlySchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/MothlySchedule.java
new file mode 100644
index 0000000000..edac34d480
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/MothlySchedule.java
@@ -0,0 +1,19 @@
+package PaymentSchedule;
+
+import java.util.Date;
+
+import DateUtil.DateUtil;
+
+public class MothlySchedule implements PaymentSchedule{
+
+ @Override
+ public boolean isPayDay(Date date) {
+ return DateUtil.isLastDayofMonth(date);
+ }
+
+ @Override
+ public Date getPayPeriodStartDate(Date date) {
+ return DateUtil.getFirstDay(date);
+ }
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/PaymentSchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/PaymentSchedule.java
new file mode 100644
index 0000000000..e1dea539f8
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/PaymentSchedule.java
@@ -0,0 +1,10 @@
+package PaymentSchedule;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+
+ public boolean isPayDay(Date date);
+
+ public Date getPayPeriodStartDate(Date date);
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/WeeklySchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/WeeklySchedule.java
new file mode 100644
index 0000000000..9e8e4dfe9f
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/WeeklySchedule.java
@@ -0,0 +1,18 @@
+package PaymentSchedule;
+
+import java.util.Date;
+import DateUtil.DateUtil;
+
+public class WeeklySchedule implements PaymentSchedule{
+
+ @Override
+ public boolean isPayDay(Date date) {
+ return DateUtil.isFriday(date);
+ }
+
+ @Override
+ public Date getPayPeriodStartDate(Date date) {
+ return DateUtil.add(date, -6);
+ }
+
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..0d0d01098f
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..e404d9e702
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+ public final int RAW_LOG = 1;
+ public final int RAW_LOG_WITH_DATE = 2;
+
+ public final int EMAIL_LOG = 1;
+ public final int SMS_LOG = 2;
+ public final int PRINT_LOG = 3;
+
+ int type = 0;
+ int method = 0;
+
+ public Logger(int logType, int logMethod){
+ this.type = logType;
+ this.method = logMethod;
+ }
+ public void log(String msg){
+
+ String logMsg = msg;
+
+ if(this.type == RAW_LOG){
+ logMsg = msg;
+ } else if(this.type == RAW_LOG_WITH_DATE){
+ String txtDate = DateUtil.getCurrentDateAsString();
+ logMsg = txtDate + ": " + msg;
+ }
+
+ if(this.method == EMAIL_LOG){
+ MailUtil.send(logMsg);
+ } else if(this.method == SMS_LOG){
+ SMSUtil.send(logMsg);
+ } else if(this.method == PRINT_LOG){
+ System.out.println(logMsg);
+ }
+ }
+}
+
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Fomatter.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Fomatter.java
new file mode 100644
index 0000000000..6d107d54e9
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Fomatter.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public interface Fomatter {
+ public String format(String message);
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Logger.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Logger.java
new file mode 100644
index 0000000000..e25da9ca4b
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Logger.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class Logger {
+
+ private Fomatter fomatter;
+ private Processor processor;
+
+ public Logger(Fomatter fomatter, Processor processor) {
+ this.fomatter = fomatter;
+ this.processor = processor;
+ }
+
+ public void log(String message){
+ processor.process(fomatter.format(message));
+ }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/MailProcessor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/MailProcessor.java
new file mode 100644
index 0000000000..c3ce50d5ec
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/MailProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class MailProcessor implements Processor {
+ public void process(String message) {
+ System.out.println("Mail sending message :"+message);
+ }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/PrintProcessor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/PrintProcessor.java
new file mode 100644
index 0000000000..13b983064d
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/PrintProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class PrintProcessor implements Processor {
+ public void process(String message) {
+ System.out.println("Printing message :"+message);
+ }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Processor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Processor.java
new file mode 100644
index 0000000000..4cca74572f
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Processor.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public interface Processor {
+ public void process(String message);
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawLogFormatter.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawLogFormatter.java
new file mode 100644
index 0000000000..550361b511
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawLogFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class RawLogFormatter implements Fomatter {
+
+ public String format(String message) {
+ return message;
+ }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawWithDateLogFormatter.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawWithDateLogFormatter.java
new file mode 100644
index 0000000000..80da623d5d
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawWithDateLogFormatter.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.mine;
+
+import java.util.Date;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class RawWithDateLogFormatter implements Fomatter {
+ public String format(String message) {
+ String txtDate = new Date().toString();
+ return txtDate + ":" + message;
+ }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/SMSProcessor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/SMSProcessor.java
new file mode 100644
index 0000000000..946c14dea0
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/SMSProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class SMSProcessor implements Processor {
+ public void process(String message) {
+ System.out.println("SMS sending message :" + message);
+ }
+}
diff --git a/students/641013587/ood/ood-assignment/pom.xml b/students/641013587/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..65607712c0
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/pom.xml
@@ -0,0 +1,47 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.2
+
+ 1.7
+ 1.7
+ UTF-8
+
+
+
+
+
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constant/CommonConstant.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constant/CommonConstant.java
new file mode 100644
index 0000000000..fcba3fc9c2
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constant/CommonConstant.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp.constant;
+
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+
+public class CommonConstant {
+
+ public static final String SUBJECT = "您关注的产品降价了";
+
+ public static String getProductMessage(User user,Product product){
+ return "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了,欢迎购买!";
+ }
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
new file mode 100644
index 0000000000..6b3d11c41b
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.dao;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.entity.User;
+
+public class UserDao {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public List query(String sql){
+
+ List userList = new ArrayList<>();
+ for (int i = 1; i <= 3; i++) {
+ User userInfo = new User();
+ userInfo.setName("User" + i);
+ userInfo.setEmail("aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Msg.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Msg.java
new file mode 100644
index 0000000000..8b1bc8b132
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Msg.java
@@ -0,0 +1,50 @@
+package com.coderising.ood.srp.entity;
+
+public class Msg {
+
+ private String smtpHost ;
+ private String altSmtpHost;
+ private String fromAddress;
+ private String toAddress;
+ private String subject ;
+ private String message ;
+ public String getSmtpHost() {
+ return smtpHost;
+ }
+ public void setSmtpHost(String smtpHost) {
+ this.smtpHost = smtpHost;
+ }
+ public String getAltSmtpHost() {
+ return altSmtpHost;
+ }
+ public void setAltSmtpHost(String altSmtpHost) {
+ this.altSmtpHost = altSmtpHost;
+ }
+ public String getFromAddress() {
+ return fromAddress;
+ }
+ public void setFromAddress(String fromAddress) {
+ this.fromAddress = fromAddress;
+ }
+ public String getToAddress() {
+ return toAddress;
+ }
+ public void setToAddress(String toAddress) {
+ this.toAddress = toAddress;
+ }
+ public String getSubject() {
+ return subject;
+ }
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+ public String getMessage() {
+ return message;
+ }
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Product.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Product.java
new file mode 100644
index 0000000000..a721930d75
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Product.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp.entity;
+
+public class Product {
+ private String productID;
+ private String productDesc;
+ public String getProductID() {
+ return productID;
+ }
+ public void setProductID(String productID) {
+ this.productID = productID;
+ }
+ public String getProductDesc() {
+ return productDesc;
+ }
+ public void setProductDesc(String productDesc) {
+ this.productDesc = productDesc;
+ }
+
+
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/User.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/User.java
new file mode 100644
index 0000000000..78f83b38a1
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/User.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp.entity;
+
+public class User {
+ private String name;
+ private String email;
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getEmail() {
+ return email;
+ }
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
new file mode 100644
index 0000000000..217a42ceb1
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp.main;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.dao.UserDao;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.EmailService;
+import com.coderising.ood.srp.service.UserService;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.util.PropertiesUtil;
+
+public class PromotionMail {
+
+ public static void main(String[] args) throws Exception {
+ EmailService emailService = new EmailService();
+ UserService userService = new UserService();
+ Product product = FileUtil.readRecommendProduct();
+ List subscribeUsers = userService.getSubscribeUsers(product);
+ emailService.sendEMails(false, subscribeUsers, product);
+
+ }
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
new file mode 100644
index 0000000000..0bd0841517
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp.service;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.constant.CommonConstant;
+import com.coderising.ood.srp.entity.Msg;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.util.PropertiesUtil;
+
+public class EmailService {
+
+ public boolean sendEMails(boolean debug, List mailingList, Product product) throws IOException
+ {
+
+ System.out.println("开始发送邮件");
+ Msg basemsg = PropertiesUtil.BASEMSG;
+ for (User user : mailingList) {
+ try
+ {
+ basemsg.setToAddress(user.getEmail());
+ basemsg.setSubject(CommonConstant.SUBJECT);
+ basemsg.setMessage(CommonConstant.getProductMessage(user, product));
+ if (basemsg.getToAddress().length() > 0)
+ MailUtil.sendEmail(debug,basemsg);
+ }
+ catch (Exception e)
+ {
+
+ try {
+ MailUtil.sendEmail(debug,basemsg);
+
+ } catch (Exception e2)
+ {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ return false;
+ }
+
+ }
+ return true;
+
+ }
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 0000000000..214442bdcd
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.dao.UserDao;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+
+public class UserService {
+
+ private UserDao userDao= new UserDao();
+
+ public List getSubscribeUsers(Product product){
+ return userDao.query("Select name from subscriptions where product_id= '" + product.getProductID() +"' and send_mail=1");
+ }
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..4f2908a2c6
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.srp.entity.Product;
+
+public class FileUtil {
+
+ public static final String FILE_URL="C:\\Users\\Administrator\\git\\coding2017\\students\\641013587\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+ public static Product readRecommendProduct() throws IOException{
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(FILE_URL));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+ Product product = new Product();
+ product.setProductID(data[0]);
+ product.setProductDesc(data[1]);
+ System.out.println("产品ID = " + product.getProductID() + "\n");
+ System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+ return product;
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..4387e6e73b
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.entity.Msg;
+
+public class MailUtil {
+
+ public static void sendEmail(
+ boolean debug,Msg msg) {
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(msg.getFromAddress()).append("\n");
+ buffer.append("To:").append(msg.getToAddress()).append("\n");
+ buffer.append("Subject:").append(msg.getSubject()).append("\n");
+ buffer.append("Content:").append(msg.getMessage()).append("\n");
+ System.out.println(buffer.toString());
+
+ }
+
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/PropertiesUtil.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/PropertiesUtil.java
new file mode 100644
index 0000000000..7033920b35
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/PropertiesUtil.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp.util;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import com.coderising.ood.srp.entity.Msg;
+
+public class PropertiesUtil {
+ public static final Properties pro;
+ public static final Msg BASEMSG = new Msg();
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+
+ static{
+ pro = new Properties();
+ FileInputStream in = null ;
+ try {
+ in= new FileInputStream("C:\\Users\\Administrator\\git\\coding2017\\students\\641013587\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\values.properties");
+ pro.load(in);
+ BASEMSG.setAltSmtpHost(pro.getProperty(ALT_SMTP_SERVER));
+ BASEMSG.setSmtpHost(SMTP_SERVER);
+ BASEMSG.setFromAddress(EMAIL_ADMIN);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }finally {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/values.properties b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/values.properties
new file mode 100644
index 0000000000..1f67810743
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/values.properties
@@ -0,0 +1,3 @@
+smtp.server = smtp.163.com
+alt.smtp.server = smtp1.163.com
+email.admin = admin@company.com
\ No newline at end of file
diff --git a/students/702282822/2_assignment/course/bad/Course.java b/students/702282822/2_assignment/course/bad/Course.java
new file mode 100644
index 0000000000..436d092f58
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+ private String id;
+ private String desc;
+ private int duration ;
+
+ List prerequisites;
+
+ public List getPrerequisites() {
+ return prerequisites;
+ }
+
+
+ public boolean equals(Object o){
+ if(o == null || !(o instanceof Course)){
+ return false;
+ }
+ Course c = (Course)o;
+ return (c != null) && c.id.equals(id);
+ }
+}
diff --git a/students/702282822/2_assignment/course/bad/CourseOffering.java b/students/702282822/2_assignment/course/bad/CourseOffering.java
new file mode 100644
index 0000000000..e24bcd2062
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/CourseOffering.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+ private Course course;
+ private String location;
+ private String teacher;
+ private int maxStudents;
+
+ List students = new ArrayList();
+
+ public void addStudent(Student st)
+ {
+ if(st.canAttend(course) && maxStudents > students.size())
+ {
+ students.add(st);
+ }
+ }
+
+
+}
diff --git a/students/702282822/2_assignment/course/bad/CourseService.java b/students/702282822/2_assignment/course/bad/CourseService.java
new file mode 100644
index 0000000000..3d06149ca2
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/CourseService.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+
+ public void chooseCourse(Student student, CourseOffering sc){
+ //如果学生上过该科目的先修科目,并且该课程还未满, 则学生可以加入该课程
+ sc.addStudent(student);
+ }
+
+}
diff --git a/students/702282822/2_assignment/course/bad/Student.java b/students/702282822/2_assignment/course/bad/Student.java
new file mode 100644
index 0000000000..6629b60bfb
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/Student.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+ private String id;
+ private String name;
+ private List coursesAlreadyTaken = new ArrayList();
+
+ public List getCoursesAlreadyTaken() {
+ return coursesAlreadyTaken;
+ }
+ public boolean canAttend(Course course){
+ return getCoursesAlreadyTaken().containsAll(
+ course.getPrerequisites());
+ }
+
+
+}
diff --git a/students/702282822/2_assignment/course/good/Course.java b/students/702282822/2_assignment/course/good/Course.java
new file mode 100644
index 0000000000..aefc9692bb
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+ private String id;
+ private String desc;
+ private int duration ;
+
+ List prerequisites;
+
+ public List getPrerequisites() {
+ return prerequisites;
+ }
+
+}
+
+
diff --git a/students/702282822/2_assignment/course/good/CourseOffering.java b/students/702282822/2_assignment/course/good/CourseOffering.java
new file mode 100644
index 0000000000..8660ec8109
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+ private Course course;
+ private String location;
+ private String teacher;
+ private int maxStudents;
+
+ List students = new ArrayList();
+
+ public List getStudents() {
+ return students;
+ }
+ public int getMaxStudents() {
+ return maxStudents;
+ }
+ public Course getCourse() {
+ return course;
+ }
+
+
+ // 第二步: 把主要逻辑移动到CourseOffering 中
+ public void addStudent(Student student){
+
+ if(student.canAttend(course)
+ && this.maxStudents > students.size()){
+ students.add(student);
+ }
+ }
+ // 第三步: 重构CourseService
+}
diff --git a/students/702282822/2_assignment/course/good/CourseService.java b/students/702282822/2_assignment/course/good/CourseService.java
new file mode 100644
index 0000000000..22ba4a5450
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+
+ public void chooseCourse(Student student, CourseOffering sc){
+ //第一步:重构: canAttend , 但是还有问题
+ if(student.canAttend(sc.getCourse())
+ && sc.getMaxStudents() > sc.getStudents().size()){
+ sc.getStudents().add(student);
+ }
+ }
+}
diff --git a/students/702282822/2_assignment/course/good/Student.java b/students/702282822/2_assignment/course/good/Student.java
new file mode 100644
index 0000000000..2c7e128b2a
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+ private String id;
+ private String name;
+ private List coursesAlreadyTaken = new ArrayList();
+
+ public List getCoursesAlreadyTaken() {
+ return coursesAlreadyTaken;
+ }
+
+ public boolean canAttend(Course course){
+ return this.coursesAlreadyTaken.containsAll(
+ course.getPrerequisites());
+ }
+}
+
+
diff --git a/students/702282822/2_assignment/ocp/DateUtil.java b/students/702282822/2_assignment/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/702282822/2_assignment/ocp/Deliver.java b/students/702282822/2_assignment/ocp/Deliver.java
new file mode 100644
index 0000000000..377fcf3a64
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Deliver.java
@@ -0,0 +1,5 @@
+
+public interface Dilever
+{
+ public void process(string str);
+}
diff --git a/students/702282822/2_assignment/ocp/DeliveryFactory.java b/students/702282822/2_assignment/ocp/DeliveryFactory.java
new file mode 100644
index 0000000000..daf562759e
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/DeliveryFactory.java
@@ -0,0 +1,20 @@
+
+public interface DeliveryFactory
+{
+ public static Deliver createDelivery(int type)
+ {
+ if(type == 1)
+ {
+ return new Email_Deliver();
+ }
+ else if(type == 2)
+ {
+ return new SMS_Deliver();
+ }
+ else if(type == 3)
+ {
+ return new Print_Deliver();
+ }
+ }
+
+}
diff --git a/students/702282822/2_assignment/ocp/Email_Deliver.java b/students/702282822/2_assignment/ocp/Email_Deliver.java
new file mode 100644
index 0000000000..c4eee88ded
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Email_Deliver.java
@@ -0,0 +1,9 @@
+
+public class Email_Deliver implements dileverMsg
+{
+ public void process(string str)
+ {
+ MailUtil.send(logMsg);
+ }
+
+}
diff --git a/students/702282822/2_assignment/ocp/Formatter.java b/students/702282822/2_assignment/ocp/Formatter.java
new file mode 100644
index 0000000000..35cf0bf4e3
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Formatter.java
@@ -0,0 +1,4 @@
+public interface Formatter
+{
+ public string format(string msg);
+}
diff --git a/students/702282822/2_assignment/ocp/FormatterFactory.java b/students/702282822/2_assignment/ocp/FormatterFactory.java
new file mode 100644
index 0000000000..1f9ef348fd
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/FormatterFactory.java
@@ -0,0 +1,14 @@
+
+public class FormatterFactory {
+ public static Formatter createFormate(int type)
+ {
+ if(type == 1)
+ {
+ return new Raw_log();
+ }
+ else if(type == 2)
+ {
+ return new Raw_log_withDate();
+ }
+ }
+}
diff --git a/students/702282822/2_assignment/ocp/Logger.java b/students/702282822/2_assignment/ocp/Logger.java
new file mode 100644
index 0000000000..839c8d74cd
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Logger.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+ private Formatter formatter;
+ private Dilever deliver;
+ public Logger(Formatter formatter, Dilever deliver)
+ {
+ this.formatter = formatter;
+ this.deliver = deliver;
+ }
+ public void log(String msg)
+ {
+ String message = formatter.formate(msg);
+ deliver.process(message);
+ }
+}
+
diff --git a/students/702282822/2_assignment/ocp/MailUtil.java b/students/702282822/2_assignment/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/702282822/2_assignment/ocp/Print_Deliver.java b/students/702282822/2_assignment/ocp/Print_Deliver.java
new file mode 100644
index 0000000000..10c31ba398
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Print_Deliver.java
@@ -0,0 +1,8 @@
+
+public class Print_Deliver
+{
+ public void process(string str)
+ {
+ System.out.print(str);
+ }
+}
diff --git a/students/702282822/2_assignment/ocp/Raw_log.java b/students/702282822/2_assignment/ocp/Raw_log.java
new file mode 100644
index 0000000000..5f6af6cf2c
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Raw_log.java
@@ -0,0 +1,8 @@
+
+public class Raw_log implements Formatter
+{
+ public string format(string msg)
+ {
+ return msg;
+ }
+}
diff --git a/students/702282822/2_assignment/ocp/Raw_log_withDate.java b/students/702282822/2_assignment/ocp/Raw_log_withDate.java
new file mode 100644
index 0000000000..3458923e3f
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Raw_log_withDate.java
@@ -0,0 +1,12 @@
+
+public class Raw_log_withDate implements Raw_log
+{
+ public string format(string msg)
+ {
+ string msg = super.format(msg);
+ String txtDate = DateUtil.getCurrentDateAsString();
+ return txtDate + ": " + msg;
+ }
+
+
+}
diff --git a/students/702282822/2_assignment/ocp/SMSUtil.java b/students/702282822/2_assignment/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/702282822/2_assignment/ocp/SMS_Deliver.java b/students/702282822/2_assignment/ocp/SMS_Deliver.java
new file mode 100644
index 0000000000..047cf55b28
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/SMS_Deliver.java
@@ -0,0 +1,10 @@
+
+public class SMS_Deliver implements dileverMsg
+{
+ public void process(string str)
+ {
+ SMSUtil.send(str);
+ }
+
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/DateUtil.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/DateUtil.java"
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/DateUtil.java"
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/EmailLogger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/EmailLogger.java"
new file mode 100644
index 0000000000..7a51f98c23
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/EmailLogger.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class EmailLogger extends Logger{
+
+ public void log(String msg){
+ MailUtil.send(msg);
+ }
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/LogOutput.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/LogOutput.java"
new file mode 100644
index 0000000000..caf9986293
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/LogOutput.java"
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+public abstract class LogOutput {
+
+
+ public abstract void logOutput(String msg,Logger logger);
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/Logger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/Logger.java"
new file mode 100644
index 0000000000..8913377e5a
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/Logger.java"
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp;
+
+public abstract class Logger {
+
+ public abstract void log(String msg);
+}
+
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/MailUtil.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/MailUtil.java"
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/MailUtil.java"
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/PrintLogger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/PrintLogger.java"
new file mode 100644
index 0000000000..6960fb9af3
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/PrintLogger.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class PrintLogger extends Logger{
+
+public void log(String msg){
+ System.out.println(msg);
+ }
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogOutput.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogOutput.java"
new file mode 100644
index 0000000000..9603d16687
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogOutput.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class RawLogOutput extends LogOutput{
+
+ public void logOutput(String msg,Logger logger) {
+ logger.log(msg);
+ }
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogWithDateOutput.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogWithDateOutput.java"
new file mode 100644
index 0000000000..5f414d992d
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogWithDateOutput.java"
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class RawLogWithDateOutput extends LogOutput{
+
+ @Override
+ public void logOutput(String msg,Logger logger) {
+ String txtDate = DateUtil.getCurrentDateAsString();
+ String logMsg = txtDate + ": " + msg;
+ logger.log(logMsg);
+ }
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SMSUtil.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SMSUtil.java"
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SMSUtil.java"
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SmsLogger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SmsLogger.java"
new file mode 100644
index 0000000000..8a22e52e78
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SmsLogger.java"
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class SmsLogger extends Logger{
+
+
+ public void log(String msg){
+
+ SMSUtil.send(msg);
+ }
+
+}
diff --git a/students/724222786/ood/ood-assignment/.gitignore b/students/724222786/ood/ood-assignment/.gitignore
new file mode 100644
index 0000000000..c948edfead
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/.gitignore
@@ -0,0 +1,4 @@
+.settings\
+target\
+.classpath
+.project
\ No newline at end of file
diff --git a/students/724222786/ood/ood-assignment/pom.xml b/students/724222786/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..a4d92e7f05
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/pom.xml
@@ -0,0 +1,38 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.8.2
+
+
+
+
+
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/Test.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/Test.java
new file mode 100644
index 0000000000..8dc90b701e
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/Test.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.answer;
+
+import java.util.List;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.coderising.ood.answer.entity.Product;
+import com.coderising.ood.answer.service.MailService;
+import com.coderising.ood.answer.utils.FileUtils;
+import com.coderising.ood.answer.utils.ProductUtils;
+
+public class Test {
+ private static final Logger log = LogManager.getLogger(Test.class);
+ public static void main(String[] args) {
+ MailService service = new MailService();
+ List list = ProductUtils.getList(FileUtils.readFile());
+ service.sendMail(list);
+
+ }
+
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/config.properties b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/config.properties
new file mode 100644
index 0000000000..b798e9274a
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/config.properties
@@ -0,0 +1,5 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
+
+product.txt=com/coderising/ood/answer/config/product_promotion.txt
\ No newline at end of file
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/product_promotion.txt b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/MailMessage.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/MailMessage.java
new file mode 100644
index 0000000000..cb95f6296c
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/MailMessage.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.answer.entity;
+
+import java.io.Serializable;
+
+import com.coderising.ood.answer.utils.ConfigUtils;
+
+/**
+ * 邮件类
+ * @author readke
+ *
+ */
+public class MailMessage implements Serializable{
+
+ private static final long serialVersionUID = -3221160075625357827L;
+
+ private String toAddr;
+ private String fromAddr;
+ private String subject;
+ private String content;
+
+ public static MailMessage getMessage(String from,String subject,String content,Product p,User u){
+ MailMessage m = new MailMessage();
+ if(content != null && !content.isEmpty())
+ content = "尊敬的 "+u.getName()+", 您关注的产品 " + p.getpDec() + " 降价了,欢迎购买!" ;
+ if(subject != null && !subject.isEmpty()){
+ subject = "您关注的产品降价了";
+ }
+ if(from != null && !from.isEmpty()){
+ from = ConfigUtils.getProperty("smtp.server");
+ }
+ m.setFromAddr(from);
+ m.setToAddr(u.getEmail());
+ m.setSubject(subject);
+ m.setContent(content);
+ return m;
+ }
+
+ public String getToAddr() {
+ return toAddr;
+ }
+ public void setToAddr(String toAddr) {
+ this.toAddr = toAddr;
+ }
+ public String getFromAddr() {
+ return fromAddr;
+ }
+ public void setFromAddr(String fromAddr) {
+ this.fromAddr = fromAddr;
+ }
+ public String getSubject() {
+ return subject;
+ }
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+ public String getContent() {
+ return content;
+ }
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/Product.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/Product.java
new file mode 100644
index 0000000000..2b4a81535e
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/Product.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.answer.entity;
+
+import java.io.Serializable;
+
+/**
+ * 产品类
+ * @author readke
+ *
+ */
+public class Product implements Serializable{
+ private static final long serialVersionUID = 409352331475497580L;
+
+ private String pId;
+ private String pDec;
+
+ public Product() {
+
+ }
+ public Product(String pId, String pDec) {
+ super();
+ this.pId = pId;
+ this.pDec = pDec;
+ }
+ public String getpId() {
+ return pId;
+ }
+ public void setpId(String pId) {
+ this.pId = pId;
+ }
+ public String getpDec() {
+ return pDec;
+ }
+ public void setpDec(String pDec) {
+ this.pDec = pDec;
+ }
+
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/User.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/User.java
new file mode 100644
index 0000000000..dd71a8e26f
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/User.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.answer.entity;
+
+import java.io.Serializable;
+
+/**
+ * 用户类
+ * @author readke
+ *
+ */
+public class User implements Serializable{
+ private static final long serialVersionUID = -7916484660512326120L;
+
+ private String id;
+ private String name;
+ private String email;
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getEmail() {
+ return email;
+ }
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/service/MailService.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/service/MailService.java
new file mode 100644
index 0000000000..cb63b8a2d1
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/service/MailService.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.answer.service;
+
+import java.util.List;
+
+import com.coderising.ood.answer.entity.MailMessage;
+import com.coderising.ood.answer.entity.Product;
+import com.coderising.ood.answer.entity.User;
+import com.coderising.ood.answer.utils.DBUtils;
+import com.coderising.ood.answer.utils.MailUtils;
+
+/**
+ * 邮件发送服务
+ * @author readke
+ *
+ */
+public class MailService {
+ public void sendMail(List list){
+
+ for(Product p: list){
+ List uList = DBUtils.queryByProductID(p.getpId());
+ for(User u : uList){
+ MailMessage m = MailMessage.getMessage("","", "", p, u);
+ MailUtils.sendMail(m);
+ }
+ }
+ }
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ConfigUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ConfigUtils.java
new file mode 100644
index 0000000000..3b67cbf5fb
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ConfigUtils.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.answer.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * 配置文件读取工具
+ * @author readke
+ *
+ */
+public class ConfigUtils {
+
+ private static final Logger log = LogManager.getLogger(ConfigUtils.class);
+ private static Properties prop = null;
+
+ static {
+ InputStream in = ConfigUtils.class.getResourceAsStream("../config/config.properties");
+ prop = new Properties();
+ //System.out.println(in);
+ try {
+ prop.load(in);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }finally {
+ if(in != null){
+ try {
+ in.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ public static String getProperty(String key){
+ return prop.getProperty(key);
+ }
+
+ public static void main(String[] args) {
+ log.info(ConfigUtils.getProperty("smtp.server"));
+ }
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/DBUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/DBUtils.java
new file mode 100644
index 0000000000..757098ef6c
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/DBUtils.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.answer.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.answer.entity.User;
+
+/**
+ * db工具
+ * @author readke
+ *
+ */
+public class DBUtils {
+
+ public static List queryByProductID(String productID){
+ /**
+ * sql = "Select name from subscriptions "
+ + "where product_id= '" + productID +"' "
+ + "and send_mail=1 ";
+ */
+ List userList = new ArrayList();
+
+ for (int i = 1; i <= 3; i++) {
+ User userInfo = new User();
+ userInfo.setName("User" + i);
+ userInfo.setEmail("aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/FileUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/FileUtils.java
new file mode 100644
index 0000000000..03dfcfe66d
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/FileUtils.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.answer.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * 文件读取工具
+ * @author readke
+ *
+ */
+public class FileUtils {
+ private static final Logger log = LogManager.getLogger(FileUtils.class);
+ public static File readFile(){
+
+ File file = null;
+ BufferedReader br = null;
+
+ try {
+ URL url = FileUtils.class.getClassLoader().getResource(ConfigUtils.getProperty("product.txt"));
+ log.info(url.getPath());
+ URI uri = url.toURI();
+ file = new File(uri);
+
+ }catch (Exception e) {
+ // TODO: handle exception
+ e.printStackTrace();
+ }
+ return file;
+ }
+
+ public static void main(String[] args) {
+ readFile();
+ }
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/MailUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/MailUtils.java
new file mode 100644
index 0000000000..6d08cd7968
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/MailUtils.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.answer.utils;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.coderising.ood.answer.entity.MailMessage;
+
+/**
+ * 邮件发送工具
+ * @author readke
+ *
+ */
+public class MailUtils {
+ private static final Logger log = LogManager.getLogger(MailUtils.class);
+
+ private static final String SMTP_SERVER = ConfigUtils.getProperty("smtp.server");
+ private static final String ALT_SMTP_SERVER = ConfigUtils.getProperty("alt.smtp.server");
+
+ public static void sendMail(MailMessage email){
+ try{
+ sendMail(email, SMTP_SERVER);
+ log.info("使用主服务器发送邮件");
+ log.info("发送成功");
+ }catch (Exception e) {
+ try{
+ sendMail(email, ALT_SMTP_SERVER);
+ log.info("使用备用服务器发送邮件");
+ }catch (Exception e1){
+ log.error("发送失败");
+ }
+ }
+ }
+
+ public static void sendMail(MailMessage email,String server) throws Exception{
+ sendMail(email.getFromAddr(), email.getToAddr(),
+ server, email.getSubject(), email.getContent());
+ }
+
+ public static void sendMail(String from,String to,String server,String subject,String content) throws Exception{
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(from).append("\n");
+ buffer.append("To:").append(to).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(content).append("\n");
+ System.out.println(buffer.toString());
+ }
+
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ProductUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ProductUtils.java
new file mode 100644
index 0000000000..1b854bfeb7
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ProductUtils.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.answer.utils;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.coderising.ood.answer.entity.Product;
+
+/**
+ * 产品工具
+ * @author readke
+ *
+ */
+public class ProductUtils {
+ private static final Logger log = LogManager.getLogger(ProductUtils.class);
+
+ public static List getList(File file){
+ List list = null;
+ BufferedReader br = null;
+
+ try {
+ list = new ArrayList<>();
+ br = new BufferedReader(new FileReader(file));
+ while(br.ready()){
+ Product p = new Product();
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+ p.setpId(data[0]);
+ p.setpDec(data[1]);
+ list.add(p);
+ }
+
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return list;
+ }
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+ public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
+ boolean debug) {
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+
+ }
+
+
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,199 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+ protected String sendMailQuery = null;
+
+
+ protected String smtpHost = null;
+ protected String altSmtpHost = null;
+ protected String fromAddress = null;
+ protected String toAddress = null;
+ protected String subject = null;
+ protected String message = null;
+
+ protected String productID = null;
+ protected String productDesc = null;
+
+ private static Configuration config;
+
+
+
+ private static final String NAME_KEY = "NAME";
+ private static final String EMAIL_KEY = "EMAIL";
+
+
+ public static void main(String[] args) throws Exception {
+
+ File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+ boolean emailDebug = false;
+
+ PromotionMail pe = new PromotionMail(f, emailDebug);
+
+ }
+
+
+ public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+ //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8
+ readFile(file);
+
+
+ config = new Configuration();
+
+ setSMTPHost();
+ setAltSMTPHost();
+
+
+ setFromAddress();
+
+
+ setLoadQuery();
+
+ sendEMails(mailDebug, loadMailingList());
+
+
+ }
+
+
+
+
+ protected void setProductID(String productID)
+ {
+ this.productID = productID;
+
+ }
+
+ protected String getproductID()
+ {
+ return productID;
+ }
+
+ protected void setLoadQuery() throws Exception {
+
+ sendMailQuery = "Select name from subscriptions "
+ + "where product_id= '" + productID +"' "
+ + "and send_mail=1 ";
+
+
+ System.out.println("loadQuery set");
+ }
+
+
+ protected void setSMTPHost()
+ {
+ smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ }
+
+
+ protected void setAltSMTPHost()
+ {
+ altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+ }
+
+
+ protected void setFromAddress()
+ {
+ fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+ protected void setMessage(HashMap userInfo) throws IOException
+ {
+
+ String name = (String) userInfo.get(NAME_KEY);
+
+ subject = "您关注的产品降价了";
+ message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ;
+
+
+
+ }
+
+
+ protected void readFile(File file) throws IOException // @02C
+ {
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(file));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+
+ setProductID(data[0]);
+ setProductDesc(data[1]);
+
+ System.out.println("产品ID = " + productID + "\n");
+ System.out.println("产品描述 = " + productDesc + "\n");
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+
+ private void setProductDesc(String desc) {
+ this.productDesc = desc;
+ }
+
+
+ protected void configureEMail(HashMap userInfo) throws IOException
+ {
+ toAddress = (String) userInfo.get(EMAIL_KEY);
+ if (toAddress.length() > 0)
+ setMessage(userInfo);
+ }
+
+ protected List loadMailingList() throws Exception {
+ return DBUtil.query(this.sendMailQuery);
+ }
+
+
+ protected void sendEMails(boolean debug, List mailingList) throws IOException
+ {
+
+ System.out.println("开始发送邮件");
+
+
+ if (mailingList != null) {
+ Iterator iter = mailingList.iterator();
+ while (iter.hasNext()) {
+ configureEMail((HashMap) iter.next());
+ try
+ {
+ if (toAddress.length() > 0)
+ MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+ }
+ catch (Exception e)
+ {
+
+ try {
+ MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+
+ } catch (Exception e2)
+ {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+
+
+ }
+
+ else {
+ System.out.println("没有邮件发送");
+
+ }
+
+ }
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/724222786/ood/ood-assignment/src/main/java/log4j2.xml b/students/724222786/ood/ood-assignment/src/main/java/log4j2.xml
new file mode 100644
index 0000000000..6fc38d8b1b
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/log4j2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/students/727171008/src/com/coderising/ood/ocp/Formatter.java b/students/727171008/src/com/coderising/ood/ocp/Formatter.java
new file mode 100644
index 0000000000..07391dacab
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/Formatter.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface Formatter {
+ String formate(String msg);
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/FormatterFactory.java b/students/727171008/src/com/coderising/ood/ocp/FormatterFactory.java
new file mode 100644
index 0000000000..4d6cc9603e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/FormatterFactory.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.ocp;
+
+public class FormatterFactory {
+ public Formatter createFormatter(int type) {
+ Formatter formatter = null;
+ if (type == 1) {
+ formatter = new RawFormatter();
+ }
+ if (type == 2) {
+ formatter = new HtmlFormatter();
+ }
+ return formatter;
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/HtmlFormatter.java b/students/727171008/src/com/coderising/ood/ocp/HtmlFormatter.java
new file mode 100644
index 0000000000..6d3d76f58e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/HtmlFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class HtmlFormatter implements Formatter {
+
+ @Override
+ public String formate(String msg) {
+
+ return null;
+ }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/LogTestDrive.java b/students/727171008/src/com/coderising/ood/ocp/LogTestDrive.java
new file mode 100644
index 0000000000..d96987e6d4
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/LogTestDrive.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+public class LogTestDrive {
+
+ public static void main(String[] args) {
+ FormatterFactory ff = new FormatterFactory();
+ SenderFactory sf = new SenderFactory();
+
+ Formatter formatter = ff.createFormatter(1);
+ Sender sender = sf.createSender(1);
+
+ Logger logger = new Logger(formatter, sender);
+ String msg = "此处应该从文本读取?或者html读取?";
+ logger.log(msg);
+
+ System.out.println("end");
+
+ }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/Logger.java b/students/727171008/src/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..a02cf8658c
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+ private Formatter formatter;
+ private Sender sender;
+
+ public Logger(Formatter formatter, Sender sender) {
+ this.formatter = formatter;
+ this.sender = sender;
+ }
+
+ public void log(String msg) {
+ sender.send(formatter.formate(msg));
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/MailSenderImp.java b/students/727171008/src/com/coderising/ood/ocp/MailSenderImp.java
new file mode 100644
index 0000000000..ab79fe070b
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/MailSenderImp.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class MailSenderImp implements Sender {
+
+ @Override
+ public String send(String msg) {
+
+ return "Raw data ";
+
+ }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/PrintSenderImp.java b/students/727171008/src/com/coderising/ood/ocp/PrintSenderImp.java
new file mode 100644
index 0000000000..22a4c8db2b
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/PrintSenderImp.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class PrintSenderImp implements Sender {
+
+ @Override
+ public String send(String msg) {
+
+ return "print ";
+ }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/RawFormatter.java b/students/727171008/src/com/coderising/ood/ocp/RawFormatter.java
new file mode 100644
index 0000000000..762917e981
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/RawFormatter.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class RawFormatter implements Formatter {
+
+ @Override
+ public String formate(String msg) {
+ return null;
+ }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/SMSSenderImp.java b/students/727171008/src/com/coderising/ood/ocp/SMSSenderImp.java
new file mode 100644
index 0000000000..6aaa16f23e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/SMSSenderImp.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class SMSSenderImp implements Sender {
+
+ @Override
+ public String send(String msg) {
+
+ return "SMS data ";
+ }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/Sender.java b/students/727171008/src/com/coderising/ood/ocp/Sender.java
new file mode 100644
index 0000000000..4c54985454
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/Sender.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface Sender {
+ String send(String msg);
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java b/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java
new file mode 100644
index 0000000000..96663989cf
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.ocp;
+
+public class SenderFactory {
+ public Sender createSender(int type) {
+ Sender sender = null;
+ if(type == 1) {
+ sender = new MailSenderImp();
+ }
+ if (type == 2) {
+ sender = new SMSSenderImp();
+ }
+ if (type == 3) {
+ sender = new PrintSenderImp();
+ }
+ return sender;
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/Configuration.java b/students/727171008/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..5a52efee25
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static {
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ *
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/727171008/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..945db9004a
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.good1;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/Mail.java b/students/727171008/src/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..8ecea4a35e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class Mail {
+ private User user;
+
+ public Mail(User user) {
+ this.user = user;
+ }
+
+ public String getAddress() {
+ return user.getEMailAddress();
+ }
+
+ public String getSubjcet() {
+ return "您关注的商品降价了!";
+ }
+
+ public String getBody() {
+ return "尊敬的用户: " + user.getName() + ", 您关注的商品: " + this.buildProductDescList();
+ }
+
+ private String buildProductDescList() {
+ List products = user.getSubscribedProducts();
+
+ return null;
+ }
+
+ public String getSubject() {
+
+ return null;
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/MailSender.java b/students/727171008/src/com/coderising/ood/srp/MailSender.java
new file mode 100644
index 0000000000..48c29ac877
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/MailSender.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp;
+
+public class MailSender {
+
+ private String fromAddress;
+ private String smtpHost;
+ private String altSmtpHost;
+
+ public MailSender(Configuration config) {
+ this.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ this.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ this.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ }
+
+ public void sendMail(Mail mail) {
+ try {
+ sendEmail(mail, this.smtpHost);
+ } catch (Exception e) {
+ try {
+ sendEmail(mail, this.altSmtpHost);
+ } catch (Exception ex) {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + ex.getMessage());
+ }
+
+ }
+ }
+
+ private void sendEmail(Mail mail, String smtpHost) {
+
+ String toAddress = mail.getAddress();
+ String subject = mail.getSubject();
+ String msg = mail.getBody();
+ // 发送邮件
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/Product.java b/students/727171008/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..d04cdb97f4
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+public class Product {
+ private String id;
+ private String desc;
+
+ public String getDesc() {
+ return desc;
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/ProductService.java b/students/727171008/src/com/coderising/ood/srp/ProductService.java
new file mode 100644
index 0000000000..5eea405243
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/ProductService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class ProductService {
+ public Product getPromotionProduct() {
+ File f = new File("F:\\coding2017\\com\\codering\\ood\\src\\product_promotion.txt");
+ Product product = readFile(f);
+ return product;
+ }
+
+ private Product readFile(File file) {
+
+ return null;
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/PromotionJob.java b/students/727171008/src/com/coderising/ood/srp/PromotionJob.java
new file mode 100644
index 0000000000..616335aa05
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/PromotionJob.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class PromotionJob {
+
+ private ProductService productService = null; // 获取production service
+ private UserService userService = null;// 获取UserService
+
+ public void run() {
+
+ Configuration cfg = new Configuration();
+
+ Product p = productService.getPromotionProduct();
+
+ List users = userService.getUsers(p); //一次只读取了一件商品
+
+ MailSender mailSender = new MailSender(cfg);
+
+ for (User user : users) {
+ mailSender.sendMail(new Mail(user));
+ }
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/User.java b/students/727171008/src/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..a79bc5c97a
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/User.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class User {
+
+ private String name;
+ private String emailAddress;
+
+ private List subscribedProducts;
+
+ public String getName() {
+
+ return name;
+ }
+
+ public String getEMailAddress() {
+
+ return emailAddress;
+ }
+
+ public List getSubscribedProducts() {
+
+ return this.subscribedProducts;
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/UserService.java b/students/727171008/src/com/coderising/ood/srp/UserService.java
new file mode 100644
index 0000000000..9bc682a229
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/UserService.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class UserService {
+
+ public List getUsers(Product product) {
+ // 调用DAO相关的类从数据库中读取订阅产品的用户列表
+ return null;
+ }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/product_promotion.txt b/students/727171008/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/DateUtil.java b/students/769232552/season_two/src/main/java/work02/ocp/DateUtil.java
new file mode 100644
index 0000000000..ab721d91aa
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package work02.ocp;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/Formatter.java b/students/769232552/season_two/src/main/java/work02/ocp/Formatter.java
new file mode 100644
index 0000000000..ce705806b5
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/Formatter.java
@@ -0,0 +1,7 @@
+package work02.ocp;
+
+public interface Formatter {
+
+ String formatMsg(String msg);
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/Logger.java b/students/769232552/season_two/src/main/java/work02/ocp/Logger.java
new file mode 100644
index 0000000000..0f0ecd7ae0
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/Logger.java
@@ -0,0 +1,29 @@
+package work02.ocp;
+
+public class Logger {
+
+ public final int RAW_LOG = 1;
+ public final int RAW_LOG_WITH_DATE = 2;
+ public final int EMAIL_LOG = 1;
+ public final int SMS_LOG = 2;
+ public final int PRINT_LOG = 3;
+
+ int type = 0;
+ int method = 0;
+
+ public Logger(int logType, int logMethod){
+ this.type = logType;
+ this.method = logMethod;
+ }
+
+ Sender sender;
+ Formatter formatter;
+
+ public void log(String msg){
+
+ String logMsg = formatter.formatMsg(msg);
+ sender.send(logMsg);
+
+ }
+}
+
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/MailSender.java b/students/769232552/season_two/src/main/java/work02/ocp/MailSender.java
new file mode 100644
index 0000000000..1d13f449eb
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/MailSender.java
@@ -0,0 +1,7 @@
+package work02.ocp;
+
+public class MailSender implements Sender {
+ public void send(String msg) {
+ MailUtil.send(msg);
+ }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/MailUtil.java b/students/769232552/season_two/src/main/java/work02/ocp/MailUtil.java
new file mode 100644
index 0000000000..62e26c25be
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package work02.ocp;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/PrinterSender.java b/students/769232552/season_two/src/main/java/work02/ocp/PrinterSender.java
new file mode 100644
index 0000000000..7511b9652f
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/PrinterSender.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+
+public class PrinterSender implements Sender {
+ public void send(String msg) {
+ System.out.println(msg);
+ }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/RawDateFormatter.java b/students/769232552/season_two/src/main/java/work02/ocp/RawDateFormatter.java
new file mode 100644
index 0000000000..16db075e51
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/RawDateFormatter.java
@@ -0,0 +1,9 @@
+package work02.ocp;
+
+public class RawDateFormatter implements Formatter {
+
+ public String formatMsg(String msg) {
+ String txtDate = DateUtil.getCurrentDateAsString();
+ return txtDate + ": " + msg;
+ }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/RawFormatter.java b/students/769232552/season_two/src/main/java/work02/ocp/RawFormatter.java
new file mode 100644
index 0000000000..9ff801b9de
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/RawFormatter.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+public class RawFormatter implements Formatter {
+
+ public String formatMsg(String msg) {
+ return msg;
+ }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/SMSSender.java b/students/769232552/season_two/src/main/java/work02/ocp/SMSSender.java
new file mode 100644
index 0000000000..9fa42a752f
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/SMSSender.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+
+public class SMSSender implements Sender{
+ public void send(String msg) {
+ SMSUtil.send(msg);
+ }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/SMSUtil.java b/students/769232552/season_two/src/main/java/work02/ocp/SMSUtil.java
new file mode 100644
index 0000000000..435e07300a
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package work02.ocp;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/Sender.java b/students/769232552/season_two/src/main/java/work02/ocp/Sender.java
new file mode 100644
index 0000000000..746ffdffb5
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/Sender.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+
+public interface Sender {
+
+ void send(String msg);
+
+}
\ No newline at end of file
diff --git a/students/812350401/pom.xml b/students/812350401/pom.xml
new file mode 100644
index 0000000000..8f2f890209
--- /dev/null
+++ b/students/812350401/pom.xml
@@ -0,0 +1,50 @@
+
+ 4.0.0
+
+ com.coderising
+ ood-assignment
+ 0.0.1-SNAPSHOT
+ jar
+
+ ood-assignment
+ http://maven.apache.org
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+ com.google.collections
+ google-collections
+ 1.0
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/CASSequence.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/CASSequence.java
new file mode 100644
index 0000000000..144aa264ff
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/CASSequence.java
@@ -0,0 +1,18 @@
+package com.coderising.myknowledgepoint.cas;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CASSequence{
+
+ private AtomicInteger count = new AtomicInteger(0);
+
+ public int next(){
+ while(true){
+ int current = count.get();
+ int next = current +1;
+ if(count.compareAndSet(current, next)){
+ return next;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/NoBlockingStack.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/NoBlockingStack.java
new file mode 100644
index 0000000000..c03c096c78
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/NoBlockingStack.java
@@ -0,0 +1,34 @@
+package com.coderising.myknowledgepoint.cas;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+public class NoBlockingStack {
+ static class Node {
+ final E item;
+ Node next;
+ public Node(E item) { this.item = item; }
+ }
+
+ AtomicReference> head = new AtomicReference>();
+
+ public void push(E item) {
+ Node newHead = new Node(item);
+ Node oldHead;
+ do {
+ oldHead = head.get();
+ newHead.next = oldHead;
+ } while (!head.compareAndSet(oldHead, newHead));
+ }
+ public E pop() {
+ Node oldHead;
+ Node newHead;
+ do {
+ oldHead = head.get();
+ if (oldHead == null)
+ return null;
+ newHead = oldHead.next;
+ } while (!head.compareAndSet(oldHead,newHead));
+ return oldHead.item;
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/Sequence.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/Sequence.java
new file mode 100644
index 0000000000..25909d0dd9
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/Sequence.java
@@ -0,0 +1,11 @@
+package com.coderising.myknowledgepoint.cas;
+
+public class Sequence{
+
+ private int value;
+
+ public int next(){
+ return value ++;
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java
new file mode 100644
index 0000000000..a9b18ddaf4
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java
@@ -0,0 +1,21 @@
+package com.coderising.myknowledgepoint.threadlocal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Context {
+
+ private static final ThreadLocal txThreadLocal
+ = new ThreadLocal();
+
+ public static void setTransactionID(String txID) {
+ txThreadLocal.set(txID);
+
+ }
+
+ public static String getTransactionId() {
+ return txThreadLocal.get();
+ }
+
+}
+
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java
new file mode 100644
index 0000000000..2cf9170578
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java
@@ -0,0 +1,22 @@
+package com.coderising.myknowledgepoint.threadlocal;
+
+public class TransactionManager {
+ private static final ThreadLocal context = new ThreadLocal();
+
+ public static void startTransaction() {
+ // logic to start a transaction
+ // ...
+ String txID = null;
+ context.set(txID);
+ }
+
+ public static String getTransactionId() {
+ return context.get();
+ }
+
+ public static void endTransaction() {
+ // logic to end a transaction
+ // …
+ context.remove();
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/BlockingQueue.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/BlockingQueue.java
new file mode 100644
index 0000000000..d6e9ec5104
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/BlockingQueue.java
@@ -0,0 +1,36 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class BlockingQueue {
+
+ private List queue = new LinkedList();
+ private int limit = 10;
+
+ public BlockingQueue(int limit) {
+ this.limit = limit;
+ }
+
+ public synchronized void enqueue(Object item) throws InterruptedException {
+ while (this.queue.size() == this.limit) {
+ wait();
+ }
+ if (this.queue.size() == 0) {
+ notifyAll();
+ }
+ this.queue.add(item);
+ }
+
+ public synchronized Object dequeue() throws InterruptedException {
+ while (this.queue.size() == 0) {
+ wait();
+ }
+ if (this.queue.size() == this.limit) {
+ notifyAll();
+ }
+
+ return this.queue.remove(0);
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/DriveThreadPool.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/DriveThreadPool.java
new file mode 100644
index 0000000000..015317af41
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/DriveThreadPool.java
@@ -0,0 +1,25 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+/**
+ * Created by thomas_young on 26/6/2017.
+ */
+public class DriveThreadPool {
+
+ public static void main(String[] args) throws Exception {
+ Task task = ()-> {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ System.out.println("I'm killed!");
+ }
+ System.out.println("haha");
+ };
+
+ ThreadPool pool = new ThreadPool(5, 2);
+ for (int i=1; i<10; i++) {
+ pool.execute(task);
+ }
+ pool.stop();
+
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
new file mode 100644
index 0000000000..418d672f78
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
@@ -0,0 +1,5 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+public interface Task {
+ void execute();
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
new file mode 100644
index 0000000000..96472822e2
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
@@ -0,0 +1,48 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class ThreadPool {
+
+ private BlockingQueue taskQueue = null;
+ private List threads = new ArrayList<>();
+ private boolean isStopped = false;
+
+ /**
+ * 线程池实例化的时候,线程就都启动了
+ * @param numOfThreads
+ * @param maxNumOfTasks
+ */
+ public ThreadPool(int numOfThreads, int maxNumOfTasks){
+ taskQueue = new BlockingQueue(maxNumOfTasks);
+
+ for(int i=0; i configurations = new HashMap<>();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/ConfigurationKeys.java b/students/812350401/src/main/java/com/coderising/myood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..0ec546beee
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.myood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/DBUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/DBUtil.java
new file mode 100644
index 0000000000..bf0db8a811
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.myood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com" + i);
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/EmailParam.java b/students/812350401/src/main/java/com/coderising/myood/srp/EmailParam.java
new file mode 100644
index 0000000000..71b5d30b40
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/EmailParam.java
@@ -0,0 +1,49 @@
+package com.coderising.myood.srp;
+
+
+/**
+ * Created by thomas_young on 20/6/2017.
+ */
+public class EmailParam {
+ private String smtpHost = null;
+ private String altSmtpHost = null;
+ private static Configuration config = new Configuration();
+ private String fromAddress = null;
+
+ protected void setFromAddress()
+ {
+ fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+ private void loadEmailConfig() {
+ setFromAddress();
+ setSMTPHost();
+ setAltSMTPHost();
+ }
+
+ public EmailParam() {
+ loadEmailConfig();
+ }
+
+ public String getSmtpHost() {
+ return smtpHost;
+ }
+
+ private void setSMTPHost()
+ {
+ smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ }
+
+ public String getAltSmtpHost() {
+ return altSmtpHost;
+ }
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ private void setAltSMTPHost()
+ {
+ altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/MailService.java b/students/812350401/src/main/java/com/coderising/myood/srp/MailService.java
new file mode 100644
index 0000000000..ec5809ba74
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/MailService.java
@@ -0,0 +1,116 @@
+package com.coderising.myood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Created by thomas_young on 20/6/2017.
+ */
+public class MailService {
+ private static final String NAME_KEY = "NAME";
+ private static final String EMAIL_KEY = "EMAIL";
+ private static String fromAddress;
+ private static EmailParam emailParam;
+
+ static {
+ emailParam = new EmailParam();
+ fromAddress = emailParam.getFromAddress();
+ }
+
+ public void sendMails(boolean debug) throws Exception {
+ ProductInfo productInfo = new ProductInfo();
+ UserDao userDao = new UserDao();
+ List userInfos = userDao.loadMailingList(productInfo.getProductID());
+ List mailInfos = convertToMails(userInfos, productInfo);
+ System.out.println("开始发送邮件");
+ for (MailInfo mail: mailInfos) {
+ sendOneMail(mail, debug);
+ }
+
+ }
+
+ private void sendOneMail(MailInfo mail, boolean debug) {
+ try {
+ MailUtil.sendEmail(
+ mail.getToAddress(),
+ fromAddress,
+ mail.getSubject(),
+ mail.getMessage(),
+ emailParam.getSmtpHost(), debug);
+ } catch (Exception e) {
+
+ try {
+ MailUtil.sendEmail(mail.getToAddress(),
+ fromAddress,
+ mail.getSubject(),
+ mail.getMessage(),
+ emailParam.getAltSmtpHost(),
+ debug);
+ } catch (Exception e2)
+ {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+
+ public static class MailInfo {
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ public String getToAddress() {
+ return toAddress;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ private String fromAddress = null;
+ private String toAddress = null;
+ private String subject = null;
+ private String message = null;
+
+
+ public MailInfo(String fromAddress, String toAddress, String subject, String message) {
+ this.fromAddress = fromAddress;
+ this.toAddress = toAddress;
+ this.subject = subject;
+ this.message = message;
+ }
+ }
+
+ private List convertToMails(List userInfos, ProductInfo productInfo) throws IOException {
+ List mailInfos = new LinkedList<>();
+ if (userInfos != null) {
+ Iterator iter = userInfos.iterator();
+ while (iter.hasNext()) {
+ MailInfo mailInfo = configureEMail((HashMap) iter.next(), productInfo);
+ if (mailInfo != null) {
+ mailInfos.add(mailInfo);
+ }
+ }
+ }
+ return mailInfos;
+ }
+
+ private MailInfo configureEMail(HashMap userInfo, ProductInfo productInfo) throws IOException
+ {
+ String toAddress = (String) userInfo.get(EMAIL_KEY);
+ if (toAddress.length() > 0) {
+ String name = (String) userInfo.get(NAME_KEY);
+ String subject = "您关注的产品降价了";
+ String message = "尊敬的 "+name+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了,欢迎购买!" ;
+ return new MailInfo(fromAddress, toAddress, subject, message);
+ }
+ return null;
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/MailUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/MailUtil.java
new file mode 100644
index 0000000000..25a0f64583
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.myood.srp;
+
+
+public class MailUtil {
+
+ public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
+ boolean debug) {
+ //假装发了一封邮件
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer.toString());
+ }
+
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/ProductInfo.java b/students/812350401/src/main/java/com/coderising/myood/srp/ProductInfo.java
new file mode 100644
index 0000000000..1cca0338ec
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/ProductInfo.java
@@ -0,0 +1,65 @@
+package com.coderising.myood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by thomas_young on 20/6/2017.
+ */
+public class ProductInfo {
+ private String productID = null;
+ private String productDesc = null;
+
+ private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt");
+
+ public ProductInfo() {
+ try {
+ readFileSetProperty();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8
+ * @throws IOException
+ */
+ private void readFileSetProperty() throws IOException
+ {
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(f));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+
+ setProductID(data[0]);
+ setProductDesc(data[1]);
+
+ System.out.println("产品ID = " + productID + "\n");
+ System.out.println("产品描述 = " + productDesc + "\n");
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+
+ public String getProductID() {
+ return productID;
+ }
+
+ public void setProductID(String productID) {
+ this.productID = productID;
+ }
+
+ public String getProductDesc() {
+ return productDesc;
+ }
+
+ public void setProductDesc(String productDesc) {
+ this.productDesc = productDesc;
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/PromotionMail.java b/students/812350401/src/main/java/com/coderising/myood/srp/PromotionMail.java
new file mode 100644
index 0000000000..b6ecd6fc41
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/PromotionMail.java
@@ -0,0 +1,8 @@
+package com.coderising.myood.srp;
+
+public class PromotionMail {
+ public static void main(String[] args) throws Exception {
+ MailService mailService = new MailService();
+ mailService.sendMails(true);
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/UserDao.java b/students/812350401/src/main/java/com/coderising/myood/srp/UserDao.java
new file mode 100644
index 0000000000..d5f421a952
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/UserDao.java
@@ -0,0 +1,26 @@
+package com.coderising.myood.srp;
+
+import java.util.List;
+
+/**
+ * Created by thomas_young on 21/6/2017.
+ */
+public class UserDao {
+ private String sendMailQuery = null;
+
+ private void setLoadQuery(String productID) throws Exception {
+
+ sendMailQuery = "Select name from subscriptions "
+ + "where product_id= '" + productID +"' "
+ + "and send_mail=1 ";
+
+
+ System.out.println("loadQuery set");
+ }
+
+ public List loadMailingList(String productID) throws Exception {
+ setLoadQuery(productID);
+ return DBUtil.query(this.sendMailQuery);
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Configuration.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Configuration.java
new file mode 100644
index 0000000000..b187686fc0
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.myood.srp.goodSrp;
+
+import com.coderising.myood.srp.ConfigurationKeys;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(com.coderising.myood.srp.ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(com.coderising.myood.srp.ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ConfigurationKeys.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ConfigurationKeys.java
new file mode 100644
index 0000000000..c69fa86cbf
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.myood.srp.goodSrp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/DBUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/DBUtil.java
new file mode 100644
index 0000000000..4d8403d525
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.myood.srp.goodSrp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com" + i);
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Mail.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Mail.java
new file mode 100644
index 0000000000..04472df8bc
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Mail.java
@@ -0,0 +1,32 @@
+package com.coderising.myood.srp.goodSrp;
+
+import com.coderising.myood.srp.goodSrp.template.MailBodyTemplate;
+import com.coderising.myood.srp.goodSrp.template.TextMailBodyTemplate;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Mail {
+
+ private User user;
+ MailBodyTemplate mailBodyTemplate;
+ public Mail(User u){
+ this.user = u;
+ }
+ public String getAddress(){
+ return user.getEMailAddress();
+ }
+ public String getSubject(){
+ return "您关注的产品降价了";
+ }
+ public String getBody(){
+ mailBodyTemplate = new TextMailBodyTemplate(user.getName(), buildProductDescList(), getAddress());
+ return mailBodyTemplate.render();
+ }
+ private String buildProductDescList() {
+ List products = user.getSubscribedProducts();
+ //.... 实现略...
+ return products.stream().map(Object::toString)
+ .collect(Collectors.joining(", "));
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailSender.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailSender.java
new file mode 100644
index 0000000000..70d2595e47
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailSender.java
@@ -0,0 +1,35 @@
+package com.coderising.myood.srp.goodSrp;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class MailSender {
+ private String fromAddress ;
+ private String smtpHost;
+ private String altSmtpHost;
+
+ public MailSender(Configuration config){
+ this.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ this.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ this.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ }
+
+ public void sendMail(Mail mail){
+ try{
+ sendEmail(mail, this.smtpHost);
+ }catch(Exception e){
+ try{
+ sendEmail(mail, this.altSmtpHost);
+ }catch (Exception ex){
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + ex.getMessage());
+ }
+
+ }
+ }
+
+ private void sendEmail(Mail mail, String smtpHost){
+ //发送邮件
+ System.out.println("开始发送邮件");
+ MailUtil.sendEmail(mail, smtpHost, fromAddress);
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailUtil.java
new file mode 100644
index 0000000000..77a26d8318
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailUtil.java
@@ -0,0 +1,16 @@
+package com.coderising.myood.srp.goodSrp;
+
+public class MailUtil {
+
+ public static void sendEmail(Mail mail, String smtpHost, String fromAddress) {
+ //假装发了一封邮件
+ System.out.println("使用smtpHost为"+smtpHost);
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(mail.getAddress()).append("\n");
+ buffer.append("Subject:").append(mail.getSubject()).append("\n");
+ buffer.append("Content:").append(mail.getBody()).append("\n");
+
+ System.out.println(buffer.toString());
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Product.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Product.java
new file mode 100644
index 0000000000..9373690bd7
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Product.java
@@ -0,0 +1,34 @@
+package com.coderising.myood.srp.goodSrp;
+
+
+
+public class Product {
+
+ private String id;
+ private String desc;
+ public String getDescription(){
+ return desc;
+ }
+
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ @Override
+ public String toString() {
+ return desc;
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ProductService.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ProductService.java
new file mode 100644
index 0000000000..26853bc4d3
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ProductService.java
@@ -0,0 +1,38 @@
+package com.coderising.myood.srp.goodSrp;
+
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ProductService {
+ private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt");
+ public List getPromotionProducts() {
+ //从文本文件中读取文件列表
+ String line;
+ List products = new LinkedList<>();
+ try (BufferedReader br = new BufferedReader(new FileReader(f))) {
+ while ((line = br.readLine()) != null) {
+ Product p =parseGenProduct(line);
+ products.add(p);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return products;
+ }
+
+ private Product parseGenProduct(String line) {
+ String[] data = line.split(" ");
+ String productID = data[0];
+ String productDesc = data[1];
+ System.out.println("产品ID = " + productID);
+ System.out.println("产品描述 = " + productDesc + "\n");
+ Product p = new Product();
+ p.setDesc(productDesc);
+ p.setId(productID);
+ return p;
+ }
+
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/PromotionJob.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/PromotionJob.java
new file mode 100644
index 0000000000..5b3ce7a1de
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/PromotionJob.java
@@ -0,0 +1,29 @@
+package com.coderising.myood.srp.goodSrp;
+
+import java.util.List;
+
+public class PromotionJob {
+
+ private ProductService productService = new ProductService() ; //获取production service
+ private UserService userService = new UserService() ;// 获取UserService
+
+ public void run(){
+
+ Configuration cfg = new Configuration();
+
+ List ps = productService.getPromotionProducts();
+
+ List users = userService.getUsers(ps);
+
+
+ MailSender mailSender = new MailSender(cfg);
+
+ for(User user : users){
+ mailSender.sendMail(new Mail(user));
+ }
+ }
+
+ public static void main(String[] args) {
+ new PromotionJob().run();
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/User.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/User.java
new file mode 100644
index 0000000000..65383587d1
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/User.java
@@ -0,0 +1,39 @@
+package com.coderising.myood.srp.goodSrp;
+
+import java.util.List;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class User {
+ private String name;
+ private String emailAddress;
+
+ private List subscribedProducts;
+
+ public String getName(){
+ return name;
+ }
+ public String getEMailAddress() {
+ return emailAddress;
+ }
+ public List getSubscribedProducts(){
+ return this.subscribedProducts;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+
+ public void setEmailAddress(String emailAddress) {
+ this.emailAddress = emailAddress;
+ }
+
+ public void setSubscribedProducts(List subscribedProducts) {
+ this.subscribedProducts = subscribedProducts;
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/UserService.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/UserService.java
new file mode 100644
index 0000000000..152d253ae3
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/UserService.java
@@ -0,0 +1,26 @@
+package com.coderising.myood.srp.goodSrp;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class UserService {
+
+ public List getUsers(List ps) {
+ List users = new LinkedList<>();
+ String sql = "Select name from subscriptions where send_mail=1";
+ System.out.println("loadQuery set\n");
+ List userInfoList = DBUtil.query(sql);
+ for (Object userInfo: userInfoList) {
+ User user = new User();
+ user.setName(((Map)userInfo).get("NAME"));
+ user.setEmailAddress(((Map)userInfo).get("EMAIL"));
+ user.setSubscribedProducts(ps);
+ users.add(user);
+ }
+ return users;
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/MailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/MailBodyTemplate.java
new file mode 100644
index 0000000000..2ff179ac7c
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/MailBodyTemplate.java
@@ -0,0 +1,5 @@
+package com.coderising.myood.srp.goodSrp.template;
+
+public interface MailBodyTemplate {
+ String render();
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/TextMailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/TextMailBodyTemplate.java
new file mode 100644
index 0000000000..b43561a04d
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/TextMailBodyTemplate.java
@@ -0,0 +1,20 @@
+package com.coderising.myood.srp.goodSrp.template;
+
+
+public class TextMailBodyTemplate implements MailBodyTemplate {
+ String productDescription;
+ String name;
+ String toAdress;
+ public TextMailBodyTemplate(String name, String productDescription, String toAdress){
+ this.productDescription = productDescription;
+ this.name = name;
+ this.toAdress = toAdress;
+ }
+
+ @Override
+ public String render() {
+ //使用某种模板技术实现Render
+ return "尊敬的 "+ name +", 您关注的产品 " + productDescription + " 降价了,欢迎购买!" ;
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt b/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/812350401/src/main/java/com/coderising/myood/uml/Dice.java b/students/812350401/src/main/java/com/coderising/myood/uml/Dice.java
new file mode 100644
index 0000000000..a48f7114ee
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/Dice.java
@@ -0,0 +1,17 @@
+package com.coderising.myood.uml;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.Random;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class Dice {
+
+ private ImmutableList values = ImmutableList.of(1, 2, 3, 4, 5, 6);
+
+ public int roll() {
+ return values.get(new Random().nextInt(values.size()));
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/uml/DiceGame.java b/students/812350401/src/main/java/com/coderising/myood/uml/DiceGame.java
new file mode 100644
index 0000000000..386550fd67
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/DiceGame.java
@@ -0,0 +1,44 @@
+package com.coderising.myood.uml;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class DiceGame {
+ private Player player1, player2;
+ private Dice dice1, dice2;
+ private static int WIN_POINT = 7;
+
+ public void start() {
+ assert player1 != null;
+ assert player2 != null;
+ assert dice1 != null;
+ assert dice2 != null;
+ int player1Point;
+ int player2Point;
+ do {
+ player1Point = player1.roll(dice1, dice2);
+ player2Point = player2.roll(dice1, dice2);
+ System.out.print(player1 + " roll " + player1Point + ", ");
+ System.out.println(player2 + " roll " + player2Point + ".");
+ if (player1Point == player2Point) {
+ continue;
+ }
+ if (player1Point == WIN_POINT) {
+ System.out.println(player1 + " win!");
+ break;
+ }
+ if (player2Point == WIN_POINT) {
+ System.out.println(player2 + " win!");
+ break;
+ }
+ } while (true);
+ }
+
+ public DiceGame(Player aPlayer1, Player aPlayer2, Dice aDice1, Dice aDice2) {
+ player1 = aPlayer1;
+ player2 = aPlayer2;
+ dice1 = aDice1;
+ dice2 = aDice2;
+ }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/uml/GameTest.java b/students/812350401/src/main/java/com/coderising/myood/uml/GameTest.java
new file mode 100644
index 0000000000..ee36709326
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/GameTest.java
@@ -0,0 +1,15 @@
+package com.coderising.myood.uml;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class GameTest {
+ public static void main(String[] args) {
+ Player player1 = new Player("player1");
+ Player player2 = new Player("player2");
+ Dice dice1 = new Dice();
+ Dice dice2 = new Dice();
+ DiceGame game = new DiceGame(player1, player2, dice1, dice2);
+ game.start();
+ }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/uml/Player.java b/students/812350401/src/main/java/com/coderising/myood/uml/Player.java
new file mode 100644
index 0000000000..2add582970
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/Player.java
@@ -0,0 +1,23 @@
+package com.coderising.myood.uml;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class Player {
+ private String name;
+
+ public Player(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public int roll(Dice dice1, Dice dice2) {
+ int first = dice1.roll();
+ int second = dice2.roll();
+ return first + second;
+ }
+}
diff --git "a/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png"
new file mode 100644
index 0000000000..578894269d
Binary files /dev/null and "b/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png" differ
diff --git "a/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png"
new file mode 100644
index 0000000000..587726bd61
Binary files /dev/null and "b/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png" differ
diff --git "a/students/812350401/src/main/java/com/coderising/myood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/myood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png"
new file mode 100644
index 0000000000..46addc0408
Binary files /dev/null and "b/students/812350401/src/main/java/com/coderising/myood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png" differ
diff --git a/students/919442958/README.md b/students/919442958/README.md
new file mode 100644
index 0000000000..d96760c4ae
--- /dev/null
+++ b/students/919442958/README.md
@@ -0,0 +1 @@
+这是919442958的作业。1234 12
\ No newline at end of file
diff --git a/students/996108220/src/com/coderising/ood/ocp/DateUtil.java b/students/996108220/src/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..13369f5684
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/EmailLog.java b/students/996108220/src/com/coderising/ood/ocp/EmailLog.java
new file mode 100644
index 0000000000..20eb93ac9d
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/EmailLog.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class EmailLog implements LogMethod{
+ int method = 1;
+ @Override
+ public void logBehavior(String logMsg) {
+
+ MailUtil.send(logMsg);
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/LogMethod.java b/students/996108220/src/com/coderising/ood/ocp/LogMethod.java
new file mode 100644
index 0000000000..69677d8c89
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/LogMethod.java
@@ -0,0 +1,6 @@
+package com.coderising.ood.ocp;
+
+public interface LogMethod {
+ int method = 0;
+ public abstract void logBehavior(String logMsg);
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/LogType.java b/students/996108220/src/com/coderising/ood/ocp/LogType.java
new file mode 100644
index 0000000000..bd6de81087
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/LogType.java
@@ -0,0 +1,6 @@
+package com.coderising.ood.ocp;
+
+public interface LogType {
+ int type = 0;
+ public abstract String getLogMsg(String msg) ;
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/Logger.java b/students/996108220/src/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..e0105f9b23
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+ public LogType logType;
+ public LogMethod logMethod;
+
+ public Logger(LogType logType, LogMethod logMethod){
+ this.logType = logType;
+ this.logMethod = logMethod;
+ }
+ public void log(String msg){
+
+ String logMsg = logType.getLogMsg(msg);
+ logMethod.logBehavior(logMsg);
+
+ }
+}
+
diff --git a/students/996108220/src/com/coderising/ood/ocp/MailUtil.java b/students/996108220/src/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/PrintLog.java b/students/996108220/src/com/coderising/ood/ocp/PrintLog.java
new file mode 100644
index 0000000000..b2391ecd52
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/PrintLog.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class PrintLog implements LogMethod{
+ int method = 3;
+ @Override
+ public void logBehavior(String logMsg) {
+ System.out.println(logMsg);
+
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/RawLog.java b/students/996108220/src/com/coderising/ood/ocp/RawLog.java
new file mode 100644
index 0000000000..0ac45244c8
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/RawLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class RawLog implements LogType{
+ int type = 1;
+ @Override
+ public String getLogMsg(String msg) {
+ return msg;
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/RawLogWithData.java b/students/996108220/src/com/coderising/ood/ocp/RawLogWithData.java
new file mode 100644
index 0000000000..280fb3b54f
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/RawLogWithData.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class RawLogWithData implements LogType{
+ int type = 2;
+ @Override
+ public String getLogMsg(String msg) {
+ String txtDate = DateUtil.getCurrentDateAsString();
+ String logMsg = txtDate + ": " + msg;
+ return logMsg;
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/SMSUtil.java b/students/996108220/src/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/SmsLog.java b/students/996108220/src/com/coderising/ood/ocp/SmsLog.java
new file mode 100644
index 0000000000..e61938d844
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/SmsLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SmsLog implements LogMethod{
+ int method = 2;
+ @Override
+ public void logBehavior(String logMsg) {
+ SMSUtil.send(logMsg);
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/good/Formatter.java b/students/996108220/src/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/good/Formatter.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.good;
+
+public interface Formatter {
+
+ String format(String msg);
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/good/FormatterFactory.java b/students/996108220/src/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/good/FormatterFactory.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.good;
+
+public class FormatterFactory {
+ public static Formatter createFormatter(int type){
+ if(type == 1){
+ return new RawFormatter();
+ }
+ if (type == 2){
+ return new HtmlFormatter();
+ }
+ return null;
+ }
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/996108220/src/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/good/HtmlFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.good;
+
+public class HtmlFormatter implements Formatter {
+
+ @Override
+ public String format(String msg) {
+
+ return null;
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/good/Logger.java b/students/996108220/src/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/good/Logger.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.ocp.good;
+
+public class Logger {
+
+ private Formatter formatter;
+ private Sender sender;
+
+ public Logger(Formatter formatter,Sender sender){
+ this.formatter = formatter;
+ this.sender = sender;
+ }
+ public void log(String msg){
+ sender.send(formatter.format(msg)) ;
+ }
+
+
+}
+
diff --git a/students/996108220/src/com/coderising/ood/ocp/good/RawFormatter.java b/students/996108220/src/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/good/RawFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.good;
+
+public class RawFormatter implements Formatter {
+
+ @Override
+ public String format(String msg) {
+
+ return null;
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/good/Sender.java b/students/996108220/src/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/good/Sender.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.good;
+
+public interface Sender {
+
+ void send(String msg);
+
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/Configuration.java b/students/996108220/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+ static Map configurations = new HashMap<>();
+ static{
+ configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+ configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+ configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
+ }
+ /**
+ * 应该从配置文件读, 但是这里简化为直接从一个map 中去读
+ * @param key
+ * @return
+ */
+ public String getProperty(String key) {
+
+ return configurations.get(key);
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/996108220/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp;
+
+public class ConfigurationKeys {
+
+ public static final String SMTP_SERVER = "smtp.server";
+ public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+ public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/DBUtil.java b/students/996108220/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..683ce1712e
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+ static ProductUtil productUtil=new ProductUtil();
+ /**
+ * 应该从数据库读, 但是简化为直接生成。
+ * @param sql
+ * @return
+ */
+ public static List query(String sql){
+
+ List userList = new ArrayList();
+ for (int i = 1; i <= 3; i++) {
+ HashMap userInfo = new HashMap();
+ userInfo.put("NAME", "User" + i);
+ userInfo.put("EMAIL", "aa@bb.com");
+ userList.add(userInfo);
+ }
+
+ return userList;
+ }
+ protected static List loadMailingList() throws Exception {
+
+ String sendMailQuery = LoadQuery();
+ return DBUtil.query(sendMailQuery);
+ }
+ protected static String LoadQuery() throws Exception {
+ String productID = productUtil.getProductID();
+ System.out.println("loadQuery set");
+ return "Select name from subscriptions "
+ + "where product_id= '" + productID +"' "
+ + "and send_mail=1 ";
+
+ }
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/MailUtil.java b/students/996108220/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..38ad395d83
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,74 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class MailUtil {
+
+ private static Configuration config=new Configuration(); ;
+ private static ProductUtil productUtil = new ProductUtil();
+ private static final String NAME_KEY = "NAME";
+ private static final String EMAIL_KEY = "EMAIL";
+
+ protected static void sendEmail(String userName,String toAddress,String smtpHost,Boolean debug) throws IOException
+ {
+ String subject = "您关注的产品降价了";
+ String message = "尊敬的 "+userName+", 您关注的产品 " + productUtil.getProductDesc() + " 降价了,欢迎购买!" ;
+ String fromAddress=config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ StringBuilder buffer = new StringBuilder();
+ buffer.append("From:").append(fromAddress).append("\n");
+ buffer.append("To:").append(toAddress).append("\n");
+ buffer.append("Subject:").append(subject).append("\n");
+ buffer.append("Content:").append(message).append("\n");
+ System.out.println(buffer);
+ }
+
+
+
+ private static void sendEmail(String userName,String toAddress,Boolean debug) {
+ try
+ {
+ String smtpHost=config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ sendEmail( userName,toAddress,smtpHost, debug);
+ }
+ catch (Exception e)
+ {
+
+ try {
+ String altSmtpHost=config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ sendEmail( userName,toAddress,altSmtpHost, debug);
+
+ } catch (Exception e2)
+ {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+
+ protected static void sendEMails(boolean debug,List mailingList) throws IOException
+ {
+
+ System.out.println("开始发送邮件");
+
+
+ if (mailingList != null) {
+ Iterator iter = mailingList.iterator();
+ while (iter.hasNext()) {
+ HashMap userInfo = (HashMap)iter.next();
+ String userName = userInfo.get(NAME_KEY);
+ String toAddress = userInfo.get(EMAIL_KEY);
+ sendEmail( userName, toAddress, debug);
+ }
+ }
+
+ else {
+ System.out.println("没有邮件发送");
+ }
+
+ }
+
+
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/ProductUtil.java b/students/996108220/src/com/coderising/ood/srp/ProductUtil.java
new file mode 100644
index 0000000000..be40fd203c
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/ProductUtil.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductUtil {
+ private String productConfigPath="D:\\JavaCoding\\students\\996108220\\src"
+ + "\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+ private String[] readFile() throws IOException // @02C
+ {
+ File file=new File(productConfigPath);
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new FileReader(file));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");;
+ return data;
+
+ } catch (IOException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ br.close();
+ }
+ }
+
+ public String getProductID() throws IOException {
+ String[] data= readFile();
+ return data[0];
+ }
+
+ public String getProductDesc() throws IOException {
+ String[] data= readFile();
+ return data[1];
+ }
+
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/PromotionMail.java b/students/996108220/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..2795a54b2a
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,49 @@
+ package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class PromotionMail {
+
+ //读取用户信息
+
+ private static final String NAME_KEY = "NAME";
+ private static final String EMAIL_KEY = "EMAIL";
+
+
+ public static void main(String[] args) throws Exception {
+
+ boolean emailDebug = false;
+ PromotionMail pe = new PromotionMail();
+ List userInfo = DBUtil.loadMailingList();
+ List mailingList = pe.filterUserInfo(userInfo);
+ MailUtil.sendEMails(emailDebug, mailingList);
+ }
+
+
+
+
+ protected List filterUserInfo(List userList) throws IOException
+ {
+
+ if (userList != null) {
+ Iterator iter = userList.iterator();
+ while (iter.hasNext()) {
+ HashMap userInfo = (HashMap)iter.next();
+ String userName = userInfo.get(NAME_KEY);
+ String toAddress = userInfo.get(EMAIL_KEY);
+ if (toAddress.length() <= 0)
+ userInfo.remove(userInfo);
+ }
+ }
+ return userList;
+
+ }
+
+
+
+
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/product_promotion.txt b/students/996108220/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file