diff --git a/liuxin/knowledge-point/pom.xml b/liuxin/knowledge-point/pom.xml
new file mode 100644
index 0000000000..3dc438c7d9
--- /dev/null
+++ b/liuxin/knowledge-point/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.coderising
+ knowledge-point
+ 0.0.1-SNAPSHOT
+ jar
+
+ knowledge-point
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ aliyunmaven
+ http://maven.aliyun.com/nexus/content/groups/public/
+
+
+
diff --git a/liuxin/knowledge-point/src/main/java/cas/CASSequence.java b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java
new file mode 100644
index 0000000000..dcff77d9bf
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java
@@ -0,0 +1,18 @@
+package 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/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
new file mode 100644
index 0000000000..d7be44c69a
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
@@ -0,0 +1,34 @@
+package 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/liuxin/knowledge-point/src/main/java/cas/Sequence.java b/liuxin/knowledge-point/src/main/java/cas/Sequence.java
new file mode 100644
index 0000000000..688224e251
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/cas/Sequence.java
@@ -0,0 +1,11 @@
+package cas;
+
+public class Sequence{
+
+ private int value;
+
+ public int next(){
+ return value ++;
+ }
+
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadlocal/Context.java b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java
new file mode 100644
index 0000000000..d84584397b
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java
@@ -0,0 +1,20 @@
+package 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/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
new file mode 100644
index 0000000000..8a5283fcab
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
@@ -0,0 +1,22 @@
+package 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/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
new file mode 100644
index 0000000000..faca2d2c70
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
@@ -0,0 +1,35 @@
+package 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/liuxin/knowledge-point/src/main/java/threadpool/Task.java b/liuxin/knowledge-point/src/main/java/threadpool/Task.java
new file mode 100644
index 0000000000..07413d9798
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/Task.java
@@ -0,0 +1,5 @@
+package threadpool;
+
+public interface Task {
+ public void execute();
+}
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
new file mode 100644
index 0000000000..f508f76eb5
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
@@ -0,0 +1,37 @@
+package 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;
+
+ public ThreadPool(int numOfThreads, int maxNumOfTasks){
+ taskQueue = new BlockingQueue(maxNumOfTasks);
+
+ for(int i=0; iparamMap ;
+
+ public TextMailBodyTemplate(Map map){
+ paramMap = map;
+ }
+
+ @Override
+ public String render() {
+ //使用某种模板技术实现Render
+ return null;
+ }
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Configuration.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Configuration.java
new file mode 100644
index 0000000000..55f0fad677
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.good1;
+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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ConfigurationKeys.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ConfigurationKeys.java
new file mode 100644
index 0000000000..945db9004a
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Mail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Mail.java
new file mode 100644
index 0000000000..83099ed16a
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Mail.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.good1;
+
+import java.util.List;
+
+import com.coderising.ood.srp.good.template.MailBodyTemplate;
+
+public class Mail {
+
+ private User user;
+
+ public Mail(User u){
+ this.user = u;
+ }
+ public String getAddress(){
+ return user.getEMailAddress();
+ }
+ public String getSubject(){
+ return "您关注的产品降价了";
+ }
+ public String getBody(){
+
+ return "尊敬的 "+user.getName()+", 您关注的产品 " + this.buildProductDescList() + " 降价了,欢迎购买!" ;
+ }
+ private String buildProductDescList() {
+ List products = user.getSubscribedProducts();
+ //.... 实现略...
+ return null;
+ }
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
new file mode 100644
index 0000000000..0503d1a88b
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.good1;
+
+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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Product.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Product.java
new file mode 100644
index 0000000000..55617461cd
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Product.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp.good1;
+
+
+
+public class Product {
+
+ private String id;
+ private String desc;
+ public String getDescription(){
+ return desc;
+ }
+
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ProductService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ProductService.java
new file mode 100644
index 0000000000..4109bfa9dc
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ProductService.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.good1;
+
+
+public class ProductService {
+ public Product getPromotionProduct(){
+ //从文本文件中读取文件列表
+ return null;
+ }
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/PromotionJob.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/PromotionJob.java
new file mode 100644
index 0000000000..8e41069bd9
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/PromotionJob.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp.good1;
+
+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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/User.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/User.java
new file mode 100644
index 0000000000..114476bb64
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/User.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp.good1;
+
+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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/UserService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/UserService.java
new file mode 100644
index 0000000000..1e08138cff
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/UserService.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.good1;
+
+import java.util.List;
+
+public class UserService {
+
+ public List getUsers(Product product){
+ //调用DAO相关的类从数据库中读取订阅产品的用户列表
+ return null;
+ }
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/ProductService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/ProductService.java
new file mode 100644
index 0000000000..5ca5636291
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/ProductService.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.good2;
+
+import java.util.List;
+
+import com.coderising.ood.srp.good1.Product;
+
+public class ProductService {
+ public List getPromotionProducts(){
+ //从文本文件中读取文件列表
+ return null;
+ }
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/UserService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/UserService.java
new file mode 100644
index 0000000000..f86307e701
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/UserService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.good2;
+
+import java.util.List;
+
+import com.coderising.ood.srp.good1.Product;
+import com.coderising.ood.srp.good1.User;
+
+public class UserService {
+ public List getUsers(List products){
+ //调用DAO相关的类从数据库中读取订阅产品的用户列表
+ return null;
+ }
+}
diff --git a/students/251822722/ocp/logType/LogType.java b/students/251822722/ocp/logType/LogType.java
new file mode 100644
index 0000000000..a5e4774518
--- /dev/null
+++ b/students/251822722/ocp/logType/LogType.java
@@ -0,0 +1,12 @@
+package ocp.logType;
+
+/**
+ * ocp.ocp
+ * Created by Eric Wang on 6/21/17.
+ */
+public interface LogType {
+
+ void setMessage(String message);
+
+ String getMessage();
+}
diff --git a/students/251822722/ocp/logType/RawLog.java b/students/251822722/ocp/logType/RawLog.java
new file mode 100644
index 0000000000..cdbd4931fe
--- /dev/null
+++ b/students/251822722/ocp/logType/RawLog.java
@@ -0,0 +1,21 @@
+package ocp.logType;
+
+/**
+ * ocp.ocp.logType
+ * Created by Eric Wang on 6/21/17.
+ */
+public class RawLog implements LogType{
+
+ private String logMsg;
+
+ @Override
+ public void setMessage(String message) {
+ logMsg = message;
+
+ }
+
+ @Override
+ public String getMessage() {
+ return logMsg;
+ }
+}
diff --git a/students/251822722/ocp/logType/RawLogWithDate.java b/students/251822722/ocp/logType/RawLogWithDate.java
new file mode 100644
index 0000000000..03044c7229
--- /dev/null
+++ b/students/251822722/ocp/logType/RawLogWithDate.java
@@ -0,0 +1,26 @@
+package ocp.logType;
+
+import ocp.util.DateUtil;
+
+/**
+ * ocp.ocp.logType
+ * Created by Eric Wang on 6/21/17.
+ */
+public class RawLogWithDate implements LogType {
+
+
+ private String logMsg;
+
+ @Override
+ public void setMessage(String message) {
+
+ String txtDate = DateUtil.getCurrentDateAsString();
+ logMsg = txtDate + ": " + message;
+
+ }
+
+ @Override
+ public String getMessage() {
+ return logMsg;
+ }
+}
diff --git a/students/251822722/ocp/logger/DateLogger.java b/students/251822722/ocp/logger/DateLogger.java
new file mode 100644
index 0000000000..ddffbc0d91
--- /dev/null
+++ b/students/251822722/ocp/logger/DateLogger.java
@@ -0,0 +1,23 @@
+package ocp.logger;
+
+import ocp.logType.LogType;
+
+/**
+ * ocp.ocp.logger
+ * Created by Eric Wang on 6/21/17.
+ */
+public class DateLogger extends Logger {
+
+ LogType logType;
+
+ public DateLogger(LogType logType) {
+ this.logType = logType;
+ }
+
+
+ public void log(String msg) {
+
+ this.logType.setMessage(msg);
+ System.out.println(logType.getMessage());
+ }
+}
diff --git a/students/251822722/ocp/logger/Logger.java b/students/251822722/ocp/logger/Logger.java
new file mode 100644
index 0000000000..2c72f293de
--- /dev/null
+++ b/students/251822722/ocp/logger/Logger.java
@@ -0,0 +1,60 @@
+package ocp.logger;
+
+import ocp.logType.LogType;
+import ocp.logType.RawLog;
+import ocp.logType.RawLogWithDate;
+
+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;
+
+ public Logger(){
+
+ }
+
+
+
+ public Logger getLogger(int logType, int logMethod) {
+
+ LogType logTypeClass;
+ Logger logger;
+
+
+ switch (logType) {
+ case RAW_LOG:
+ logTypeClass = new RawLog();
+ break;
+ case RAW_LOG_WITH_DATE:
+ logTypeClass = new RawLogWithDate();
+ break;
+ default:
+ logTypeClass = new RawLog();
+
+ }
+
+
+ switch (logMethod) {
+ case EMAIL_LOG:
+ logger = new MailLogger(logTypeClass);
+ break;
+ case SMS_LOG:
+ logger = new SMSLogger(logTypeClass);
+ break;
+ case PRINT_LOG:
+ logger = new DateLogger(logTypeClass);
+ break;
+ default:
+ logger = new MailLogger(logTypeClass);
+
+ }
+
+ return logger;
+
+
+ }
+}
+
diff --git a/students/251822722/ocp/logger/MailLogger.java b/students/251822722/ocp/logger/MailLogger.java
new file mode 100644
index 0000000000..02878d1172
--- /dev/null
+++ b/students/251822722/ocp/logger/MailLogger.java
@@ -0,0 +1,24 @@
+package ocp.logger;
+
+import ocp.util.MailUtil;
+import ocp.logType.LogType;
+
+/**
+ * ocp.ocp.logger
+ * Created by Eric Wang on 6/21/17.
+ */
+public class MailLogger extends Logger {
+
+ LogType logType;
+
+ public MailLogger(LogType logType) {
+ this.logType = logType;
+ }
+
+
+ public void log(String msg) {
+
+ this.logType.setMessage(msg);
+ MailUtil.send(logType.getMessage());
+ }
+}
diff --git a/students/251822722/ocp/logger/SMSLogger.java b/students/251822722/ocp/logger/SMSLogger.java
new file mode 100644
index 0000000000..d9c5ca30f7
--- /dev/null
+++ b/students/251822722/ocp/logger/SMSLogger.java
@@ -0,0 +1,24 @@
+package ocp.logger;
+
+import ocp.util.SMSUtil;
+import ocp.logType.LogType;
+
+/**
+ * ocp.ocp.logger
+ * Created by Eric Wang on 6/21/17.
+ */
+public class SMSLogger extends Logger {
+
+ LogType logType;
+
+ public SMSLogger(LogType logType) {
+ this.logType = logType;
+ }
+
+
+ public void log(String msg) {
+
+ this.logType.setMessage(msg);
+ SMSUtil.send(logType.getMessage());
+ }
+}
diff --git a/students/251822722/ocp/util/DateUtil.java b/students/251822722/ocp/util/DateUtil.java
new file mode 100644
index 0000000000..a4361d96c0
--- /dev/null
+++ b/students/251822722/ocp/util/DateUtil.java
@@ -0,0 +1,10 @@
+package ocp.util;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+
+ return null;
+ }
+
+}
diff --git a/students/251822722/ocp/util/MailUtil.java b/students/251822722/ocp/util/MailUtil.java
new file mode 100644
index 0000000000..63c497f111
--- /dev/null
+++ b/students/251822722/ocp/util/MailUtil.java
@@ -0,0 +1,10 @@
+package ocp.util;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/251822722/ocp/util/SMSUtil.java b/students/251822722/ocp/util/SMSUtil.java
new file mode 100644
index 0000000000..a31e93837c
--- /dev/null
+++ b/students/251822722/ocp/util/SMSUtil.java
@@ -0,0 +1,10 @@
+package ocp.util;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/EmailLogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/EmailLogPrinter.java
new file mode 100644
index 0000000000..d0d5fbe7e2
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/EmailLogPrinter.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class EmailLogPrinter implements LogPrinter {
+
+ @Override
+ public void print(String log) {
+ //MailUtil.send(log);
+ }
+
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/LogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogPrinter.java
new file mode 100644
index 0000000000..f7f50226fb
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogPrinter.java
@@ -0,0 +1,5 @@
+package com.coderising.ocp;
+
+public interface LogPrinter {
+ void print(String log);
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/LogProcessor.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogProcessor.java
new file mode 100644
index 0000000000..e5343c7d25
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogProcessor.java
@@ -0,0 +1,5 @@
+package com.coderising.ocp;
+
+public interface LogProcessor {
+ String process(String msg);
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/LogWithDateProcessor.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogWithDateProcessor.java
new file mode 100644
index 0000000000..f4c574e9fc
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogWithDateProcessor.java
@@ -0,0 +1,12 @@
+package com.coderising.ocp;
+
+import java.util.Date;
+
+public class LogWithDateProcessor implements LogProcessor {
+
+ @Override
+ public String process(String msg) {
+ String txtDate = new Date().toString();
+ return txtDate + ": " + msg;
+ }
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/Logger.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/Logger.java
new file mode 100644
index 0000000000..071bb88a63
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/Logger.java
@@ -0,0 +1,23 @@
+package com.coderising.ocp;
+
+public class Logger {
+ private LogProcessor processor;
+ private LogPrinter printer;
+
+ public Logger(LogProcessor processor, LogPrinter printer) {
+ this.processor = processor;
+ this.printer = printer;
+ }
+
+ public void log(String msg) {
+ String logMsg = msg;
+
+ if (processor != null) {
+ logMsg = processor.process(logMsg);
+ }
+
+ if (printer != null) {
+ printer.print(logMsg);
+ }
+ }
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/NormalLogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/NormalLogPrinter.java
new file mode 100644
index 0000000000..dce3556358
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/NormalLogPrinter.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class NormalLogPrinter implements LogPrinter {
+
+ @Override
+ public void print(String log) {
+ System.out.println(log);
+ }
+
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/RawLogProcessor.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/RawLogProcessor.java
new file mode 100644
index 0000000000..4aa5badd37
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/RawLogProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class RawLogProcessor implements LogProcessor {
+
+ @Override
+ public String process(String msg) {
+ return msg;
+ }
+
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/SmsLogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/SmsLogPrinter.java
new file mode 100644
index 0000000000..88a0913761
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/SmsLogPrinter.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class SmsLogPrinter implements LogPrinter {
+
+ @Override
+ public void print(String log) {
+ //SMSUtil.send(log);
+ }
+
+}
diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml
index 129bccd496..435c8fd478 100644
--- a/students/402246209/learning/pom.xml
+++ b/students/402246209/learning/pom.xml
@@ -10,4 +10,51 @@
jar
+
+ 1.8
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 3.0.2
+
+ UTF-8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.0
+
+ 1.8
+ 1.8
+
+ UTF-8
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.6
+
+
+
+ com.mimieye.odd.srp.main.PromotionEmailMain
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/config/LoggerConstant.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/config/LoggerConstant.java
new file mode 100644
index 0000000000..2f19e884c5
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/config/LoggerConstant.java
@@ -0,0 +1,26 @@
+package com.mimieye.odd.ocp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class LoggerConstant {
+ 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;
+
+ public static final Map TPYE_MAP = new HashMap<>();
+ public static final Map METHOD_MAP = new HashMap<>();
+
+ static {
+ TPYE_MAP.put(1, "com.mimieye.odd.ocp.type.Impl.RawLogTypeImpl");
+ TPYE_MAP.put(2, "com.mimieye.odd.ocp.type.Impl.RawLogWithDateTypeImpl");
+ METHOD_MAP.put(1, "com.mimieye.odd.ocp.method.Impl.MailMethodImpl");
+ METHOD_MAP.put(2, "com.mimieye.odd.ocp.method.Impl.SMSMethodImpl");
+ METHOD_MAP.put(3, "com.mimieye.odd.ocp.method.Impl.PrintMethodImpl");
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/Impl/LoggerImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/Impl/LoggerImpl.java
new file mode 100644
index 0000000000..869aa45227
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/Impl/LoggerImpl.java
@@ -0,0 +1,36 @@
+package com.mimieye.odd.ocp.logger.Impl;
+
+import com.mimieye.odd.ocp.config.LoggerConstant;
+import com.mimieye.odd.ocp.logger.LoggerInterface;
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.type.TypeInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+import com.mimieye.odd.ocp.util.SMSUtil;
+
+public class LoggerImpl implements LoggerInterface{
+
+ private TypeInterface type;
+ private MethodInterface method;
+ private Integer typeInt;
+ private Integer methodInt;
+
+ public LoggerImpl(int typeInt, int methodInt) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
+ this.typeInt = typeInt;
+ this.methodInt = methodInt;
+ init();
+ }
+
+ private void init() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+ String typeClass = LoggerConstant.TPYE_MAP.get(typeInt);
+ String methodClass = LoggerConstant.METHOD_MAP.get(methodInt);
+ TypeInterface typeInterface = (TypeInterface)Class.forName(typeClass).newInstance();
+ MethodInterface methodInterface = (MethodInterface)Class.forName(methodClass).newInstance();
+ this.type = typeInterface;
+ this.method = methodInterface;
+ }
+
+ public void log(String msg){
+ method.execute(type.getMsg(msg));
+ }
+}
+
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/LoggerInterface.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/LoggerInterface.java
new file mode 100644
index 0000000000..43519090bf
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/LoggerInterface.java
@@ -0,0 +1,8 @@
+package com.mimieye.odd.ocp.logger;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public interface LoggerInterface {
+ void log(String msg);
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/main/LoggerMain.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/main/LoggerMain.java
new file mode 100644
index 0000000000..e8bdeb2f51
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/main/LoggerMain.java
@@ -0,0 +1,24 @@
+package com.mimieye.odd.ocp.main;
+
+import com.mimieye.odd.ocp.config.LoggerConstant;
+import com.mimieye.odd.ocp.logger.Impl.LoggerImpl;
+import com.mimieye.odd.ocp.logger.LoggerInterface;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class LoggerMain {
+ public static void main(String[] args) {
+ try {
+ LoggerInterface logger = new LoggerImpl(LoggerConstant.RAW_LOG, LoggerConstant.EMAIL_LOG);
+ String msg = "log content.";
+ logger.log(msg);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/MailMethodImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/MailMethodImpl.java
new file mode 100644
index 0000000000..dda6d6c5d3
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/MailMethodImpl.java
@@ -0,0 +1,14 @@
+package com.mimieye.odd.ocp.method.Impl;
+
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class MailMethodImpl implements MethodInterface {
+ @Override
+ public void execute(String logMsg) {
+ MailUtil.send(logMsg);
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/PrintMethodImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/PrintMethodImpl.java
new file mode 100644
index 0000000000..04d67545fe
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/PrintMethodImpl.java
@@ -0,0 +1,15 @@
+package com.mimieye.odd.ocp.method.Impl;
+
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class PrintMethodImpl implements MethodInterface {
+
+ @Override
+ public void execute(String logMsg) {
+ System.out.println("print console msg - " + logMsg);
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/SMSMethodImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/SMSMethodImpl.java
new file mode 100644
index 0000000000..14a8fe0c34
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/SMSMethodImpl.java
@@ -0,0 +1,16 @@
+package com.mimieye.odd.ocp.method.Impl;
+
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+import com.mimieye.odd.ocp.util.SMSUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class SMSMethodImpl implements MethodInterface {
+
+ @Override
+ public void execute(String logMsg) {
+ SMSUtil.send(logMsg);
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/MethodInterface.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/MethodInterface.java
new file mode 100644
index 0000000000..9134e8eeae
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/MethodInterface.java
@@ -0,0 +1,8 @@
+package com.mimieye.odd.ocp.method;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public interface MethodInterface {
+ void execute(String logMsg);
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogTypeImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogTypeImpl.java
new file mode 100644
index 0000000000..0f912ec56a
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogTypeImpl.java
@@ -0,0 +1,16 @@
+package com.mimieye.odd.ocp.type.Impl;
+
+import com.mimieye.odd.ocp.config.LoggerConstant;
+import com.mimieye.odd.ocp.type.TypeInterface;
+import com.mimieye.odd.ocp.util.DateUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class RawLogTypeImpl implements TypeInterface {
+
+ @Override
+ public String getMsg(String msg) {
+ return msg;
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogWithDateTypeImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogWithDateTypeImpl.java
new file mode 100644
index 0000000000..876e48a830
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogWithDateTypeImpl.java
@@ -0,0 +1,18 @@
+package com.mimieye.odd.ocp.type.Impl;
+
+import com.mimieye.odd.ocp.type.TypeInterface;
+import com.mimieye.odd.ocp.util.DateUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class RawLogWithDateTypeImpl implements TypeInterface {
+
+ @Override
+ public String getMsg(String msg) {
+ String logMsg = msg;
+ String txtDate = DateUtil.getCurrentDateAsString();
+ logMsg = txtDate + ": " + msg;
+ return logMsg;
+ }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/TypeInterface.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/TypeInterface.java
new file mode 100644
index 0000000000..2ed457c68d
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/TypeInterface.java
@@ -0,0 +1,8 @@
+package com.mimieye.odd.ocp.type;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public interface TypeInterface {
+ String getMsg(String msg);
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/DateUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/DateUtil.java
new file mode 100644
index 0000000000..a55ad2d667
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/DateUtil.java
@@ -0,0 +1,12 @@
+package com.mimieye.odd.ocp.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateUtil {
+
+ public static String getCurrentDateAsString() {
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/MailUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/MailUtil.java
new file mode 100644
index 0000000000..2b75360ea2
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/MailUtil.java
@@ -0,0 +1,9 @@
+package com.mimieye.odd.ocp.util;
+
+public class MailUtil {
+
+ public static void send(String logMsg) {
+ System.out.println("send email msg - " + logMsg);
+ }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/SMSUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/SMSUtil.java
new file mode 100644
index 0000000000..c07f9b46bc
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/SMSUtil.java
@@ -0,0 +1,9 @@
+package com.mimieye.odd.ocp.util;
+
+public class SMSUtil {
+
+ public static void send(String logMsg) {
+ System.out.println("send SMS msg - " + logMsg);
+ }
+
+}
diff --git a/students/402246209/readme.md b/students/402246209/readme.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/students/402246209/readme.md
@@ -0,0 +1 @@
+
diff --git a/students/583884851/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/583884851/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..0d0d01098f
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/Logger.java b/students/583884851/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..aca173e665
--- /dev/null
+++ b/students/583884851/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,38 @@
+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/583884851/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/583884851/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/583884851/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/Formatter.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/Logger.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/Sender.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/srp/Configuration.java b/students/583884851/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/583884851/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/583884851/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/srp/Mail.java b/students/583884851/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..f195417dac
--- /dev/null
+++ b/students/583884851/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+/**
+ * 邮件类
+ *
+ * @author chengyu
+ * @version 17/6/20
+ */
+public class Mail {
+ protected String smtpHost = null;
+ protected String altSmtpHost = null;
+ protected String fromAddress = null;
+ protected String toAddress = null;
+ protected String subject = null;
+ protected String message = null;
+
+ public Mail() {
+
+ }
+
+ public Mail(Configuration config) {
+ smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+ altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+ fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+ }
+
+ public void send() {
+ 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 void setToAddress(String toAddress) {
+ this.toAddress = toAddress;
+ }
+
+ public void setContent(String subject, String message) {
+ this.subject = subject;
+ this.message = message;
+ }
+}
diff --git a/students/583884851/src/main/java/com/coderising/ood/srp/Product.java b/students/583884851/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..da05192e51
--- /dev/null
+++ b/students/583884851/src/main/java/com/coderising/ood/srp/Product.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;
+
+/**
+ * @author chengyu
+ * @version 17/6/20
+ */
+public class Product {
+ protected String productID = null;
+ protected String productDesc = null;
+
+ public Product() {
+ }
+
+ public Product(String productID, String productDesc) {
+ this.productID = productID;
+ this.productDesc = productDesc;
+ }
+
+ public static Product of(File file) throws IOException {
+ BufferedReader br;
+ br = new BufferedReader(new FileReader(file));
+ String temp = br.readLine();
+ String[] data = temp.split(" ");
+ System.out.println("产品ID = " + data[0] + "\n");
+ System.out.println("产品描述 = " + data[1] + "\n");
+ return new Product(data[0], data[1]);
+ }
+
+ 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/583884851/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/583884851/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..307cfd3dd9
--- /dev/null
+++ b/students/583884851/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,72 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+ private Product product;
+
+ private static final String NAME_KEY = "NAME";
+ private static final String EMAIL_KEY = "EMAIL";
+
+ public PromotionMail() {
+ File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+ try {
+ product = Product.of(f);
+ } catch (IOException e) {
+ throw new RuntimeException(e.getMessage());
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ PromotionMail pe = new PromotionMail();
+ List emailList = pe.loadMailingList();
+ pe.sendEMails(emailList);
+ }
+
+
+ protected List loadMailingList() throws Exception {
+ String sendMailQuery = "Select name from subscriptions "
+ + "where product_id= '" + product.getProductID() + "' "
+ + "and send_mail=1 ";
+ return DBUtil.query(sendMailQuery);
+ }
+
+
+ protected void sendEMails(List mailingList) throws IOException {
+
+ System.out.println("开始发送邮件");
+ Mail mail = new Mail(new Configuration());
+
+ if (mailingList != null) {
+ Iterator iter = mailingList.iterator();
+ while (iter.hasNext()) {
+ HashMap userInfo = (HashMap) iter.next();
+ mail.setToAddress((String) userInfo.get(EMAIL_KEY));
+ setContent(mail, userInfo, product);
+ try {
+ mail.send();
+ } catch (Exception e) {
+ try {
+ mail.send();
+ } catch (Exception e2) {
+ System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+ }
+ }
+ }
+ } else {
+ System.out.println("没有邮件发送");
+ }
+ }
+
+ private void setContent(Mail mail, HashMap userInfo, Product product) {
+ String subject = "您关注的产品降价了";
+ String name = (String) userInfo.get(NAME_KEY);
+ String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了,欢迎购买!";
+ mail.setContent(subject, message);
+ }
+}
diff --git a/students/583884851/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/583884851/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/583884851/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