diff --git a/.gitignore b/.gitignore index 0c9eaf8..4c016c1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ target/ jars/ JavaLearning.iml *.calss +*.hprof diff --git a/JavaLearning.iml b/JavaLearning.iml index cad2dae..a5dab80 100644 --- a/JavaLearning.iml +++ b/JavaLearning.iml @@ -1,6 +1,11 @@ - + + + + + + @@ -34,7 +39,6 @@ - @@ -75,7 +79,6 @@ - @@ -100,6 +103,7 @@ + diff --git a/src/main/java/com/matthewyao/concurrent/TestVolatile.java b/src/main/java/com/matthewyao/concurrent/TestVolatile.java index 5fe8c35..c337ddc 100644 --- a/src/main/java/com/matthewyao/concurrent/TestVolatile.java +++ b/src/main/java/com/matthewyao/concurrent/TestVolatile.java @@ -14,11 +14,9 @@ public static void increse(){ race++; } - private static final int THREAD_COUNT = 100; + private static final int THREAD_COUNT = 30; public static void main(String[] args) { - StringBuilder sb = new StringBuilder(); - sb.append(""); long start = System.currentTimeMillis(); Thread[] threads = new Thread[THREAD_COUNT]; for (int i=0; i list = new ArrayList<>(); + + while (true) { + list.add(new OOMObject()); + } + } +} + diff --git a/src/main/java/com/matthewyao/concurrent/jvm/ObjectAge.java b/src/main/java/com/matthewyao/concurrent/jvm/ObjectAge.java new file mode 100644 index 0000000..1bea15e --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/jvm/ObjectAge.java @@ -0,0 +1,29 @@ +package com.matthewyao.concurrent.jvm; + +/** + * @Author: yaokuan + * @Date: 2018/8/25 下午7:14 + * -client + * -verbose:gc + * -XX:+PrintGCDetails + * -XX:+UseSerialGC + * -Xms20m + * -Xmx20m + * -Xmn10m + * -XX:SurvivorRatio=8 + * -XX:MaxTenuringThreshold=15 + * -XX:PretenureSizeThreshold=10m + * -XX:+PrintTenuringDistribution + */ +public class ObjectAge { + + private static final int _MB = 1024 * 1024; + + public static void main(String[] args) { + byte[] allocation1, allocation2; + allocation1 = new byte[2 * _MB]; + allocation2 = new byte[4 * _MB]; + allocation2 = null; + allocation2 = new byte[4 * _MB]; + } +} diff --git a/src/main/java/com/matthewyao/concurrent/jvm/PermGenOOM.java b/src/main/java/com/matthewyao/concurrent/jvm/PermGenOOM.java new file mode 100644 index 0000000..1b8f57f --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/jvm/PermGenOOM.java @@ -0,0 +1,18 @@ +package com.matthewyao.concurrent.jvm; + +import java.util.ArrayList; + +/** + * @Author: yaokuan + * @Date: 2018/8/25 下午5:46 + */ +public class PermGenOOM { + public static void main(String[] args) { + ArrayList strList = new ArrayList<>(); + int i = 0; + while (true) { + strList.add(String.valueOf(i++).intern()); + System.out.println(i); + } + } +} diff --git a/src/main/java/com/matthewyao/concurrent/jvm/StackOOM.java b/src/main/java/com/matthewyao/concurrent/jvm/StackOOM.java new file mode 100644 index 0000000..d03a4a3 --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/jvm/StackOOM.java @@ -0,0 +1,33 @@ +package com.matthewyao.concurrent.jvm; + +/** + * @Author: yaokuan + * @Date: 2018/8/20 上午9:06 + * VM Args: -Xss5M + */ +public class StackOOM { + private void dontStop() { + while (true) { + //Do nothing + } + } + + public void stackLeakByThread() { + int threadCount = 1; + while (true) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + dontStop();//不让GC回收 + } + }); + thread.start(); + System.out.println("thread start: " + threadCount++); + } + } + + public static void main(String[] args) { + StackOOM stackOOM = new StackOOM(); + stackOOM.stackLeakByThread(); + } +} diff --git a/src/main/java/com/matthewyao/concurrent/jvm/StackSOF.java b/src/main/java/com/matthewyao/concurrent/jvm/StackSOF.java new file mode 100644 index 0000000..5fde2be --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/jvm/StackSOF.java @@ -0,0 +1,24 @@ +package com.matthewyao.concurrent.jvm; + +/** + * @Author: yaokuan + * @Date: 2018/8/20 上午8:54 + */ +public class StackSOF { + private int stackLength = 1; + + public void stackLeak() { + stackLength++; + stackLeak(); + } + + public static void main(String[] args) { + StackSOF stackSOF = new StackSOF(); + try { + stackSOF.stackLeak(); + } catch (Throwable e) { + System.out.println("stack length: " + stackSOF.stackLength); + throw e; + } + } +} diff --git a/src/main/java/com/matthewyao/concurrent/multipleThread/CountDownLatchTest.java b/src/main/java/com/matthewyao/concurrent/multipleThread/CountDownLatchTest.java new file mode 100644 index 0000000..b672009 --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/multipleThread/CountDownLatchTest.java @@ -0,0 +1,40 @@ +package com.matthewyao.concurrent.multipleThread; + +import org.apache.tools.ant.util.DateUtils; + +import java.util.Date; +import java.util.concurrent.CountDownLatch; + +/** + * @Author: yaokuan + * @Date: 2018/7/7 下午5:22 + */ +public class CountDownLatchTest { + private static class MyThread extends Thread { + @Override + public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(String.format("%s %s was finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"), getName())); + latch.countDown(); + } + } + private static CountDownLatch latch = new CountDownLatch(10); + + public static void main(String[] args) { + System.out.println(String.format("%s I was main and I'm started", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + for (int i = 0; i < 10; i++) { + MyThread myThread = new MyThread(); + myThread.start(); + } + try { + latch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(String.format("%s I was main and I'm finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + } +} diff --git a/src/main/java/com/matthewyao/concurrent/multipleThread/CycleBarrierTest.java b/src/main/java/com/matthewyao/concurrent/multipleThread/CycleBarrierTest.java new file mode 100644 index 0000000..51dc8d9 --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/multipleThread/CycleBarrierTest.java @@ -0,0 +1,50 @@ +package com.matthewyao.concurrent.multipleThread; + +import org.apache.tools.ant.util.DateUtils; + +import java.util.Date; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; + +/** + * @Author: yaokuan + * @Date: 2018/7/7 下午5:49 + */ +public class CycleBarrierTest { + private static CyclicBarrier cyclicBarrier = new CyclicBarrier(10); + + private static class MyThread extends Thread { + @Override + public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(String.format("%s %s was finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"), getName())); + try { + cyclicBarrier.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BrokenBarrierException e) { + e.printStackTrace(); + } + } + } + + public static void main(String[] args) throws BrokenBarrierException { + System.out.println(String.format("%s I was main and I'm started", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + for (int i = 0; i < 10; i++) { + MyThread myThread = new MyThread(); + myThread.start(); + } + try { + cyclicBarrier.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + cyclicBarrier.reset(); + System.out.println(String.format("%s I was main and I'm finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + } +} diff --git a/src/main/java/com/matthewyao/concurrent/multipleThread/MainSleep.java b/src/main/java/com/matthewyao/concurrent/multipleThread/MainSleep.java new file mode 100644 index 0000000..490c226 --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/multipleThread/MainSleep.java @@ -0,0 +1,39 @@ +package com.matthewyao.concurrent.multipleThread; + +import org.apache.tools.ant.util.DateUtils; + +import java.util.Date; +import java.util.Random; + +/** + * @Author: yaokuan + * @Date: 2018/7/7 下午4:09 + */ +public class MainSleep { + + private static class MyThread extends Thread { + @Override + public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(String.format("%s %s was finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"), getName())); + } + } + + public static void main(String[] args) { + System.out.println(String.format("%s I was main and I'm started", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + for (int i = 0; i < 10; i++) { + MyThread myThread = new MyThread(); + myThread.start(); + } + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(String.format("%s I was main and I'm finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + } +} diff --git a/src/main/java/com/matthewyao/concurrent/multipleThread/PossibleReordering.java b/src/main/java/com/matthewyao/concurrent/multipleThread/PossibleReordering.java new file mode 100644 index 0000000..e49e182 --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/multipleThread/PossibleReordering.java @@ -0,0 +1,42 @@ +package com.matthewyao.concurrent.multipleThread; + +/** + * @Author: yaokuan + * @Date: 2018/8/11 下午10:51 + */ +public class PossibleReordering { + + static int x = 0, y = 0; + static int a = 0, b = 0; + + public static void main(String[] args) throws InterruptedException { + PossibleReordering possibleReordering = new PossibleReordering(); + possibleReordering.test(); + } + + private void test() throws InterruptedException { + while (true) { + Thread threadOne = new Thread(new Runnable() { + @Override + public void run() { + a = 1; + x = b; + } + }); + Thread threadTwo = new Thread(new Runnable() { + @Override + public void run() { + b = 1; + y = a; + } + }); + threadOne.start(); + threadTwo.start(); + threadOne.join(); + threadTwo.join(); + if (x == 0 && y == 0) { + System.out.println("x: " + x + ", y:" + y); + } + } + } +} diff --git a/src/main/java/com/matthewyao/concurrent/multipleThread/SyncMultiThread.java b/src/main/java/com/matthewyao/concurrent/multipleThread/SyncMultiThread.java new file mode 100644 index 0000000..e5e41b1 --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/multipleThread/SyncMultiThread.java @@ -0,0 +1,61 @@ +package com.matthewyao.concurrent.multipleThread; + +import java.util.concurrent.*; + +/** + * @Author: yaokuan + * @Date: 2018/10/25 上午10:34 + */ +public class SyncMultiThread { + + private static ThreadPoolExecutor threadPoolExecutor; + private static final int SLEEP_MILLS = 5; + + static { + threadPoolExecutor = new ThreadPoolExecutor(5, 20, 1, TimeUnit.MINUTES, new LinkedBlockingQueue()); + } + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + System.out.println("Begin to count"); + final CountDownLatch latch = new CountDownLatch(1000); + for (int i = 1; i <= 1000; i++) { + final int num = i; + multiCount(latch, num); + } + try { + latch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("phase one end, cost: " + (System.currentTimeMillis() - start) + " mills"); + + start = System.currentTimeMillis(); + final CountDownLatch latch2 = new CountDownLatch(1000); + for (int i = 1001; i <= 2000; i++) { + final int num = i; + multiCount(latch2, num); + } + try { + latch2.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("phase two end, cost: " + (System.currentTimeMillis() - start) + " mills"); + } + + private static void multiCount(final CountDownLatch latch, final int num) { + threadPoolExecutor.submit(new Runnable() { + @Override + public void run() { + System.out.println(num); + try { + Thread.sleep(SLEEP_MILLS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + latch.countDown(); + } + }); + } +} diff --git a/src/main/java/com/matthewyao/concurrent/multipleThread/TestFuture.java b/src/main/java/com/matthewyao/concurrent/multipleThread/TestFuture.java new file mode 100644 index 0000000..0fcb65d --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/multipleThread/TestFuture.java @@ -0,0 +1,60 @@ +package com.matthewyao.concurrent.multipleThread; + + +import javafx.concurrent.Task; + +import java.util.concurrent.*; + +/** + * @Author: yaokuan + * @Date: 2018/8/11 下午9:50 + */ +public class TestFuture { + + private static final int CORE_POOL_SIZE = 1; + private static final int MAX_POOL_SIZE = 1; + private static final long KEEP_ALIVE_TIME = 1000; + + public static void main(String[] args) { + TestFuture testFuture = new TestFuture(); + try { + testFuture.test(); + } catch (ExecutionException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void test() throws ExecutionException, InterruptedException { + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + CORE_POOL_SIZE, + MAX_POOL_SIZE, + KEEP_ALIVE_TIME, + TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(), + new ThreadPoolExecutor.CallerRunsPolicy());//调用者运行 + + Future future = threadPoolExecutor.submit(new MyTask()); + + System.out.println(System.currentTimeMillis() + ", waiting for task begin..."); + System.out.println(future.get()); + System.out.println(System.currentTimeMillis() + ", waiting for task done..."); + } + + private class MyTask implements Callable{ + @Override + public Object call() throws Exception { + //Do a lot of stuff + Thread.sleep(5000); + return "The Callable is Done"; + } + } + + private class RunTask implements Runnable{ + @Override + public void run() { + //Returns nothing + } + } +} diff --git a/src/main/java/com/matthewyao/concurrent/multipleThread/ThreadJoin.java b/src/main/java/com/matthewyao/concurrent/multipleThread/ThreadJoin.java new file mode 100644 index 0000000..a8a222e --- /dev/null +++ b/src/main/java/com/matthewyao/concurrent/multipleThread/ThreadJoin.java @@ -0,0 +1,44 @@ +package com.matthewyao.concurrent.multipleThread; + +import org.apache.tools.ant.util.DateUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @Author: yaokuan + * @Date: 2018/7/7 下午4:22 + */ +public class ThreadJoin { + + private static class MyThread extends Thread { + @Override + public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(String.format("%s %s was finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"), getName())); + } + } + + public static void main(String[] args) { + System.out.println(String.format("%s I was main and I'm started", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + List threads = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + MyThread myThread = new MyThread(); + myThread.start(); + threads.add(myThread); + } + for (Thread thread : threads) { + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println(String.format("%s I was main and I'm finished", DateUtils.format(new Date(), "hh:mm:ss:SSS"))); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/Facade/CPU.java b/src/main/java/com/matthewyao/designpattern/Facade/CPU.java new file mode 100644 index 0000000..6812e20 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/Facade/CPU.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.Facade; + +/** + * Created by yaokuan on 2018/5/27. + */ +public class CPU { + public void startCPU() { + System.out.println("CPU is started"); + } + + public void shutdownCPU() { + System.out.println("CPU is shutdown"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/Facade/Client.java b/src/main/java/com/matthewyao/designpattern/Facade/Client.java new file mode 100644 index 0000000..d019226 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/Facade/Client.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.Facade; + +/** + * Created by yaokuan on 2018/5/27. + */ +public class Client { + public static void main(String[] args) { + Computer computer = new Computer(); + //用户需要打开电脑 + computer.startComputer(); + //用户需要关闭电脑 + computer.shutdownComputer(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/Facade/Computer.java b/src/main/java/com/matthewyao/designpattern/Facade/Computer.java new file mode 100644 index 0000000..9f43c0b --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/Facade/Computer.java @@ -0,0 +1,32 @@ +package com.matthewyao.designpattern.Facade; + +/** + * Created by yaokuan on 2018/5/27. + */ +public class Computer { + private CPU cpu; + private Disk disk; + private Memory memory; + + public Computer() { + this.cpu = new CPU(); + this.disk = new Disk(); + this.memory = new Memory(); + } + + public void startComputer() { + System.out.println("Starting computer..."); + cpu.startCPU(); + disk.startDisk(); + memory.startMemory(); + System.out.println("Computer is started"); + } + + public void shutdownComputer() { + System.out.println("Shutdown computer..."); + cpu.shutdownCPU(); + disk.shutdownDisk(); + memory.shutdownMemory(); + System.out.println("Computer is shutdown"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/Facade/Disk.java b/src/main/java/com/matthewyao/designpattern/Facade/Disk.java new file mode 100644 index 0000000..87181e8 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/Facade/Disk.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.Facade; + +/** + * Created by yaokuan on 2018/5/27. + */ +public class Disk { + public void startDisk() { + System.out.println("Disk is started"); + } + + public void shutdownDisk() { + System.out.println("Disk is shutdown"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/Facade/Memory.java b/src/main/java/com/matthewyao/designpattern/Facade/Memory.java new file mode 100644 index 0000000..2962cc4 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/Facade/Memory.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.Facade; + +/** + * Created by yaokuan on 2018/5/27. + */ +public class Memory { + public void startMemory() { + System.out.println("Memory is started"); + } + + public void shutdownMemory() { + System.out.println("Memory is shutdown"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Big.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Big.java new file mode 100644 index 0000000..6901a41 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Big.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Big implements Size { + @Override + public void show() { + System.out.println("big size"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/BigCircleFactory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/BigCircleFactory.java new file mode 100644 index 0000000..4553569 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/BigCircleFactory.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/10. + */ +public class BigCircleFactory implements Factory { + @Override + public Shape produceShape() { + return new Circle(); + } + + @Override + public Size produceSize() { + return new Big(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Circle.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Circle.java new file mode 100644 index 0000000..a89c5ec --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Circle.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Circle implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Circle"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Factory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Factory.java new file mode 100644 index 0000000..90526e9 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Factory.java @@ -0,0 +1,10 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public interface Factory { + Shape produceShape(); + + Size produceSize(); +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Medium.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Medium.java new file mode 100644 index 0000000..1ad65ae --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Medium.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/10. + */ +public class Medium implements Size { + @Override + public void show() { + System.out.println("medium size"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Rectangle.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Rectangle.java new file mode 100644 index 0000000..f1e9356 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Rectangle.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Rectangle implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Rectangle"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Shape.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Shape.java new file mode 100644 index 0000000..d318a44 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Shape.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public interface Shape { + void draw(); +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Size.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Size.java new file mode 100644 index 0000000..290d882 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Size.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public interface Size { + public void show(); +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Small.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Small.java new file mode 100644 index 0000000..7cc85c2 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Small.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Small implements Size { + @Override + public void show() { + System.out.println("small size"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/SmallSquareFactory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/SmallSquareFactory.java new file mode 100644 index 0000000..3e1348e --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/SmallSquareFactory.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/10. + */ +public class SmallSquareFactory implements Factory { + @Override + public Shape produceShape() { + return new Square(); + } + + @Override + public Size produceSize() { + return new Small(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Square.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Square.java new file mode 100644 index 0000000..7e72b70 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Square.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Square implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Square"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Test.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Test.java new file mode 100644 index 0000000..d7defc4 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/abstractFactory/Test.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.FactoryPattern.abstractFactory; + +/** + * Created by yaokuan on 2018/5/10. + */ +public class Test { + public static void main(String[] args) { + BigCircleFactory bigCircleFactory = new BigCircleFactory(); + Shape circle = bigCircleFactory.produceShape(); + Size big = bigCircleFactory.produceSize(); + big.show(); + circle.draw(); + + SmallSquareFactory smallSquareFactory = new SmallSquareFactory(); + Shape square = smallSquareFactory.produceShape(); + Size small = smallSquareFactory.produceSize(); + small.show(); + square.draw(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Circle.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Circle.java new file mode 100644 index 0000000..915797f --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Circle.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Circle implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Circle"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/CircleFactory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/CircleFactory.java new file mode 100644 index 0000000..4b23678 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/CircleFactory.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class CircleFactory implements Factory{ + + public Circle produce() { + return new Circle(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Factory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Factory.java new file mode 100644 index 0000000..5400c6e --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Factory.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/10. + */ +public interface Factory { + Shape produce(); +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Rectangle.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Rectangle.java new file mode 100644 index 0000000..551af65 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Rectangle.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Rectangle implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Rectangle"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/RectangleFactory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/RectangleFactory.java new file mode 100644 index 0000000..76f0d52 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/RectangleFactory.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class RectangleFactory implements Factory{ + + public Rectangle produce() { + return new Rectangle(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Shape.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Shape.java new file mode 100644 index 0000000..418608a --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Shape.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public interface Shape { + void draw(); +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Square.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Square.java new file mode 100644 index 0000000..9ec6055 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Square.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Square implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Square"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/SquareFactory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/SquareFactory.java new file mode 100644 index 0000000..392f4a3 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/SquareFactory.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class SquareFactory implements Factory{ + + public Square produce() { + return new Square(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Test.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Test.java new file mode 100644 index 0000000..bb0cbb5 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/factoryFunction/Test.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.FactoryPattern.factoryFunction; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Test { + public static void main(String[] args) { + CircleFactory circleFactory = new CircleFactory(); + Circle circle = circleFactory.produce(); + circle.draw(); + + RectangleFactory rectangleFactory = new RectangleFactory(); + Rectangle rectangle = rectangleFactory.produce(); + rectangle.draw(); + + SquareFactory squareFactory = new SquareFactory(); + Square square = squareFactory.produce(); + square.draw(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Circle.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Circle.java new file mode 100644 index 0000000..b1242b5 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Circle.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.simpleFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Circle implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Circle"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Factory.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Factory.java new file mode 100644 index 0000000..ba5b673 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Factory.java @@ -0,0 +1,22 @@ +package com.matthewyao.designpattern.FactoryPattern.simpleFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Factory { + + /** + * 简单工厂模式,又称静态工厂模式,常采用静态方法生成对象, + * 若对象簇扩充,需要修改工厂代码,不符合开闭原则 + */ + public static Shape produce(String shape) { + if (shape.equalsIgnoreCase("square")) { + return new Square(); + } else if (shape.equalsIgnoreCase("rectangle")) { + return new Rectangle(); + } else if (shape.equalsIgnoreCase("circle")) { + return new Circle(); + } + return null; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Rectangle.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Rectangle.java new file mode 100644 index 0000000..4b8098c --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Rectangle.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.simpleFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Rectangle implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Rectangle"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Shape.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Shape.java new file mode 100644 index 0000000..4d341f4 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Shape.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.FactoryPattern.simpleFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public interface Shape { + void draw(); +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Square.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Square.java new file mode 100644 index 0000000..a179f31 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Square.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.FactoryPattern.simpleFactory; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class Square implements Shape { + + @Override + public void draw() { + System.out.println("Draw a Square"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Test.java b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Test.java new file mode 100644 index 0000000..3b13800 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/FactoryPattern/simpleFactory/Test.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.FactoryPattern.simpleFactory; + +/** + * Created by yaokuan on 2018/5/10. + */ +public class Test { + public static void main(String[] args) { + Shape rectangle = Factory.produce("rectangle"); + rectangle.draw(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/adapter/AdapterClass.java b/src/main/java/com/matthewyao/designpattern/adapter/AdapterClass.java new file mode 100644 index 0000000..b659984 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/adapter/AdapterClass.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.adapter; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class AdapterClass extends UsbPlugin implements MicroUSB { + //以继承的方式实现适配 + @Override + public void isMicroUsb() { + super.isUsb(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/adapter/AdapterObj.java b/src/main/java/com/matthewyao/designpattern/adapter/AdapterObj.java new file mode 100644 index 0000000..3addc65 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/adapter/AdapterObj.java @@ -0,0 +1,18 @@ +package com.matthewyao.designpattern.adapter; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class AdapterObj implements MicroUSB { + //以聚合的方式实现适配 + private USB usb; + + public AdapterObj(USB usb) { + this.usb = usb; + } + + @Override + public void isMicroUsb() { + usb.isUsb(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/adapter/MicroUSB.java b/src/main/java/com/matthewyao/designpattern/adapter/MicroUSB.java new file mode 100644 index 0000000..014d33e --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/adapter/MicroUSB.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.adapter; + +/** + * Created by yaokuan on 2018/5/25. + */ +public interface MicroUSB { + void isMicroUsb(); +} diff --git a/src/main/java/com/matthewyao/designpattern/adapter/Test.java b/src/main/java/com/matthewyao/designpattern/adapter/Test.java new file mode 100644 index 0000000..aa043d0 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/adapter/Test.java @@ -0,0 +1,17 @@ +package com.matthewyao.designpattern.adapter; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class Test { + public static void main(String[] args) { + UsbPlugin up = new UsbPlugin(); + AdapterObj adapter = new AdapterObj(up); + System.out.print("通过对象适配器:"); + adapter.isMicroUsb(); + + AdapterClass adapterClass = new AdapterClass(); + System.out.print("通过类适配器:"); + adapterClass.isMicroUsb(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/adapter/USB.java b/src/main/java/com/matthewyao/designpattern/adapter/USB.java new file mode 100644 index 0000000..6705488 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/adapter/USB.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.adapter; + +/** + * Created by yaokuan on 2018/5/25. + */ +public interface USB { + void isUsb(); +} diff --git a/src/main/java/com/matthewyao/designpattern/adapter/UsbPlugin.java b/src/main/java/com/matthewyao/designpattern/adapter/UsbPlugin.java new file mode 100644 index 0000000..0698a84 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/adapter/UsbPlugin.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.adapter; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class UsbPlugin implements USB { + @Override + public void isUsb() { + System.out.println("USB口"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Blue.java b/src/main/java/com/matthewyao/designpattern/bridge/Blue.java new file mode 100644 index 0000000..3e994c3 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Blue.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class Blue implements Color { + @Override + public void paint(String shape) { + System.out.println("蓝色的" + shape); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Circle.java b/src/main/java/com/matthewyao/designpattern/bridge/Circle.java new file mode 100644 index 0000000..f4cb651 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Circle.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class Circle extends Shape { + @Override + public void draw() { + color.paint("圆形"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Color.java b/src/main/java/com/matthewyao/designpattern/bridge/Color.java new file mode 100644 index 0000000..e2f12a4 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Color.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public interface Color { + void paint(String shape); +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Rectangle.java b/src/main/java/com/matthewyao/designpattern/bridge/Rectangle.java new file mode 100644 index 0000000..296f7dc --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Rectangle.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class Rectangle extends Shape { + @Override + public void draw() { + color.paint("长方形"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Red.java b/src/main/java/com/matthewyao/designpattern/bridge/Red.java new file mode 100644 index 0000000..10b7d21 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Red.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class Red implements Color { + @Override + public void paint(String shape) { + System.out.println("红色的" + shape); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Shape.java b/src/main/java/com/matthewyao/designpattern/bridge/Shape.java new file mode 100644 index 0000000..2190836 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Shape.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public abstract class Shape { + Color color; + + public void setColor(Color color) { + this.color = color; + } + + public abstract void draw(); +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Square.java b/src/main/java/com/matthewyao/designpattern/bridge/Square.java new file mode 100644 index 0000000..73754af --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Square.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class Square extends Shape { + @Override + public void draw() { + color.paint("正方形"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/Test.java b/src/main/java/com/matthewyao/designpattern/bridge/Test.java new file mode 100644 index 0000000..cf2c888 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/Test.java @@ -0,0 +1,22 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class Test { + public static void main(String[] args) { + Color white = new White(); + Color red = new Red(); + Shape rectangle = new Rectangle(); + rectangle.setColor(white); + rectangle.draw(); + rectangle.setColor(red); + rectangle.draw(); + + Shape circle = new Circle(); + circle.setColor(white); + circle.draw(); + circle.setColor(red); + circle.draw(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/bridge/White.java b/src/main/java/com/matthewyao/designpattern/bridge/White.java new file mode 100644 index 0000000..659f139 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/bridge/White.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.bridge; + +/** + * Created by yaokuan on 2018/5/25. + */ +public class White implements Color { + @Override + public void paint(String shape) { + System.out.println("白色的" + shape); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/Builder.java b/src/main/java/com/matthewyao/designpattern/builder/Builder.java new file mode 100644 index 0000000..538d694 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/Builder.java @@ -0,0 +1,15 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public interface Builder { + + void addVegetables(); + + void addAmaranth(); + + void addSauce(); + + Salad buildSalad(); +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/CaesarSalad.java b/src/main/java/com/matthewyao/designpattern/builder/CaesarSalad.java new file mode 100644 index 0000000..19d787b --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/CaesarSalad.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public class CaesarSalad extends Salad { + + public CaesarSalad() { + System.out.println("Begin to build caesar salad"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/CaesarSaladBuilder.java b/src/main/java/com/matthewyao/designpattern/builder/CaesarSaladBuilder.java new file mode 100644 index 0000000..81e30f7 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/CaesarSaladBuilder.java @@ -0,0 +1,35 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public class CaesarSaladBuilder implements Builder { + private Salad salad; + + public CaesarSaladBuilder() { + this.salad = new CaesarSalad(); + } + + @Override + public void addVegetables() { + salad.setVegetables("tomato");//西红柿 + } + + @Override + public void addAmaranth() { + salad.setAmaranth("roast chicken");//烤鸡肉 + } + + @Override + public void addSauce() { + salad.setSauce("yogurt");//酸奶 + } + + @Override + public Salad buildSalad() { + addAmaranth(); + addVegetables(); + addSauce(); + return salad; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/Director.java b/src/main/java/com/matthewyao/designpattern/builder/Director.java new file mode 100644 index 0000000..9bec604 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/Director.java @@ -0,0 +1,17 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public class Director { + + private Builder builder; + + public Director(Builder builder) { + this.builder = builder; + } + + public Salad getSalad() { + return builder.buildSalad(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/FruitSalad.java b/src/main/java/com/matthewyao/designpattern/builder/FruitSalad.java new file mode 100644 index 0000000..535cf38 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/FruitSalad.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public class FruitSalad extends Salad { + + public FruitSalad() { + System.out.println("Begin to build fruit salad"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/FruitSaladBuilder.java b/src/main/java/com/matthewyao/designpattern/builder/FruitSaladBuilder.java new file mode 100644 index 0000000..3f77b56 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/FruitSaladBuilder.java @@ -0,0 +1,36 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public class FruitSaladBuilder implements Builder { + + private Salad salad; + + public FruitSaladBuilder() { + this.salad = new FruitSalad(); + } + + @Override + public void addVegetables() { + salad.setVegetables("broccoli");//西兰花 + } + + @Override + public void addAmaranth() { + salad.setAmaranth("sole file");//龙利鱼 + } + + @Override + public void addSauce() { + salad.setSauce("sesame soy");//芝麻酱 + } + + @Override + public Salad buildSalad() { + addAmaranth(); + addVegetables(); + addSauce(); + return salad; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/Salad.java b/src/main/java/com/matthewyao/designpattern/builder/Salad.java new file mode 100644 index 0000000..ca37f75 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/Salad.java @@ -0,0 +1,46 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public class Salad { + + private String vegetables; + + private String amaranth; + + private String sauce; + + public String getVegetables() { + return vegetables; + } + + public void setVegetables(String vegetables) { + this.vegetables = vegetables; + } + + public String getAmaranth() { + return amaranth; + } + + public void setAmaranth(String amaranth) { + this.amaranth = amaranth; + } + + public String getSauce() { + return sauce; + } + + public void setSauce(String sauce) { + this.sauce = sauce; + } + + @Override + public String toString() { + return "Salad{" + + "vegetables='" + vegetables + '\'' + + ", amaranth='" + amaranth + '\'' + + ", sauce='" + sauce + '\'' + + '}'; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/builder/Test.java b/src/main/java/com/matthewyao/designpattern/builder/Test.java new file mode 100644 index 0000000..710cb34 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/builder/Test.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.builder; + +/** + * Created by yaokuan on 2018/5/12. + */ +public class Test { + /** + * 将对象表示和对象创建分离,适用于对象组成类似,但又各自有不同的组装过程的场景 + */ + public static void main(String[] args) { + Builder builder = new FruitSaladBuilder(); + Director director = new Director(builder); + Salad fruitSalad = director.getSalad(); + System.out.println(fruitSalad); + + builder = new CaesarSaladBuilder(); + director = new Director(builder); + Salad caesarSalad = director.getSalad(); + System.out.println(caesarSalad); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/chain/CEO.java b/src/main/java/com/matthewyao/designpattern/chain/CEO.java new file mode 100644 index 0000000..245361a --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/chain/CEO.java @@ -0,0 +1,26 @@ +package com.matthewyao.designpattern.chain; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class CEO extends Leader{ + + public CEO() { + //CEO没有上级! + super(null); + } + + @Override + public void handleRequest(Reimbursement reimbursement) { + int money = reimbursement.getMoney(); + if (money > 10000) { + //只有婷婷可以报销1万元以上,其他人想都别想,你懂的~ + if (reimbursement.getUsername().equals("tingting")) { + approve("CEO", reimbursement); + }else { + System.out.println(String.format("CEO has rejected %s's reimbursement, money: $%s", + reimbursement.getUsername(), reimbursement.getMoney())); + } + } + } +} diff --git a/src/main/java/com/matthewyao/designpattern/chain/CTO.java b/src/main/java/com/matthewyao/designpattern/chain/CTO.java new file mode 100644 index 0000000..73c6832 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/chain/CTO.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.chain; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class CTO extends Leader { + public CTO(Leader successor) { + super(successor); + } + + @Override + public void handleRequest(Reimbursement reimbursement) { + int money = reimbursement.getMoney(); + if (money <= 10000) { + approve("CTO", reimbursement); + }else { + Leader successor = getSuccessor(); + successor.handleRequest(reimbursement); + } + } +} diff --git a/src/main/java/com/matthewyao/designpattern/chain/Client.java b/src/main/java/com/matthewyao/designpattern/chain/Client.java new file mode 100644 index 0000000..1de2f70 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/chain/Client.java @@ -0,0 +1,32 @@ +package com.matthewyao.designpattern.chain; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Client { + public static void main(String[] args) { + //首先构造责任链 + CEO ceo = new CEO(); + CTO cto = new CTO(ceo); + DeptManager deptManager = new DeptManager(cto); + ProjectManager projectManager = new ProjectManager(deptManager); + + Reimbursement zhangsan380 = new Reimbursement("zhangsan", 380); + projectManager.handleRequest(zhangsan380); + + Reimbursement lishi1220 = new Reimbursement("lishi", 1220); + projectManager.handleRequest(lishi1220); + + Reimbursement wangwu4400 = new Reimbursement("wangwu", 4400); + projectManager.handleRequest(wangwu4400); + + Reimbursement zhangsan8880 = new Reimbursement("zhangsan", 8880); + projectManager.handleRequest(zhangsan8880); + + Reimbursement lishi14900 = new Reimbursement("lishi", 14900); + projectManager.handleRequest(lishi14900); + + Reimbursement tingting88888 = new Reimbursement("tingting", 88888); + projectManager.handleRequest(tingting88888); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/chain/DeptManager.java b/src/main/java/com/matthewyao/designpattern/chain/DeptManager.java new file mode 100644 index 0000000..924eb48 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/chain/DeptManager.java @@ -0,0 +1,22 @@ +package com.matthewyao.designpattern.chain; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class DeptManager extends Leader { + + public DeptManager(Leader successor) { + super(successor); + } + + @Override + public void handleRequest(Reimbursement reimbursement) { + int money = reimbursement.getMoney(); + if (money <= 2000) { + approve("Dept manager", reimbursement); + }else { + Leader successor = getSuccessor(); + successor.handleRequest(reimbursement); + } + } +} diff --git a/src/main/java/com/matthewyao/designpattern/chain/Leader.java b/src/main/java/com/matthewyao/designpattern/chain/Leader.java new file mode 100644 index 0000000..f73c569 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/chain/Leader.java @@ -0,0 +1,23 @@ +package com.matthewyao.designpattern.chain; + +/** + * Created by yaokuan on 2018/6/2. + */ +public abstract class Leader { + private Leader successor; + + public Leader(Leader successor) { + this.successor = successor; + } + + public Leader getSuccessor() { + return successor; + } + + public abstract void handleRequest(Reimbursement reimbursement); + + public void approve(String role, Reimbursement reimbursement) { + System.out.println(String.format("%s has approved %s's reimbursement, money: $%s", role, + reimbursement.getUsername(), reimbursement.getMoney())); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/chain/ProjectManager.java b/src/main/java/com/matthewyao/designpattern/chain/ProjectManager.java new file mode 100644 index 0000000..ced5f5a --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/chain/ProjectManager.java @@ -0,0 +1,22 @@ +package com.matthewyao.designpattern.chain; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class ProjectManager extends Leader { + + public ProjectManager(Leader successor) { + super(successor); + } + + @Override + public void handleRequest(Reimbursement reimbursement) { + int money = reimbursement.getMoney(); + if (money <= 500) { + approve("Project manager", reimbursement); + }else { + Leader successor = getSuccessor(); + successor.handleRequest(reimbursement); + } + } +} diff --git a/src/main/java/com/matthewyao/designpattern/chain/Reimbursement.java b/src/main/java/com/matthewyao/designpattern/chain/Reimbursement.java new file mode 100644 index 0000000..945146c --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/chain/Reimbursement.java @@ -0,0 +1,23 @@ +package com.matthewyao.designpattern.chain; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Reimbursement { + //Reimbursement: 报销单 + private String username; + private int money; + + public Reimbursement(String username, int money) { + this.username = username; + this.money = money; + } + + public String getUsername() { + return username; + } + + public int getMoney() { + return money; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/command/Client.java b/src/main/java/com/matthewyao/designpattern/command/Client.java new file mode 100644 index 0000000..fd1582e --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/command/Client.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.command; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + public static void main(String[] args) { + TV myTv = new TV(); + + Command commandOn = new CommandOn(myTv); + Command commandOff = new CommandOff(myTv); + CommandChangeChannel commandChangeChannel = new CommandChangeChannel(myTv); + + Control control = new Control(commandOn, commandOff, commandChangeChannel); + control.turnOnTv(); + control.changeChannel(5); + control.changeChannel(34); + control.turnOffTv(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/command/Command.java b/src/main/java/com/matthewyao/designpattern/command/Command.java new file mode 100644 index 0000000..9237fa4 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/command/Command.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.command; + +/** + * Created by yaokuan on 2018/6/9. + */ +public interface Command { + void execute(); +} diff --git a/src/main/java/com/matthewyao/designpattern/command/CommandChangeChannel.java b/src/main/java/com/matthewyao/designpattern/command/CommandChangeChannel.java new file mode 100644 index 0000000..dc87905 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/command/CommandChangeChannel.java @@ -0,0 +1,23 @@ +package com.matthewyao.designpattern.command; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class CommandChangeChannel implements Command { + + private TV tv; + private int channel; + + public CommandChangeChannel(TV tv) { + this.tv = tv; + } + + public void setChannel(int channel) { + this.channel = channel; + } + + @Override + public void execute() { + tv.changeChannel(channel); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/command/CommandOff.java b/src/main/java/com/matthewyao/designpattern/command/CommandOff.java new file mode 100644 index 0000000..a38ebe1 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/command/CommandOff.java @@ -0,0 +1,18 @@ +package com.matthewyao.designpattern.command; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class CommandOff implements Command { + + private TV tv; + + public CommandOff(TV tv) { + this.tv = tv; + } + + @Override + public void execute() { + tv.turnOff(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/command/CommandOn.java b/src/main/java/com/matthewyao/designpattern/command/CommandOn.java new file mode 100644 index 0000000..2bf8b10 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/command/CommandOn.java @@ -0,0 +1,18 @@ +package com.matthewyao.designpattern.command; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class CommandOn implements Command { + + private TV tv; + + public CommandOn(TV tv) { + this.tv = tv; + } + + @Override + public void execute() { + tv.trunOn(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/command/Control.java b/src/main/java/com/matthewyao/designpattern/command/Control.java new file mode 100644 index 0000000..657b0d5 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/command/Control.java @@ -0,0 +1,28 @@ +package com.matthewyao.designpattern.command; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Control { + private Command commandOn, commandOff; + private CommandChangeChannel commandChangeChannel; + + public Control(Command commandOn, Command commandOff, CommandChangeChannel commandChangeChannel) { + this.commandOn = commandOn; + this.commandOff = commandOff; + this.commandChangeChannel = commandChangeChannel; + } + + public void turnOnTv() { + commandOn.execute(); + } + + public void turnOffTv() { + commandOff.execute(); + } + + public void changeChannel(int channel) { + commandChangeChannel.setChannel(channel); + commandChangeChannel.execute(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/command/TV.java b/src/main/java/com/matthewyao/designpattern/command/TV.java new file mode 100644 index 0000000..8e66db6 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/command/TV.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.command; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class TV { + private int channel = 0; + + public void trunOn() { + System.out.println("Turn on the tv."); + } + + public void turnOff() { + System.out.println("Turn off the tv."); + } + + public void changeChannel(int channel) { + this.channel = channel; + System.out.println("Now the channel is: " + channel); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/composite/Client.java b/src/main/java/com/matthewyao/designpattern/composite/Client.java new file mode 100644 index 0000000..176f865 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/composite/Client.java @@ -0,0 +1,31 @@ +package com.matthewyao.designpattern.composite; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Client { + public static void main(String[] args) { + /** Step 1.Initial root folder */ + Folder root = new Folder("Root folder"); + root.addFile(new VideoFile("Get started.mp4")); + + Folder imageFolder = new Folder("Images folder"); + imageFolder.addFile(new ImageFile("1.jpg")); + imageFolder.addFile(new ImageFile("2.jpg")); + ImageFile image3 = new ImageFile("3.jpg"); + imageFolder.addFile(image3); + + Folder studyFolder = new Folder("Study folder"); + studyFolder.addFile(new TextFile("Python guide.txt")); + studyFolder.addFile(new TextFile("Thinking in Java.txt.txt")); + + root.addFile(imageFolder); + root.addFile(studyFolder); + + /** Step 2.Remove image file: 3.jpg, Add text file: Head first php.txt */ +// imageFolder.removeFile(image3); +// studyFolder.addFile(new TextFile("Head first php.txt")); + + root.display(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/composite/File.java b/src/main/java/com/matthewyao/designpattern/composite/File.java new file mode 100644 index 0000000..7302b37 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/composite/File.java @@ -0,0 +1,22 @@ +package com.matthewyao.designpattern.composite; + +/** + * Created by yaokuan on 2018/6/2. + */ +public abstract class File { + private String name; + + public File(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public abstract void display(); +} diff --git a/src/main/java/com/matthewyao/designpattern/composite/Folder.java b/src/main/java/com/matthewyao/designpattern/composite/Folder.java new file mode 100644 index 0000000..cc3f39f --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/composite/Folder.java @@ -0,0 +1,34 @@ +package com.matthewyao.designpattern.composite; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Folder extends File { + + private List files; + + public Folder(String name) { + super(name); + //新创建的文件夹应该是“空”的 + this.files = new ArrayList(); + } + + @Override + public void display() { + System.out.println(getName()); + for (File file : files) { + file.display(); + } + } + + public void addFile(File file){ + files.add(file); + } + + public void removeFile(File file) { + files.remove(file); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/composite/ImageFile.java b/src/main/java/com/matthewyao/designpattern/composite/ImageFile.java new file mode 100644 index 0000000..d08bade --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/composite/ImageFile.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.composite; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class ImageFile extends File { + + public ImageFile(String name) { + super(name); + } + + @Override + public void display() { + System.out.println("Image file: " + getName()); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/composite/TextFile.java b/src/main/java/com/matthewyao/designpattern/composite/TextFile.java new file mode 100644 index 0000000..0dbc316 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/composite/TextFile.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.composite; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class TextFile extends File { + + public TextFile(String name) { + super(name); + } + + @Override + public void display() { + System.out.println("Text file: " + getName()); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/composite/VideoFile.java b/src/main/java/com/matthewyao/designpattern/composite/VideoFile.java new file mode 100644 index 0000000..1b3607f --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/composite/VideoFile.java @@ -0,0 +1,15 @@ +package com.matthewyao.designpattern.composite; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class VideoFile extends File { + public VideoFile(String name) { + super(name); + } + + @Override + public void display() { + System.out.println("Video file: " + getName()); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/decorate/AppleDecorator.java b/src/main/java/com/matthewyao/designpattern/decorate/AppleDecorator.java index 57ed3d3..f3ede43 100644 --- a/src/main/java/com/matthewyao/designpattern/decorate/AppleDecorator.java +++ b/src/main/java/com/matthewyao/designpattern/decorate/AppleDecorator.java @@ -18,6 +18,6 @@ protected String getName() { @Override protected double getPrice() { - return salad.getPrice() + 5; + return salad.getPrice() + 4.5; } } diff --git a/src/main/java/com/matthewyao/designpattern/decorate/EggDecorator.java b/src/main/java/com/matthewyao/designpattern/decorate/EggDecorator.java index b0534d6..2205dee 100644 --- a/src/main/java/com/matthewyao/designpattern/decorate/EggDecorator.java +++ b/src/main/java/com/matthewyao/designpattern/decorate/EggDecorator.java @@ -18,6 +18,6 @@ protected String getName() { @Override protected double getPrice() { - return salad.getPrice() + 3; + return salad.getPrice() + 2.5; } } diff --git a/src/main/java/com/matthewyao/designpattern/decorate/Test.java b/src/main/java/com/matthewyao/designpattern/decorate/Test.java index 44dcb58..e8d7084 100644 --- a/src/main/java/com/matthewyao/designpattern/decorate/Test.java +++ b/src/main/java/com/matthewyao/designpattern/decorate/Test.java @@ -23,6 +23,6 @@ public static void main(String[] args) { } private static void print(Salad salad) { - System.out.println(salad.getName() +" 一共: " + salad.getPrice() + "元," + salad.getDesc()); + System.out.println(salad.getName() +" 总计: " + salad.getPrice() + "元"); } } diff --git a/src/main/java/com/matthewyao/designpattern/flyweight/Client.java b/src/main/java/com/matthewyao/designpattern/flyweight/Client.java new file mode 100644 index 0000000..9b8c0db --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/flyweight/Client.java @@ -0,0 +1,26 @@ +package com.matthewyao.designpattern.flyweight; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Client { + public static void main(String[] args) { + FlyweightFactory factory = new FlyweightFactory(); + Flyweight fw1, fw2, fw3, fw4, fw5, fw6; + + fw1 = factory.getFlyweight("Google"); + fw2 = factory.getFlyweight("google"); + fw3 = factory.getFlyweight("Google"); + fw4 = factory.getFlyweight("Gooogle"); + fw5 = factory.getFlyweight("Google"); + fw6 = factory.getFlyweight("google"); + + fw1.operation(); + fw2.operation(); + fw3.operation(); + fw4.operation(); + fw5.operation(); + fw6.operation(); + System.out.println("Total flyweight size: " + factory.getFlyweightSize()); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/flyweight/ConcreteFlyweight.java b/src/main/java/com/matthewyao/designpattern/flyweight/ConcreteFlyweight.java new file mode 100644 index 0000000..b7a4b0d --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/flyweight/ConcreteFlyweight.java @@ -0,0 +1,18 @@ +package com.matthewyao.designpattern.flyweight; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class ConcreteFlyweight extends Flyweight { + + private String str;//假设这里的享元是一个字符串 + + public ConcreteFlyweight(String str) { + this.str = str; + } + + @Override + public void operation() { + System.out.println("Concrete flyweight: " + str); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/flyweight/Flyweight.java b/src/main/java/com/matthewyao/designpattern/flyweight/Flyweight.java new file mode 100644 index 0000000..b6ff527 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/flyweight/Flyweight.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.flyweight; + +/** + * Created by yaokuan on 2018/6/2. + */ +public abstract class Flyweight { + public abstract void operation(); +} diff --git a/src/main/java/com/matthewyao/designpattern/flyweight/FlyweightFactory.java b/src/main/java/com/matthewyao/designpattern/flyweight/FlyweightFactory.java new file mode 100644 index 0000000..dc58921 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/flyweight/FlyweightFactory.java @@ -0,0 +1,27 @@ +package com.matthewyao.designpattern.flyweight; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class FlyweightFactory { + private Map flyweights = new HashMap(); + + public FlyweightFactory() { + } + + public Flyweight getFlyweight(String str) { + Flyweight flyweight = flyweights.get(str); + if (flyweight == null) { + flyweight = new ConcreteFlyweight(str); + flyweights.put(str, flyweight); + } + return flyweight; + } + + public int getFlyweightSize() { + return flyweights.size(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/intepreter/AndExpression.java b/src/main/java/com/matthewyao/designpattern/intepreter/AndExpression.java new file mode 100644 index 0000000..d2029fa --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/intepreter/AndExpression.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.intepreter; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class AndExpression implements Expression { + + private Expression expr1 = null; + private Expression expr2 = null; + + public AndExpression(Expression expr1, Expression expr2) { + this.expr1 = expr1; + this.expr2 = expr2; + } + + @Override + public boolean interpret(String context) { + return expr1.interpret(context) && expr2.interpret(context); + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/intepreter/Client.java b/src/main/java/com/matthewyao/designpattern/intepreter/Client.java new file mode 100644 index 0000000..18e02aa --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/intepreter/Client.java @@ -0,0 +1,30 @@ +package com.matthewyao.designpattern.intepreter; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + + //规则:Robert 和 John 是男性 + public static Expression getMaleExpression(){ + Expression robert = new TerminalExpression("Robert"); + Expression john = new TerminalExpression("John"); + return new OrExpression(robert, john); + } + + //规则:Julie 是一个已婚的女性 + public static Expression getMarriedWomanExpression(){ + Expression julie = new TerminalExpression("Julie"); + Expression married = new TerminalExpression("Married"); + return new AndExpression(julie, married); + } + + public static void main(String[] args) { + Expression isMale = getMaleExpression(); + Expression isMarriedWoman = getMarriedWomanExpression(); + + System.out.println("John is male? " + isMale.interpret("John")); + System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie")); + System.out.println("Tom is male? " + isMale.interpret("Tom")); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/intepreter/Expression.java b/src/main/java/com/matthewyao/designpattern/intepreter/Expression.java new file mode 100644 index 0000000..9fad432 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/intepreter/Expression.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.intepreter; + +/** + * Created by yaokuan on 2018/6/9. + */ +public interface Expression { + boolean interpret(String context); +} diff --git a/src/main/java/com/matthewyao/designpattern/intepreter/OrExpression.java b/src/main/java/com/matthewyao/designpattern/intepreter/OrExpression.java new file mode 100644 index 0000000..9372996 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/intepreter/OrExpression.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.intepreter; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class OrExpression implements Expression { + + private Expression expr1 = null; + private Expression expr2 = null; + + public OrExpression(Expression expr1, Expression expr2) { + this.expr1 = expr1; + this.expr2 = expr2; + } + + @Override + public boolean interpret(String context) { + return expr1.interpret(context) || expr2.interpret(context); + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/intepreter/TerminalExpression.java b/src/main/java/com/matthewyao/designpattern/intepreter/TerminalExpression.java new file mode 100644 index 0000000..49ebad7 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/intepreter/TerminalExpression.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.intepreter; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class TerminalExpression implements Expression { + + private String data; + + public TerminalExpression(String data){ + this.data = data; + } + + @Override + public boolean interpret(String context) { + if(context.contains(data)){ + return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/iterator/Aggregate.java b/src/main/java/com/matthewyao/designpattern/iterator/Aggregate.java new file mode 100644 index 0000000..3c8cbe9 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/iterator/Aggregate.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.iterator; + +/** + * Created by yaokuan on 2018/6/9. + */ +public interface Aggregate { + Iterator iterator(); +} diff --git a/src/main/java/com/matthewyao/designpattern/iterator/Client.java b/src/main/java/com/matthewyao/designpattern/iterator/Client.java new file mode 100644 index 0000000..b9308f8 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/iterator/Client.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.iterator; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + public static void main(String[] args) { + Object[] objects = new Object[]{"Hello", "world", "I", "am", "Java"}; + MyCollection myCollection = new MyCollection(objects); + Iterator its = myCollection.iterator(); + while (its.hasNext()) { + Object next = its.next(); + System.out.print(next); + System.out.print(" "); + } + System.out.println(); + + System.out.println(its.first()); + System.out.println(its.last()); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/iterator/Iterator.java b/src/main/java/com/matthewyao/designpattern/iterator/Iterator.java new file mode 100644 index 0000000..25585c1 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/iterator/Iterator.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.iterator; + +/** + * Created by yaokuan on 2018/6/9. + */ +public interface Iterator { + Object first(); + + Object last(); + + Object next(); + + boolean hasNext(); +} diff --git a/src/main/java/com/matthewyao/designpattern/iterator/MyCollection.java b/src/main/java/com/matthewyao/designpattern/iterator/MyCollection.java new file mode 100644 index 0000000..411a07c --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/iterator/MyCollection.java @@ -0,0 +1,57 @@ +package com.matthewyao.designpattern.iterator; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class MyCollection implements Aggregate { + + private Object[] objects = null; + + public MyCollection(Object[] objects) { + this.objects = objects; + } + + public int size() { + return objects == null ? 0 : objects.length; + } + + @Override + public Iterator iterator() { + return new MyIterator(); + } + + private class MyIterator implements Iterator{ + + private int index; + private int size; + + public MyIterator() { + this.index = 0; + this.size = objects == null ? 0 : objects.length; + } + + @Override + public Object first() { + return objects == null ? null : objects[0]; + } + + @Override + public Object last() { + return objects == null ? null : objects[size - 1]; + } + + @Override + public Object next() { + if (index >= 0 && index < size) { + return objects[index++]; + }else { + return null; + } + } + + @Override + public boolean hasNext() { + return index < size; + } + } +} diff --git a/src/main/java/com/matthewyao/designpattern/mediator/ChatRoom.java b/src/main/java/com/matthewyao/designpattern/mediator/ChatRoom.java new file mode 100644 index 0000000..a0dc221 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/mediator/ChatRoom.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.mediator; + +import java.util.Date; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class ChatRoom { + public void pushMessage(String message, User user) { + System.out.println(String.format("%s [%s]: %s", new Date().toString(), user.getName(), message)); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/mediator/Client.java b/src/main/java/com/matthewyao/designpattern/mediator/Client.java new file mode 100644 index 0000000..cd53715 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/mediator/Client.java @@ -0,0 +1,22 @@ +package com.matthewyao.designpattern.mediator; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + public static void main(String[] args) { + ChatRoom chatRoom = new ChatRoom(); + User john = new User("John"); + User tom = new User("Tom"); + john.enterChatRoom(chatRoom); + tom.enterChatRoom(chatRoom); + + john.sendMessage("Hello tom!"); + tom.sendMessage("Hi John, how are u today?"); + john.sendMessage("Never mention about it, I've been fired."); + tom.sendMessage("Don't be so sad, I believe you can find a better one!"); + john.sendMessage("Thanks, yours words really help!"); + john.sendMessage("I'm gonna have a drink and forget about it, bye."); + tom.sendMessage("Ok, See u."); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/mediator/User.java b/src/main/java/com/matthewyao/designpattern/mediator/User.java new file mode 100644 index 0000000..0e245b8 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/mediator/User.java @@ -0,0 +1,25 @@ +package com.matthewyao.designpattern.mediator; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class User { + private String name; + private ChatRoom chatRoom; + + public String getName() { + return name; + } + + public User(String name) { + this.name = name; + } + + public void enterChatRoom(ChatRoom chatRoom) { + this.chatRoom = chatRoom; + } + + public void sendMessage(String message) { + chatRoom.pushMessage(message, this); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/memento/CareTaker.java b/src/main/java/com/matthewyao/designpattern/memento/CareTaker.java new file mode 100644 index 0000000..d28c2ef --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/memento/CareTaker.java @@ -0,0 +1,19 @@ +package com.matthewyao.designpattern.memento; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class CareTaker { + private List mementoList = new ArrayList(); + + public void saveState(Memento state) { + mementoList.add(state); + } + + public Memento get(int index) { + return mementoList.get(index); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/memento/Client.java b/src/main/java/com/matthewyao/designpattern/memento/Client.java new file mode 100644 index 0000000..035f1b9 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/memento/Client.java @@ -0,0 +1,40 @@ +package com.matthewyao.designpattern.memento; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + public static void main(String[] args) { + Originator originator = new Originator(); + CareTaker careTaker = new CareTaker(); + originator.setState("#1"); + printCurrentState(originator); + + originator.setState("#2"); + printCurrentState(originator); + careTaker.saveState(originator.saveStateToMemen()); + + originator.setState("#3"); + printCurrentState(originator); + careTaker.saveState(originator.saveStateToMemen()); + + originator.setState("#4"); + printCurrentState(originator); + //restore to savepoint 0 + originator.restoreStateFromMemto(careTaker.get(0)); + System.out.println("Restore to state:" + originator.getState()); + //proceeding + originator.setState("#5"); + printCurrentState(originator); + //restore to savepoint 1 + originator.restoreStateFromMemto(careTaker.get(1)); + System.out.println("Restore to state: " + originator.getState()); + + originator.setState("#6"); + printCurrentState(originator); + } + + private static void printCurrentState(Originator originator) { + System.out.println("Current state: " + originator.getState()); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/memento/Memento.java b/src/main/java/com/matthewyao/designpattern/memento/Memento.java new file mode 100644 index 0000000..63d9112 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/memento/Memento.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.memento; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Memento { + private String state; + + public Memento(String state) { + this.state = state; + } + + public String getState() { + return state; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/memento/Originator.java b/src/main/java/com/matthewyao/designpattern/memento/Originator.java new file mode 100644 index 0000000..f378629 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/memento/Originator.java @@ -0,0 +1,24 @@ +package com.matthewyao.designpattern.memento; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Originator { + private String state; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Memento saveStateToMemen() { + return new Memento(state); + } + + public void restoreStateFromMemto(Memento memento) { + state = memento.getState(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/observer/Client.java b/src/main/java/com/matthewyao/designpattern/observer/Client.java new file mode 100644 index 0000000..2efdb28 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/observer/Client.java @@ -0,0 +1,23 @@ +package com.matthewyao.designpattern.observer; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + public static void main(String[] args) { + Transporter transporter = new Transporter(); + Police police = new Police(); + Security security = new Security(); + Thief thief = new Thief(); + + transporter.addWatcher(police); + transporter.addWatcher(security); + transporter.addWatcher(thief); + transporter.notifyWatchers(); + + System.out.println("强盗发现前有保镖,后有警察,决定撤退"); + System.out.println(); + transporter.removeWatcher(thief); + transporter.notifyWatchers(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/observer/Police.java b/src/main/java/com/matthewyao/designpattern/observer/Police.java new file mode 100644 index 0000000..26b8e1e --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/observer/Police.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.observer; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Police implements Watcher { + @Override + public void update() { + System.out.println("运输车有行动,警察护航"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/observer/Security.java b/src/main/java/com/matthewyao/designpattern/observer/Security.java new file mode 100644 index 0000000..60c634b --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/observer/Security.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.observer; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Security implements Watcher { + @Override + public void update() { + System.out.println("运输车有行动,保安贴身保护"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/observer/Thief.java b/src/main/java/com/matthewyao/designpattern/observer/Thief.java new file mode 100644 index 0000000..45d4c99 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/observer/Thief.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.observer; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Thief implements Watcher { + @Override + public void update() { + System.out.println("运输车有行动,强盗准备动手"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/observer/Transporter.java b/src/main/java/com/matthewyao/designpattern/observer/Transporter.java new file mode 100644 index 0000000..642988b --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/observer/Transporter.java @@ -0,0 +1,30 @@ +package com.matthewyao.designpattern.observer; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Transporter implements Watched { + + private List watchers = new ArrayList(); + + @Override + public void addWatcher(Watcher watcher) { + watchers.add(watcher); + } + + @Override + public void removeWatcher(Watcher watcher) { + watchers.remove(watcher); + } + + @Override + public void notifyWatchers() { + System.out.println("运输车开动..."); + for (Watcher watcher : watchers) { + watcher.update(); + } + } +} diff --git a/src/main/java/com/matthewyao/designpattern/observer/Watched.java b/src/main/java/com/matthewyao/designpattern/observer/Watched.java new file mode 100644 index 0000000..374b60f --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/observer/Watched.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.observer; + +/** + * Created by yaokuan on 2018/6/9. + */ +public interface Watched { + void addWatcher(Watcher watcher); + + void removeWatcher(Watcher watcher); + + void notifyWatchers(); +} diff --git a/src/main/java/com/matthewyao/designpattern/observer/Watcher.java b/src/main/java/com/matthewyao/designpattern/observer/Watcher.java new file mode 100644 index 0000000..ef1d77a --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/observer/Watcher.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.observer; + +/** + * Created by yaokuan on 2018/6/9. + */ +public interface Watcher { + void update(); +} diff --git a/src/main/java/com/matthewyao/designpattern/prototype/Client.java b/src/main/java/com/matthewyao/designpattern/prototype/Client.java new file mode 100644 index 0000000..5e78d23 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/prototype/Client.java @@ -0,0 +1,18 @@ +package com.matthewyao.designpattern.prototype; + +/** + * Created by yaokuan on 2018/5/13. + */ +public class Client { + public static void main(String[] args) { + ConcretePrototypeA cpa = new ConcretePrototypeA(); + ConcretePrototypeB cpb = new ConcretePrototypeB(); + for (int i=1; i<=5; i++) { + ConcretePrototypeA cpac = (ConcretePrototypeA)cpa.clone(); + cpac.show(); + ConcretePrototypeB cpbc = (ConcretePrototypeB)cpb.clone(); + cpbc.show(); + } + + } +} diff --git a/src/main/java/com/matthewyao/designpattern/prototype/ConcretePrototypeA.java b/src/main/java/com/matthewyao/designpattern/prototype/ConcretePrototypeA.java new file mode 100644 index 0000000..ee2d8c2 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/prototype/ConcretePrototypeA.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.prototype; + +/** + * Created by yaokuan on 2018/5/13. + */ +public class ConcretePrototypeA extends Prototype { + + @Override + public void show() { + System.out.println("concrete prototype a is created"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/prototype/ConcretePrototypeB.java b/src/main/java/com/matthewyao/designpattern/prototype/ConcretePrototypeB.java new file mode 100644 index 0000000..ad71e5c --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/prototype/ConcretePrototypeB.java @@ -0,0 +1,12 @@ +package com.matthewyao.designpattern.prototype; + +/** + * Created by yaokuan on 2018/5/13. + */ +public class ConcretePrototypeB extends Prototype { + + @Override + public void show() { + System.out.println("concrete prototype b is created"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/prototype/Prototype.java b/src/main/java/com/matthewyao/designpattern/prototype/Prototype.java new file mode 100644 index 0000000..9101d64 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/prototype/Prototype.java @@ -0,0 +1,19 @@ +package com.matthewyao.designpattern.prototype; + +/** + * Created by yaokuan on 2018/5/13. + */ +public abstract class Prototype implements Cloneable { + + public Prototype clone() { + Prototype prototype = null; + try { + prototype = (Prototype) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + return prototype; + } + + public abstract void show(); +} diff --git a/src/main/java/com/matthewyao/designpattern/proxyPattern/BuySomething.java b/src/main/java/com/matthewyao/designpattern/proxyPattern/BuySomething.java new file mode 100644 index 0000000..fbc8414 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/proxyPattern/BuySomething.java @@ -0,0 +1,9 @@ +package com.matthewyao.designpattern.proxyPattern; + +/** + * Created by yaokuan on 2018/6/2. + */ +public interface BuySomething { + void buyBMW(); + void buyBenz(); +} diff --git a/src/main/java/com/matthewyao/designpattern/proxyPattern/Client.java b/src/main/java/com/matthewyao/designpattern/proxyPattern/Client.java new file mode 100644 index 0000000..8b8d86b --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/proxyPattern/Client.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.proxyPattern; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Client { + public static void main(String[] args) { + People me = new People(); + Proxy proxy = new Proxy(me); + System.out.println("One day"); + proxy.buyBMW(); + System.out.println(); + System.out.println("After a few days"); + proxy.buyBenz(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/proxyPattern/People.java b/src/main/java/com/matthewyao/designpattern/proxyPattern/People.java new file mode 100644 index 0000000..4b9bc8e --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/proxyPattern/People.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.proxyPattern; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class People implements BuySomething { + @Override + public void buyBMW() { + System.out.println("I want to buy a BMW, but I don't know how, so I find the proxy"); + } + + @Override + public void buyBenz() { + System.out.println("I want to buy a Benz, I find the proxy again"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/proxyPattern/Proxy.java b/src/main/java/com/matthewyao/designpattern/proxyPattern/Proxy.java new file mode 100644 index 0000000..2cb66ba --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/proxyPattern/Proxy.java @@ -0,0 +1,32 @@ +package com.matthewyao.designpattern.proxyPattern; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Proxy implements BuySomething { + + private People people; + + public Proxy(People people) { + this.people = people; + } + + @Override + public void buyBMW() { + people.buyBMW(); + doProxy("BMW"); + } + + @Override + public void buyBenz() { + people.buyBenz(); + doProxy("Benz"); + } + + private void doProxy(String carName) { + System.out.println("Proxy booking a "+ carName +"..."); + System.out.println("Proxy Receive the car"); + System.out.println("Proxy send the car to my place..."); + System.out.println("I received my car!"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/single/LazySingleton.java b/src/main/java/com/matthewyao/designpattern/single/LazySingleton.java new file mode 100644 index 0000000..523eb19 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/single/LazySingleton.java @@ -0,0 +1,24 @@ +package com.matthewyao.designpattern.single; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class LazySingleton { + + public LazySingleton() { + System.out.println("init LazySingleton"); + } + + private static class LazyHolder { + public static final LazySingleton SINGLETON = new LazySingleton(); + } + + public static LazySingleton getSingleton() { + System.out.println("getSingleton"); + return LazyHolder.SINGLETON; + } + + public static void main(String[] args) { + LazySingleton.getSingleton(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/single/StarveSingleton.java b/src/main/java/com/matthewyao/designpattern/single/StarveSingleton.java new file mode 100644 index 0000000..c244e18 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/single/StarveSingleton.java @@ -0,0 +1,13 @@ +package com.matthewyao.designpattern.single; + +/** + * Created by yaokuan on 2018/5/5. + */ +public class StarveSingleton { + + private static StarveSingleton singleton = new StarveSingleton(); + + public static StarveSingleton getSingleton() { + return singleton; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/state/Client.java b/src/main/java/com/matthewyao/designpattern/state/Client.java new file mode 100644 index 0000000..8df16dc --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/state/Client.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.state; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + public static void main(String[] args) { + Context context = new Context(); + + StartState startState = new StartState(); + startState.doAction(context); + + System.out.println("Context state: " + context.getState().toString()); + + StopState stopState = new StopState(); + stopState.doAction(context); + + System.out.println("Context state: " + context.getState().toString()); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/state/Context.java b/src/main/java/com/matthewyao/designpattern/state/Context.java new file mode 100644 index 0000000..2df7039 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/state/Context.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.state; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Context { + private State state; + + public Context() { + state = null; + } + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/state/StartState.java b/src/main/java/com/matthewyao/designpattern/state/StartState.java new file mode 100644 index 0000000..81a2ae5 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/state/StartState.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.state; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class StartState implements State { + @Override + public void doAction(Context context) { + System.out.println("Player is in start state"); + context.setState(this); + } + + public String toString() { + return "Start State"; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/state/State.java b/src/main/java/com/matthewyao/designpattern/state/State.java new file mode 100644 index 0000000..0023e7b --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/state/State.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.state; + +/** + * Created by yaokuan on 2018/6/9. + */ +public interface State { + void doAction(Context context); +} diff --git a/src/main/java/com/matthewyao/designpattern/state/StopState.java b/src/main/java/com/matthewyao/designpattern/state/StopState.java new file mode 100644 index 0000000..54a9ee5 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/state/StopState.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.state; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class StopState implements State { + @Override + public void doAction(Context context) { + System.out.println("Player is in stop state"); + context.setState(this); + } + + public String toString() { + return "Stop State"; + } +} diff --git a/src/main/java/com/matthewyao/designpattern/strategy/BackDoor.java b/src/main/java/com/matthewyao/designpattern/strategy/BackDoor.java new file mode 100644 index 0000000..6fafb75 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/strategy/BackDoor.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.strategy; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class BackDoor implements IStrategy { + @Override + public void operate() { + System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/strategy/BlockEnemy.java b/src/main/java/com/matthewyao/designpattern/strategy/BlockEnemy.java new file mode 100644 index 0000000..e7abcba --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/strategy/BlockEnemy.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.strategy; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class BlockEnemy implements IStrategy { + @Override + public void operate() { + System.out.println("孙夫人断后,挡住追兵"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/strategy/Context.java b/src/main/java/com/matthewyao/designpattern/strategy/Context.java new file mode 100644 index 0000000..5e7e603 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/strategy/Context.java @@ -0,0 +1,16 @@ +package com.matthewyao.designpattern.strategy; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Context { + private IStrategy strategy; + + public void setStrategy(IStrategy strategy) { + this.strategy = strategy; + } + + public void operate() { + strategy.operate(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/strategy/GivenGreenLight.java b/src/main/java/com/matthewyao/designpattern/strategy/GivenGreenLight.java new file mode 100644 index 0000000..ae85829 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/strategy/GivenGreenLight.java @@ -0,0 +1,11 @@ +package com.matthewyao.designpattern.strategy; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class GivenGreenLight implements IStrategy { + @Override + public void operate() { + System.out.println("求吴国太开个绿灯,放行"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/strategy/IStrategy.java b/src/main/java/com/matthewyao/designpattern/strategy/IStrategy.java new file mode 100644 index 0000000..e209588 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/strategy/IStrategy.java @@ -0,0 +1,8 @@ +package com.matthewyao.designpattern.strategy; + +/** + * Created by yaokuan on 2018/6/2. + */ +public interface IStrategy { + void operate(); +} diff --git a/src/main/java/com/matthewyao/designpattern/strategy/Zhaoyun.java b/src/main/java/com/matthewyao/designpattern/strategy/Zhaoyun.java new file mode 100644 index 0000000..8b395c7 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/strategy/Zhaoyun.java @@ -0,0 +1,26 @@ +package com.matthewyao.designpattern.strategy; + +/** + * Created by yaokuan on 2018/6/2. + */ +public class Zhaoyun { + public static void main(String[] args) { + Context liubeiMarry = new Context(); + + System.out.println("----------刚到吴国使用第一个锦囊---------------"); + liubeiMarry.setStrategy(new BackDoor()); + liubeiMarry.operate(); + System.out.println(); + + System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------"); + liubeiMarry.setStrategy(new GivenGreenLight()); + liubeiMarry.operate(); + System.out.println(); + + + System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------"); + liubeiMarry.setStrategy(new BlockEnemy()); + liubeiMarry.operate(); + System.out.println(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/template/AbstractPerson.java b/src/main/java/com/matthewyao/designpattern/template/AbstractPerson.java new file mode 100644 index 0000000..76b43f4 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/template/AbstractPerson.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.template; + +/** + * Created by yaokuan on 2018/6/6. + */ +public abstract class AbstractPerson { + //final修饰防止被修改 + public final void spendAfternoon() { + getUp(); + eatBreakfast(); + goToWork(); + System.out.println(); + } + + public abstract void getUp(); + + public abstract void eatBreakfast(); + + public abstract void goToWork(); + +} diff --git a/src/main/java/com/matthewyao/designpattern/template/Children.java b/src/main/java/com/matthewyao/designpattern/template/Children.java new file mode 100644 index 0000000..b56712c --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/template/Children.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.template; + +/** + * Created by yaokuan on 2018/6/6. + */ +public class Children extends AbstractPerson { + @Override + public void getUp() { + System.out.println("被妈妈叫起来、换衣服"); + } + + @Override + public void eatBreakfast() { + System.out.println("吃妈妈做的爱心早餐"); + } + + @Override + public void goToWork() { + System.out.println("坐校车去上学"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/template/Client.java b/src/main/java/com/matthewyao/designpattern/template/Client.java new file mode 100644 index 0000000..c4efec1 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/template/Client.java @@ -0,0 +1,20 @@ +package com.matthewyao.designpattern.template; + +/** + * Created by yaokuan on 2018/6/6. + */ +public class Client { + public static void main(String[] args) { + Teacher teacher = new Teacher(); + System.out.println("老师如果度过上午:"); + teacher.spendAfternoon(); + + Programmer programmer = new Programmer(); + System.out.println("程序员如果度过上午:"); + programmer.spendAfternoon(); + + Children children = new Children(); + System.out.println("小孩如果度过上午:"); + children.spendAfternoon(); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/template/Programmer.java b/src/main/java/com/matthewyao/designpattern/template/Programmer.java new file mode 100644 index 0000000..de80881 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/template/Programmer.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.template; + +/** + * Created by yaokuan on 2018/6/6. + */ +public class Programmer extends AbstractPerson { + @Override + public void getUp() { + System.out.println("玩手机、刷牙"); + } + + @Override + public void eatBreakfast() { + System.out.println("随便吃一点"); + } + + @Override + public void goToWork() { + System.out.println("肯定是挤地铁去上班啊"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/template/Teacher.java b/src/main/java/com/matthewyao/designpattern/template/Teacher.java new file mode 100644 index 0000000..9cb13fe --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/template/Teacher.java @@ -0,0 +1,21 @@ +package com.matthewyao.designpattern.template; + +/** + * Created by yaokuan on 2018/6/6. + */ +public class Teacher extends AbstractPerson { + @Override + public void getUp() { + System.out.println("洗漱、换衣服"); + } + + @Override + public void eatBreakfast() { + System.out.println("吃了:面包+鸡蛋"); + } + + @Override + public void goToWork() { + System.out.println("开车去学校"); + } +} diff --git a/src/main/java/com/matthewyao/designpattern/visitor/Client.java b/src/main/java/com/matthewyao/designpattern/visitor/Client.java new file mode 100644 index 0000000..ae93033 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/visitor/Client.java @@ -0,0 +1,15 @@ +package com.matthewyao.designpattern.visitor; + +import java.util.List; + +/** + * Created by yaokuan on 2018/6/9. + */ +public class Client { + public static void main(String[] args){ + List list = ObjectStruture.getList(); + for(Element e: list){ + e.accept(new Visitor()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/visitor/ConcreteElement1.java b/src/main/java/com/matthewyao/designpattern/visitor/ConcreteElement1.java new file mode 100644 index 0000000..75d74ee --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/visitor/ConcreteElement1.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.visitor; + +/** + * Created by yaokuan on 2018/6/9. + */ +class ConcreteElement1 extends Element { + public void doSomething(){ + System.out.println("这是元素1"); + } + + public void accept(IVisitor visitor) { + visitor.visit(this); + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/visitor/ConcreteElement2.java b/src/main/java/com/matthewyao/designpattern/visitor/ConcreteElement2.java new file mode 100644 index 0000000..ac75b4a --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/visitor/ConcreteElement2.java @@ -0,0 +1,14 @@ +package com.matthewyao.designpattern.visitor; + +/** + * Created by yaokuan on 2018/6/9. + */ +class ConcreteElement2 extends Element { + public void doSomething(){ + System.out.println("这是元素2"); + } + + public void accept(IVisitor visitor) { + visitor.visit(this); + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/visitor/Element.java b/src/main/java/com/matthewyao/designpattern/visitor/Element.java new file mode 100644 index 0000000..4445a11 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/visitor/Element.java @@ -0,0 +1,9 @@ +package com.matthewyao.designpattern.visitor; + +/** + * Created by yaokuan on 2018/6/9. + */ +abstract class Element { + public abstract void accept(IVisitor visitor); + public abstract void doSomething(); +} diff --git a/src/main/java/com/matthewyao/designpattern/visitor/IVisitor.java b/src/main/java/com/matthewyao/designpattern/visitor/IVisitor.java new file mode 100644 index 0000000..88935bc --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/visitor/IVisitor.java @@ -0,0 +1,9 @@ +package com.matthewyao.designpattern.visitor; + +/** + * Created by yaokuan on 2018/6/9. + */ +interface IVisitor { + public void visit(ConcreteElement1 el1); + public void visit(ConcreteElement2 el2); +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/visitor/ObjectStruture.java b/src/main/java/com/matthewyao/designpattern/visitor/ObjectStruture.java new file mode 100644 index 0000000..ae039c9 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/visitor/ObjectStruture.java @@ -0,0 +1,24 @@ +package com.matthewyao.designpattern.visitor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * Created by yaokuan on 2018/6/9. + */ +class ObjectStruture { + public static List getList(){ + List list = new ArrayList(); + Random ran = new Random(); + for(int i=0; i<10; i++){ + int a = ran.nextInt(100); + if(a>50){ + list.add(new ConcreteElement1()); + }else{ + list.add(new ConcreteElement2()); + } + } + return list; + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/designpattern/visitor/Visitor.java b/src/main/java/com/matthewyao/designpattern/visitor/Visitor.java new file mode 100644 index 0000000..6324124 --- /dev/null +++ b/src/main/java/com/matthewyao/designpattern/visitor/Visitor.java @@ -0,0 +1,15 @@ +package com.matthewyao.designpattern.visitor; + +/** + * Created by yaokuan on 2018/6/9. + */ +class Visitor implements IVisitor { + + public void visit(ConcreteElement1 el1) { + el1.doSomething(); + } + + public void visit(ConcreteElement2 el2) { + el2.doSomething(); + } +} \ No newline at end of file diff --git a/src/main/java/com/matthewyao/util/ThreadSafeList.java b/src/main/java/com/matthewyao/util/ThreadSafeList.java new file mode 100644 index 0000000..ffbd040 --- /dev/null +++ b/src/main/java/com/matthewyao/util/ThreadSafeList.java @@ -0,0 +1,40 @@ +package com.matthewyao.util; + +import java.util.*; +import java.util.concurrent.*; + +/** + * @Author: yaokuan + * @Date: 2018/10/24 下午3:35 + */ +public class ThreadSafeList { + + private static List arr = new ArrayList<>(); +// private static Vector arr = new Vector<>(); +// private static List arr = Collections.synchronizedList(new ArrayList()); +// private static List arr = new CopyOnWriteArrayList<>(); + private static Random random = new Random(); + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 20, 1, TimeUnit.HOURS, new LinkedBlockingQueue()); + for (int i = 1; i <= 100000; i++) { + threadPool.execute(new Runnable() { + @Override + public void run() { + synchronized (ThreadSafeList.class) { + arr.add(random.nextInt(Integer.MAX_VALUE)); + } + } + }); + } + threadPool.shutdown(); + try { + threadPool.awaitTermination(1, TimeUnit.HOURS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("arr size: " + arr.size() + ", cost: " + (System.currentTimeMillis() - start) + " mills"); + } +} + diff --git a/src/main/java/com/matthewyao/util/love.java b/src/main/java/com/matthewyao/util/love.java new file mode 100644 index 0000000..93bfd33 --- /dev/null +++ b/src/main/java/com/matthewyao/util/love.java @@ -0,0 +1,14 @@ +package com.matthewyao.util; + +/** + * @Author: yaokuan + * @Date: 2018/10/24 下午7:48 + */ +public class love { + public static void main(String[] args) { + int[] arr = new int[]{73, 20, 108, 111, 118, 101, 20, 117}; + for (int i : arr) { + System.out.print((char) i); + } + } +} diff --git a/src/main/java/com/matthewyao/work/AESEncrypt.java b/src/main/java/com/matthewyao/work/AESEncrypt.java deleted file mode 100644 index 1ec63ff..0000000 --- a/src/main/java/com/matthewyao/work/AESEncrypt.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.matthewyao.work; - -import javax.crypto.Cipher; -import javax.crypto.KeyGenerator; -import javax.crypto.SecretKey; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; - -/** - * Created by Frank on 10/28/15. - */ -public class AESEncrypt { - - /** - * 加密函数,返回string密文 - * @param content - * @param key - * @return - */ - public static String getEncryptStr(String content, String key){ - try { - return parseByte2HexStr(enCrypt(content, key),true); - } catch (Exception e) { - e.printStackTrace(); - } - return content; - } - - - /** - * 加密函数 - * @param content 加密的内容 - * @param strKey 密钥 - * @return 返回二进制字符数组 - * @throws Exception - */ - private static byte[] enCrypt(String content,String strKey) throws Exception{ - KeyGenerator keygen; - SecretKey desKey; - Cipher c; - byte[] cByte; - String str = content; - - keygen = KeyGenerator.getInstance("AES"); - SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); - secureRandom.setSeed(strKey.getBytes()); - keygen.init(128, secureRandom); - - desKey = keygen.generateKey(); - c = Cipher.getInstance("AES"); - - c.init(Cipher.ENCRYPT_MODE, desKey); - - cByte = c.doFinal(str.getBytes("UTF-8")); - - return cByte; - } - - /** 解密函数 - * @param src 加密过的二进制字符数组 - * @param strKey 密钥 - * @return - * @throws Exception - */ - private static String deCrypt (byte[] src,String strKey) throws Exception{ - KeyGenerator keygen; - SecretKey desKey; - Cipher c; - byte[] cByte; - - keygen = KeyGenerator.getInstance("AES"); - SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); - secureRandom.setSeed(strKey.getBytes()); - keygen.init(128, secureRandom); - - desKey = keygen.generateKey(); - c = Cipher.getInstance("AES"); - - c.init(Cipher.DECRYPT_MODE, desKey); - - - cByte = c.doFinal(src); - - return new String(cByte,"UTF-8"); - } - - - /**2进制转化成16进制 - * @param buf - * @return - */ - public static String parseByte2HexStr(byte buf[],boolean isUpper) { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < buf.length; i++) { - String hex = Integer.toHexString(buf[i] & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - if (isUpper){ - sb.append(hex.toUpperCase()); - }else { - sb.append(hex.toLowerCase()); - } - } - return sb.toString(); - } - - - /**将16进制转换为二进制 - * @param hexStr - * @return - */ - public static byte[] parseHexStr2Byte(String hexStr) { - if (hexStr.length() < 1) - return null; - byte[] result = new byte[hexStr.length()/2]; - for (int i = 0;i< hexStr.length()/2; i++) { - int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); - int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); - result[i] = (byte) (high * 16 + low); - } - return result; - } - - public static String generateKey4NonJava(String strKey) { - KeyGenerator keygen = null; - SecureRandom secureRandom = null; - try { - keygen = KeyGenerator.getInstance("AES"); - secureRandom = SecureRandom.getInstance("SHA1PRNG"); - } catch (NoSuchAlgorithmException e) {} - secureRandom.setSeed(strKey.getBytes()); - keygen.init(128, secureRandom); - - SecretKey desKey = keygen.generateKey(); - byte[] encodedKey = desKey.getEncoded(); - return parseByte2HexStr(encodedKey,false); - } -} diff --git a/src/main/java/com/matthewyao/work/AdIesAreaMatch.java b/src/main/java/com/matthewyao/work/AdIesAreaMatch.java deleted file mode 100644 index dffc5c7..0000000 --- a/src/main/java/com/matthewyao/work/AdIesAreaMatch.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.matthewyao.work; - -import java.io.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by matthewyao on 2016/5/9. - */ -public class AdIesAreaMatch { - - private Map adAreaMap = new HashMap(); - private Map pptvAreaMap = new HashMap(); - - public void matchAreaName() { - File adCityFile = new File("H:\\Workspace\\AdMasterIES\\new_city.csv"); - File adProvinceFile = new File("H:\\Workspace\\AdMasterIES\\new_province.csv"); - File adForeignFile = new File("H:\\Workspace\\AdMasterIES\\new_foreign.csv"); - List adFileList = new ArrayList(); - adFileList.add(adCityFile); - adFileList.add(adProvinceFile); - adFileList.add(adForeignFile); - - File pptvAreaFile = new File("H:\\Workspace\\AdMasterIES\\pptv_data.csv"); - - try { - //合并AdMaster的地域数据 - for (File file : adFileList) { - BufferedReader adReader = new BufferedReader(new FileReader(file)); - adReader.readLine();//跳过首行 - mergeAdAreaToMap(adReader); - } - //合并PPTV的地域数据 - BufferedReader pptvReader = new BufferedReader(new FileReader(pptvAreaFile)); - pptvAreaToMap(pptvReader); - } catch (IOException e) { - e.printStackTrace(); - } - - //比较数据差异 - compareAreaData(); - } - - private void mergeAdAreaToMap(BufferedReader br) { - String line; - try { - while ((line = br.readLine()) != null) { - String id = line.split(",")[0]; - String name = line.split(",")[1]; - name = name.replaceAll("\"", ""); - adAreaMap.put(id, name); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void pptvAreaToMap(BufferedReader br) { - String line; - try { - while ((line = br.readLine()) != null) { - String id = line.split("\t")[0]; - String name = line.split("\t")[1]; - pptvAreaMap.put(id, name); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - private void compareAreaData() { - BufferedWriter bw; - try { - bw = new BufferedWriter(new FileWriter(new File("H:\\Workspace\\AdMasterIES\\ad_data.sql"))); - for (Map.Entry pptvEntry : pptvAreaMap.entrySet()) { - boolean isMatch = false; - for (Map.Entry adEntry : adAreaMap.entrySet()) { - String sql = "INSERT INTO `pplive_ad`.`ad_data_area_ads2admaster` (`adsId`, `adsName`, `admasterId`, `admasterName`) VALUES (:adsId, ':adsName', :admasterId, ':admasterName');"; - //AdMaster的地域名称包含PPTV名称 - if (adEntry.getValue().contains(pptvEntry.getValue()) || pptvEntry.getValue().contains(adEntry.getValue())) { - sql = sql.replace(":adsId", pptvEntry.getKey()); - sql = sql.replace(":adsName", pptvEntry.getValue()); - sql = sql.replace(":admasterId", adEntry.getKey()); - sql = sql.replace(":admasterName", adEntry.getValue()); - bw.write(sql); - bw.newLine(); - } - } - } - bw.flush(); - bw.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - -// for (Map.Entry adEntry : adAreaMap.entrySet()) { -// boolean isMatch = false; -// for (Map.Entry pptvEntry : pptvAreaMap.entrySet()) { -// //AdMaster的地域名称包含PPTV名称 -// if (adEntry.getValue().contains(pptvEntry.getValue()) || pptvEntry.getValue().contains(adEntry.getValue())){ -// isMatch = true; -// } -// } -// if (!isMatch){ -// System.out.println("Not:"+adEntry.getKey()+" "+adEntry.getValue()); -// } -// } -} - diff --git a/src/main/java/com/matthewyao/work/AesDemo.java b/src/main/java/com/matthewyao/work/AesDemo.java deleted file mode 100644 index a5c39e4..0000000 --- a/src/main/java/com/matthewyao/work/AesDemo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.matthewyao.work; - -import javax.crypto.Cipher; -import javax.crypto.KeyGenerator; -import javax.crypto.SecretKey; -import java.security.SecureRandom; - -/** - * Created by matthewyao on 2016/7/29. - */ -public class AesDemo { - - public static void main(String... args){ - try { - String price = "100"; - String encryptStr = AESEncrypt.getEncryptStr(price,"8f5b054659b4cbb947d07b8facd00f28"); - System.out.println(encryptStr); - } catch (Exception e) { - e.printStackTrace() ; - } - } -} diff --git a/src/main/java/com/matthewyao/work/GenerateSqlUtil.java b/src/main/java/com/matthewyao/work/GenerateSqlUtil.java deleted file mode 100644 index a8b6857..0000000 --- a/src/main/java/com/matthewyao/work/GenerateSqlUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.matthewyao.work; - -import java.io.*; - -/** - * Created by matthewyao on 2016/8/24. - */ -public class GenerateSqlUtil { - - private static String SQL = "INSERT INTO sys_staff(ext_id,chinese_name,display_name,department_id,email,export_user_id,employee_state) "+ - "VALUES(:extId,':chineseName',':displayName',:depId,':email',:userId,':empState');\n"; - - public static void execute() { - File file = new File("E:\\桌面文件\\文件管理系统\\员工信息.csv"); - File outFile = new File("E:\\桌面文件\\文件管理系统\\staff.sql"); - try { - FileReader fr = new FileReader(file); - BufferedReader br = new BufferedReader(fr); - FileWriter fw = new FileWriter(outFile); - BufferedWriter bw = new BufferedWriter(fw); - - String line = null; - while ((line = br.readLine()) != null){ - int index = 0; - String[] strs = line.split(","); - - String newSql = SQL.replace(":extId",strs[index++]) - .replace(":chineseName",strs[index++]) - .replace(":displayName",strs[index++]) - .replace(":depId",strs[index++]) - .replace(":email",strs[index++]) - .replace(":userId",strs[index++]) - .replace(":empState",strs[index++]); - bw.write(newSql); - } - - bw.flush(); - fr.close(); - br.close(); - fw.close(); - bw.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e){ - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/matthewyao/work/JdbcTemplate.java b/src/main/java/com/matthewyao/work/JdbcTemplate.java deleted file mode 100644 index d481215..0000000 --- a/src/main/java/com/matthewyao/work/JdbcTemplate.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.matthewyao.work; - -import java.sql.*; - -/** - * Created by matthewyao on 2016/11/25. - */ -public class JdbcTemplate { - // Declare the JDBC objects. - private static Connection connection = null; - private static Statement statement = null; - - static { -// String connectionString = "jdbc:sqlserver://10.200.11.237:1433;DatabaseName=crm;user=crmUser;password=crm111111;"; - String connectionString = "jdbc:sqlserver://sh-oa2:1433;DatabaseName=crm;user=crmUser;password=crm111111;"; - try { - Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); - connection = DriverManager.getConnection(connectionString); - // Create and execute a SELECT SQL statement. - statement = connection.createStatement(); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - // Connect to your database. - // Replace server name, username, and password with your credentials - public static ResultSet queryForRowSet(String sql) throws SQLException { - return statement.executeQuery(sql); - } -} diff --git a/src/main/java/com/matthewyao/work/OscCustomerMatcher.java b/src/main/java/com/matthewyao/work/OscCustomerMatcher.java deleted file mode 100644 index 968f6ae..0000000 --- a/src/main/java/com/matthewyao/work/OscCustomerMatcher.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.matthewyao.work; - -import com.google.common.base.Splitter; - -import java.io.*; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by matthewyao on 2016/11/25. - */ -public class OscCustomerMatcher { - public static void main(String[] args) throws IOException, SQLException { - File file = new File("D:/osc_customer.txt"); - File matchFile = new File("D:/match.sql"); - BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK")); - String line = ""; - Map> oscMap = new HashMap>(); -// Map customerMatchMap = new HashMap(); - while ((line = br.readLine()) != null) { - final List list = Splitter.on("\t").trimResults().omitEmptyStrings().splitToList(line); - String customerType = list.get(3); - if (oscMap.containsKey(customerType)){ - oscMap.get(customerType).put(list.get(0),list.get(1)); - }else { - oscMap.put(customerType, new HashMap(){{ - put(list.get(0),list.get(1)); - }}); - } - } - /**同步客户主*/ - Map customerMap = oscMap.get("PP_DIRECT_CUSTOMER"); -// ResultSet rs = JdbcTemplate.queryForRowSet("select Id,BrandName,PartyId from BsCustomer where origin = 'CRM'"); - ResultSet rs = JdbcTemplate.queryForRowSet("select Id,BrandName,PartyId,CreateTime from bscustomer where BrandName in ( select BrandName from bscustomer group by BrandName having count(*) > 1 ) and PartyId = 0"); - System.out.println("未匹配客户:"); - while (rs.next()){ - String customerName = rs.getString("BrandName").trim(); - if (customerMap.containsKey(customerName)){ -// System.out.println("update bscustomer set PartyId ="+customerMap.get(customerName)+" where Id ="+rs.getInt("Id")); - }else { - System.out.println(customerName); - } - } - /**同步产品*/ - Map productMap = oscMap.get("PP_PRODUCT_LINE"); - rs = JdbcTemplate.queryForRowSet("select Id,ProductName,PartyId from BsCustomerProduct where ProductName in ( select ProductName from BsCustomerProduct group by ProductName having count(*) > 1 ) and PartyId = 0"); - System.out.println("未匹配产品线:"); - while (rs.next()){ - String productName = rs.getString("ProductName").trim(); - if (productMap.containsKey(productName)){ -// System.out.println("update BsCustomerProduct set PartyId ="+productMap.get(productName)+" where Id ="+rs.getInt("Id")); - }else { - System.out.println(productName); - } - } - /**同步代理公司*/ - Map proxyMap = oscMap.get("PP_AGENT"); - rs = JdbcTemplate.queryForRowSet("select Id,Title,PartyId from BsProxyCompany where Title in ( select Title from BsProxyCompany group by Title having count(*) > 1 ) and PartyId = 0"); - System.out.println("未匹配代理公司:"); - while (rs.next()){ - String proxyName = rs.getString("Title").trim(); - if (proxyMap.containsKey(proxyName)){ -// System.out.println("update BsProxyCompany set PartyId ="+proxyMap.get(proxyName)+" where Id ="+rs.getInt("Id")); - }else { - System.out.println(proxyName); - } - } - /**同步框架*/ - Map frameMap = oscMap.get("PP_FRAMEWORK"); - frameMap.putAll(oscMap.get("PP_SECONDARY_AGENT")); - rs = JdbcTemplate.queryForRowSet("select Id,Title,PartyId from BsFrame where Title in ( select Title from BsFrame group by Title having count(*) > 1 ) and PartyId = 0"); - System.out.println("未匹配框架:"); - while (rs.next()){ - String frameName = rs.getString("Title").trim(); - if (frameMap.containsKey(frameName)){ -// System.out.println("update BsFrame set PartyId ="+frameMap.get(frameName)+" where Id ="+rs.getInt("Id")); - }else { - System.out.println(frameName); - } - } -// /**同步二级代理*/ -// Map secondFrameMap = oscMap.get("PP_SECONDARY_AGENT"); -// rs = JdbcTemplate.queryForRowSet("select Id,Title,PartyId from BsFrame where Title in ( select Title from BsFrame group by Title having count(*) > 1 ) and PartyId = 0"); -// System.out.println("未匹配二级代理:"); -// while (rs.next()){ -// String secondFrameName = rs.getString("Title").trim(); -// if (secondFrameMap.containsKey(secondFrameName)){ -//// System.out.println("update BsFrame set PartyId ="+secondFrameMap.get(secondFrameName)+" where Id ="+rs.getInt("Id")); -// }else { -// System.out.println(secondFrameName); -// } -// } - } -} diff --git a/src/main/java/com/matthewyao/work/SrpingBeanUtils.java b/src/main/java/com/matthewyao/work/SrpingBeanUtils.java deleted file mode 100644 index 0912a73..0000000 --- a/src/main/java/com/matthewyao/work/SrpingBeanUtils.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.matthewyao.work; - -import org.springframework.beans.BeanUtils; - -import java.lang.reflect.InvocationTargetException; - -/** - * Created by yaokuan on 2017/11/6. - */ -public class SrpingBeanUtils { - static class FromClass { - int cityId; - - public FromClass() { - } - - public FromClass(int cityId) { - this.cityId = cityId; - } - - public int getCityId() { - return cityId; - } - - public void setCityId(int cityId) { - this.cityId = cityId; - } - - @Override - public String toString() { - return "FromClass{" + - "cityId=" + cityId + - '}'; - } - } - - static class ToClass { - Short cityId; - - public ToClass() { - } - - public ToClass(Short cityId) { - this.cityId = cityId; - } - - public int getCityId() { - return cityId.intValue(); - } - - public void setCityId(int cityId) { - this.cityId = new Short(String.valueOf(cityId)); - } - - @Override - public String toString() { - return "ToClass{" + - "cityId=" + cityId + - '}'; - } - } - - static void testSpringBeanUtils() { - FromClass from = new FromClass(24); - ToClass to = new ToClass(); - BeanUtils.copyProperties(from, to); - System.out.println(to); - } - - static void testSpringBeanUtils1() { - ToClass to = new ToClass(new Short("1")); - FromClass from = new FromClass(); - BeanUtils.copyProperties(to, from); - System.out.println(from); - } - - static void testApacheBeanUtils() { - FromClass from = new FromClass(24); - ToClass to = new ToClass(); - try { - org.apache.commons.beanutils.BeanUtils.copyProperties(from, to); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - System.out.println(to); - } - - public static void main(String[] args) { - testSpringBeanUtils(); -// testApacheBeanUtils(); - } -} diff --git a/src/main/java/com/matthewyao/work/TestContains.java b/src/main/java/com/matthewyao/work/TestContains.java deleted file mode 100644 index de6e1a5..0000000 --- a/src/main/java/com/matthewyao/work/TestContains.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.matthewyao.work; - -/** - * Created by yaokuan on 2017/12/1. - */ -public class TestContains { - public static void main(String[] args) { - StringBuilder sb = new StringBuilder(); - for (int i=10000000; i< 20000000; i++){ - sb.append(i).append(","); - } - String str = sb.toString(); - long start = System.currentTimeMillis(); - boolean b = str.contains("19000001"); - long end = System.currentTimeMillis(); -// System.out.println(str); - System.out.println("start:" + start + ", end:" + end + ", cost:" + (end - start) + ", res:" + b); - } -} diff --git a/src/main/java/com/matthewyao/work/TestEntityStatus.java b/src/main/java/com/matthewyao/work/TestEntityStatus.java deleted file mode 100644 index 2ec76af..0000000 --- a/src/main/java/com/matthewyao/work/TestEntityStatus.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.matthewyao.work; - -import com.google.common.collect.Sets; - -import java.util.Arrays; -import java.util.List; - -/** - * Created by yaokuan on 2017/6/2. - */ -public class TestEntityStatus { - public static void main(String[] args) { - List newList = Arrays.asList(20239136, 20499074, 20563700, 20610526, 22001282, 22023653, 22034826, 22059092, 22143808, 22222260, 22226198, 22232555, 22233529, 22234286, 22250522, 22254077, 22252690, 22252731); - List oldList = Arrays.asList(20440017, 20497666, 20530095, 20562131, 22033932, 22034826, 22041220, 22041331, 22056615, 22059092, 22076219, 22142432, 22142475, 22149648, 22151438, 22186080, 22202819, 22202568, 22205666, 22215673, 22222260, 22231315, 22242016, 22254164); - List nullList = Arrays.asList( - 152707867, 76666259, 56567637, 67994649, 81168845, 22723143, 13791436, 67651095, 5880952, 27336579, 24063563, 13423339, 24502082, 69939996, 69798675, 24670275, 19142680, 56930138, 45306252, 32300975, 32600503, 21582594, 99580580, 23956513, 69939558, 22297627, 6179855, 5384242, 59291372, 73501445, 38068258, 91896092, 90027828, 67068810, 68069237, 3134893, 113411142, 58463738, 2334379, 18205340, 69215408, 23988735, 27139340, 65282419, 69189255, 6606332, 21641425, 57470193, 58613475, 32344399, 69809037, 57193166, 77353267, 21066993, 76949028, 21988091, 90394071, 44354335, 18294700, 67432377, 12758652, 48540192, 58658490, 63049988, 38068109, 5470104, 66331711, 16722482, 43623241, 6229642, 67791825, 27004482, 6121346, 45323351, 78017346, 50722029, 24512412, 67676387, 45343327, 27375439, 18078972, 23893916, 32773381, 65873951, 69282260, 5386410, 58214273, 59052923, 79602497); - - System.out.println("intersect:" + newList.retainAll(oldList)); - System.out.println("inter is null:" + newList.retainAll(oldList)); - } -}