Ver Fonte

commmit design pattern

admin há 1 ano atrás
pai
commit
8a43905a9a
51 ficheiros alterados com 795 adições e 0 exclusões
  1. 22 0
      designPattern/src/behavioral/chain/AbstractLogger.java
  2. 30 0
      designPattern/src/behavioral/chain/ChainPatternDemo.java
  3. 11 0
      designPattern/src/behavioral/chain/ConsoleLogger.java
  4. 11 0
      designPattern/src/behavioral/chain/ErrorLogger.java
  5. 11 0
      designPattern/src/behavioral/chain/FileLogger.java
  6. 5 0
      designPattern/src/behavioral/iterator/Container.java
  7. 6 0
      designPattern/src/behavioral/iterator/Iterator.java
  8. 11 0
      designPattern/src/behavioral/iterator/IteratorPatternDemo.java
  9. 26 0
      designPattern/src/behavioral/iterator/NameRepository.java
  10. 16 0
      designPattern/src/behavioral/template/Cricket.java
  11. 16 0
      designPattern/src/behavioral/template/Football.java
  12. 16 0
      designPattern/src/behavioral/template/Game.java
  13. 11 0
      designPattern/src/behavioral/template/TemplatePatternDemo.java
  14. 8 0
      designPattern/src/creational/abstractFactory/AbstractFactory.java
  15. 50 0
      designPattern/src/creational/abstractFactory/AbstractFactoryPatternDemo.java
  16. 9 0
      designPattern/src/creational/abstractFactory/Blue.java
  17. 5 0
      designPattern/src/creational/abstractFactory/Color.java
  18. 26 0
      designPattern/src/creational/abstractFactory/ColorFactory.java
  19. 12 0
      designPattern/src/creational/abstractFactory/FactoryProducer.java
  20. 9 0
      designPattern/src/creational/abstractFactory/Green.java
  21. 9 0
      designPattern/src/creational/abstractFactory/Red.java
  22. 29 0
      designPattern/src/creational/abstractFactory/ShapeFactory.java
  23. 8 0
      designPattern/src/creational/factory/Circle.java
  24. 19 0
      designPattern/src/creational/factory/FactoryPatternDemo.java
  25. 8 0
      designPattern/src/creational/factory/Rectangle.java
  26. 5 0
      designPattern/src/creational/factory/Shape.java
  27. 18 0
      designPattern/src/creational/factory/ShapeFactory.java
  28. 8 0
      designPattern/src/creational/factory/Square.java
  29. 23 0
      designPattern/src/creational/singleton/DCL.java
  30. 16 0
      designPattern/src/creational/singleton/Hungry.java
  31. 37 0
      designPattern/src/creational/singleton/Lazy.java
  32. 45 0
      designPattern/src/creational/singleton/LazyThread.java
  33. 11 0
      designPattern/src/structural/adapter/AdapterPatternDemo.java
  34. 6 0
      designPattern/src/structural/adapter/AdvancedMediaPlayer.java
  35. 22 0
      designPattern/src/structural/adapter/AudioPlayer.java
  36. 20 0
      designPattern/src/structural/adapter/MediaAdapter.java
  37. 5 0
      designPattern/src/structural/adapter/MediaPlayer.java
  38. 12 0
      designPattern/src/structural/adapter/Mp4Player.java
  39. 12 0
      designPattern/src/structural/adapter/VlcPlayer.java
  40. 27 0
      designPattern/src/structural/composite/CompositePatternDemo.java
  41. 31 0
      designPattern/src/structural/composite/Employee.java
  42. 8 0
      designPattern/src/structural/decorator/Circle.java
  43. 17 0
      designPattern/src/structural/decorator/DecoratorPatternDemo.java
  44. 8 0
      designPattern/src/structural/decorator/Rectangle.java
  45. 15 0
      designPattern/src/structural/decorator/RedShapeDecorator.java
  46. 5 0
      designPattern/src/structural/decorator/Shape.java
  47. 11 0
      designPattern/src/structural/decorator/ShapeDecorator.java
  48. 5 0
      designPattern/src/structural/proxy/Image.java
  49. 16 0
      designPattern/src/structural/proxy/ProxyImage.java
  50. 12 0
      designPattern/src/structural/proxy/ProxyPatternDemo.java
  51. 16 0
      designPattern/src/structural/proxy/RealImage.java

+ 22 - 0
designPattern/src/behavioral/chain/AbstractLogger.java

@@ -0,0 +1,22 @@
+package behavioral.chain;
+
+public abstract class AbstractLogger {
+    public static int INFO = 1;
+    public static int DEBUG = 2;
+    public static int ERROR = 3;
+    protected int level;
+    //责任链中的下一个元素
+    protected AbstractLogger nextLogger;
+    public void setNextLogger(AbstractLogger nextLogger){
+        this.nextLogger = nextLogger;
+    }
+    public void logMessage(int level, String message){
+        if(this.level <= level){
+            write(message);
+        }
+        if(nextLogger !=null){
+            nextLogger.logMessage(level, message);
+        }
+    }
+    abstract protected void write(String message);
+}

+ 30 - 0
designPattern/src/behavioral/chain/ChainPatternDemo.java

@@ -0,0 +1,30 @@
+package behavioral.chain;
+
+public class ChainPatternDemo {
+    private static AbstractLogger getChainOfLoggers(){
+        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
+        AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
+        AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
+        errorLogger.setNextLogger(fileLogger);
+        fileLogger.setNextLogger(consoleLogger);
+        return errorLogger;
+    }
+    public static void main(String[] args) {
+        AbstractLogger loggerChain = getChainOfLoggers();
+        loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
+        System.out.println("--------------------------------------------------");
+        loggerChain.logMessage(AbstractLogger.DEBUG,
+                "This is a debug level information.");
+        System.out.println("--------------------------------------------------");
+        loggerChain.logMessage(AbstractLogger.ERROR,
+                "This is an error information.");
+    }
+}
+//Standard Console::Logger: This is an information.
+//--------------------------------------------------
+//File::Logger: This is a debug level information.
+//Standard Console::Logger: This is a debug level information.
+//--------------------------------------------------
+//Error Console::Logger: This is an error information.
+//File::Logger: This is an error information.
+//Standard Console::Logger: This is an error information.

+ 11 - 0
designPattern/src/behavioral/chain/ConsoleLogger.java

@@ -0,0 +1,11 @@
+package behavioral.chain;
+
+public class ConsoleLogger extends AbstractLogger {
+    public ConsoleLogger(int level){
+        this.level = level;
+    }
+    @Override
+    protected void write(String message) {
+        System.out.println("Standard Console::Logger: " + message);
+    }
+}

+ 11 - 0
designPattern/src/behavioral/chain/ErrorLogger.java

@@ -0,0 +1,11 @@
+package behavioral.chain;
+
+public class ErrorLogger extends AbstractLogger {
+    public ErrorLogger(int level){
+        this.level = level;
+    }
+    @Override
+    protected void write(String message) {
+        System.out.println("Error Console::Logger: " + message);
+    }
+}

+ 11 - 0
designPattern/src/behavioral/chain/FileLogger.java

@@ -0,0 +1,11 @@
+package behavioral.chain;
+
+public class FileLogger extends AbstractLogger {
+    public FileLogger(int level){
+        this.level = level;
+    }
+    @Override
+    protected void write(String message) {
+        System.out.println("File::Logger: " + message);
+    }
+}

+ 5 - 0
designPattern/src/behavioral/iterator/Container.java

@@ -0,0 +1,5 @@
+package behavioral.iterator;
+
+public interface Container {
+    public Iterator getIterator();
+}

+ 6 - 0
designPattern/src/behavioral/iterator/Iterator.java

@@ -0,0 +1,6 @@
+package behavioral.iterator;
+
+public interface Iterator {
+    public boolean hasNext();
+    public Object next();
+}

+ 11 - 0
designPattern/src/behavioral/iterator/IteratorPatternDemo.java

@@ -0,0 +1,11 @@
+package behavioral.iterator;
+
+public class IteratorPatternDemo {
+    public static void main(String[] args) {
+        NameRepository namesRepository = new NameRepository();
+        for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
+            String name = (String)iter.next();
+            System.out.println("Name : " + name);
+        }
+    }
+}

+ 26 - 0
designPattern/src/behavioral/iterator/NameRepository.java

@@ -0,0 +1,26 @@
+package behavioral.iterator;
+
+public class NameRepository implements Container {
+    public String[] names = {"Robert" , "John" ,"Julie" , "Lora"};
+    @Override
+    public Iterator getIterator() {
+        return new NameIterator();
+    }
+    private class NameIterator implements Iterator {
+        int index;
+        @Override
+        public boolean hasNext() {
+            if(index < names.length){
+                return true;
+            }
+            return false;
+        }
+        @Override
+        public Object next() {
+            if(this.hasNext()){
+                return names[index++];
+            }
+            return null;
+        }
+    }
+}

+ 16 - 0
designPattern/src/behavioral/template/Cricket.java

@@ -0,0 +1,16 @@
+package behavioral.template;
+
+public class Cricket extends Game {
+    @Override
+    void endPlay() {
+        System.out.println("Cricket Game Finished!");
+    }
+    @Override
+    void initialize() {
+        System.out.println("Cricket Game Initialized! Start playing.");
+    }
+    @Override
+    void startPlay() {
+        System.out.println("Cricket Game Started. Enjoy the game!");
+    }
+}

+ 16 - 0
designPattern/src/behavioral/template/Football.java

@@ -0,0 +1,16 @@
+package behavioral.template;
+
+public class Football extends Game {
+    @Override
+    void endPlay() {
+        System.out.println("Football Game Finished!");
+    }
+    @Override
+    void initialize() {
+        System.out.println("Football Game Initialized! Start playing.");
+    }
+    @Override
+    void startPlay() {
+        System.out.println("Football Game Started. Enjoy the game!");
+    }
+}

+ 16 - 0
designPattern/src/behavioral/template/Game.java

@@ -0,0 +1,16 @@
+package behavioral.template;
+
+public abstract class Game {
+    abstract void initialize();
+    abstract void startPlay();
+    abstract void endPlay();
+    //模板
+    public final void play(){
+        //初始化游戏
+        initialize();
+        //开始游戏
+        startPlay();
+        //结束游戏
+        endPlay();
+    }
+}

+ 11 - 0
designPattern/src/behavioral/template/TemplatePatternDemo.java

@@ -0,0 +1,11 @@
+package behavioral.template;
+
+public class TemplatePatternDemo {
+    public static void main(String[] args) {
+        Game game = new Cricket();
+        game.play();
+        System.out.println();
+        game = new Football();
+        game.play();
+    }
+}

+ 8 - 0
designPattern/src/creational/abstractFactory/AbstractFactory.java

@@ -0,0 +1,8 @@
+package creational.abstractFactory;
+
+import creational.factory.Shape;
+
+public abstract class AbstractFactory {
+    public abstract Color getColor(String color);
+    public abstract Shape getShape(String shape);
+}

+ 50 - 0
designPattern/src/creational/abstractFactory/AbstractFactoryPatternDemo.java

@@ -0,0 +1,50 @@
+package creational.abstractFactory;
+
+import creational.factory.Shape;
+
+public class AbstractFactoryPatternDemo {
+    public static void main(String[] args) {
+
+        //获取形状工厂
+        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
+
+        //获取形状为 Circle 的对象
+        Shape shape1 = shapeFactory.getShape("CIRCLE");
+
+        //调用 Circle 的 draw 方法
+        shape1.draw();
+
+        //获取形状为 Rectangle 的对象
+        Shape shape2 = shapeFactory.getShape("RECTANGLE");
+
+        //调用 Rectangle 的 draw 方法
+        shape2.draw();
+
+        //获取形状为 Square 的对象
+        Shape shape3 = shapeFactory.getShape("SQUARE");
+
+        //调用 Square 的 draw 方法
+        shape3.draw();
+
+        //获取颜色工厂
+        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
+
+        //获取颜色为 Red 的对象
+        Color color1 = colorFactory.getColor("RED");
+
+        //调用 Red 的 fill 方法
+        color1.fill();
+
+        //获取颜色为 Green 的对象
+        Color color2 = colorFactory.getColor("GREEN");
+
+        //调用 Green 的 fill 方法
+        color2.fill();
+
+        //获取颜色为 Blue 的对象
+        Color color3 = colorFactory.getColor("BLUE");
+
+        //调用 Blue 的 fill 方法
+        color3.fill();
+    }
+}

+ 9 - 0
designPattern/src/creational/abstractFactory/Blue.java

@@ -0,0 +1,9 @@
+package creational.abstractFactory;
+
+public class Blue implements Color {
+
+    @Override
+    public void fill() {
+        System.out.println("Inside Blue::fill() method.");
+    }
+}

+ 5 - 0
designPattern/src/creational/abstractFactory/Color.java

@@ -0,0 +1,5 @@
+package creational.abstractFactory;
+
+public interface Color {
+    void fill();
+}

+ 26 - 0
designPattern/src/creational/abstractFactory/ColorFactory.java

@@ -0,0 +1,26 @@
+package creational.abstractFactory;
+
+import creational.factory.Shape;
+
+public class ColorFactory extends AbstractFactory {
+
+    @Override
+    public Shape getShape(String shapeType){
+        return null;
+    }
+
+    @Override
+    public Color getColor(String color) {
+        if(color == null){
+            return null;
+        }
+        if(color.equalsIgnoreCase("RED")){
+            return new Red();
+        } else if(color.equalsIgnoreCase("GREEN")){
+            return new Green();
+        } else if(color.equalsIgnoreCase("BLUE")){
+            return new Blue();
+        }
+        return null;
+    }
+}

+ 12 - 0
designPattern/src/creational/abstractFactory/FactoryProducer.java

@@ -0,0 +1,12 @@
+package creational.abstractFactory;
+
+public class FactoryProducer {
+    public static AbstractFactory getFactory(String choice){
+        if(choice.equalsIgnoreCase("SHAPE")){
+            return new ShapeFactory();
+        } else if(choice.equalsIgnoreCase("COLOR")){
+            return new ColorFactory();
+        }
+        return null;
+    }
+}

+ 9 - 0
designPattern/src/creational/abstractFactory/Green.java

@@ -0,0 +1,9 @@
+package creational.abstractFactory;
+
+public class Green implements Color {
+
+    @Override
+    public void fill() {
+        System.out.println("Inside Green::fill() method.");
+    }
+}

+ 9 - 0
designPattern/src/creational/abstractFactory/Red.java

@@ -0,0 +1,9 @@
+package creational.abstractFactory;
+
+public class Red implements Color {
+
+    @Override
+    public void fill() {
+        System.out.println("Inside Red::fill() method.");
+    }
+}

+ 29 - 0
designPattern/src/creational/abstractFactory/ShapeFactory.java

@@ -0,0 +1,29 @@
+package creational.abstractFactory;
+
+import creational.factory.Circle;
+import creational.factory.Rectangle;
+import creational.factory.Shape;
+import creational.factory.Square;
+
+public class ShapeFactory extends AbstractFactory {
+
+    @Override
+    public Shape getShape(String shapeType){
+        if(shapeType == null){
+            return null;
+        }
+        if(shapeType.equalsIgnoreCase("CIRCLE")){
+            return new Circle();
+        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
+            return new Rectangle();
+        } else if(shapeType.equalsIgnoreCase("SQUARE")){
+            return new Square();
+        }
+        return null;
+    }
+
+    @Override
+    public Color getColor(String color) {
+        return null;
+    }
+}

+ 8 - 0
designPattern/src/creational/factory/Circle.java

@@ -0,0 +1,8 @@
+package creational.factory;
+
+public class Circle implements Shape {
+    @Override
+    public void draw() {
+        System.out.println("Inside Circle::draw() method.");
+    }
+}

+ 19 - 0
designPattern/src/creational/factory/FactoryPatternDemo.java

@@ -0,0 +1,19 @@
+package creational.factory;
+
+public class FactoryPatternDemo {
+    public static void main(String[] args) {
+        ShapeFactory shapeFactory = new ShapeFactory();
+        //获取 Circle 的对象,并调用它的 draw 方法
+        Shape shape1 = shapeFactory.getShape("CIRCLE");
+        //调用 Circle 的 draw 方法
+        shape1.draw();
+        //获取 Rectangle 的对象,并调用它的 draw 方法
+        Shape shape2 = shapeFactory.getShape("RECTANGLE");
+        //调用 Rectangle 的 draw 方法
+        shape2.draw();
+        //获取 Square 的对象,并调用它的 draw 方法
+        Shape shape3 = shapeFactory.getShape("SQUARE");
+        //调用 Square 的 draw 方法
+        shape3.draw();
+    }
+}

+ 8 - 0
designPattern/src/creational/factory/Rectangle.java

@@ -0,0 +1,8 @@
+package creational.factory;
+
+public class Rectangle implements Shape {
+    @Override
+    public void draw() {
+        System.out.println("Inside Rectangle::draw() method.");
+    }
+}

+ 5 - 0
designPattern/src/creational/factory/Shape.java

@@ -0,0 +1,5 @@
+package creational.factory;
+
+public interface Shape {
+    void draw();
+}

+ 18 - 0
designPattern/src/creational/factory/ShapeFactory.java

@@ -0,0 +1,18 @@
+package creational.factory;
+
+public class ShapeFactory {
+    //使用 getShape 方法获取形状类型的对象
+    public Shape getShape(String shapeType){
+        if(shapeType == null){
+            return null;
+        }
+        if(shapeType.equalsIgnoreCase("CIRCLE")){
+            return new Circle();
+        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
+            return new Rectangle();
+        } else if(shapeType.equalsIgnoreCase("SQUARE")){
+            return new Square();
+        }
+        return null;
+    }
+}

+ 8 - 0
designPattern/src/creational/factory/Square.java

@@ -0,0 +1,8 @@
+package creational.factory;
+
+public class Square implements Shape {
+    @Override
+    public void draw() {
+        System.out.println("Inside Square::draw() method.");
+    }
+}

+ 23 - 0
designPattern/src/creational/singleton/DCL.java

@@ -0,0 +1,23 @@
+package creational.singleton;//双检锁/双重校验锁
+
+public class DCL {
+    private volatile static DCL dcl;
+    private DCL (){}
+    public static DCL getInstance() {
+        if (dcl == null) {  // 双重校验:第一次校验
+            // 判断对象是否以及实例化过,没有则进入加锁代码块,此处可能有多个线程同时进来,等待类对象锁
+            synchronized (DCL.class) {
+                // 获取类对象锁,其他线程在外等待,其他线程进来再次判断,如果对象实例化了,则不需要再实例化
+                if (dcl == null) {   // 双重校验:第二次校验
+                    dcl = new DCL();
+                }
+            }
+        }
+        return dcl;
+    }
+
+    public static void main(String[] args){
+        System.out.println(DCL.getInstance());
+    }
+
+}

+ 16 - 0
designPattern/src/creational/singleton/Hungry.java

@@ -0,0 +1,16 @@
+package creational.singleton;
+
+//饿汉式
+
+public class Hungry {
+    private static Hungry instance = new Hungry();
+    private Hungry (){}
+    public static Hungry getInstance() {
+        return instance;
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+
+        System.out.println(Hungry.instance==null);
+    }
+}

+ 37 - 0
designPattern/src/creational/singleton/Lazy.java

@@ -0,0 +1,37 @@
+package creational.singleton;
+//懒汉式,线程不安全
+//① 这些线程可能会创建多个对象
+//② 某个线程可能会得到一个未完全初始化的对象
+
+public class Lazy {
+    private static Lazy instance;
+    private Lazy (){}
+    public static Lazy getInstance() {
+        if (instance == null) {
+            /**
+             * 由于没有加锁,当线程A刚执行完if判断INSTANCE为null后还没来得及执行INSTANCE = new Singleton()
+             * 此时线程B进来,if判断后INSTANCE为null,且执行完INSTANCE = new Singleton()
+             * 然后,线程A接着执行,由于之前if判断INSTANCE为null,于是执行INSTANCE = new Singleton()重复创建了对象
+             */
+
+            /**
+             * 由于没有加锁,当线程A刚执行完if判断INSTANCE为null后开始执行 INSTANCE = new Singleton()
+             * 但是注意,new Singleton()这个操作在JVM层面不是一个原子操作
+             *
+             *(具体由三步组成:1.为INSTANCE分配内存空间;2.初始化INSTANCE;3.将INSTANCE指向分配的内存空间,
+             * 且这三步在JVM层面有可能发生指令重排,导致实际执行顺序可能为1-3-2)
+             *
+             * 因为new操作不是原子化操作,因此,可能会出现线程A执行new Singleton()时发生指令重排的情况,
+             * 导致实际执行顺序变为1-3-2,当执行完1-3还没来及执行2时(虽然还没执行2,但是对象的引用已经有了,
+             * 只不过引用的是一个还没初始化的对象),此时线程B进来进行if判断后INSTANCE不为null,
+             * 然后直接把线程A new到一半的对象返回了
+             */
+            instance = new Lazy();
+        }
+        return instance;
+    }
+
+    public static void main(String[] args){
+        System.out.println(Lazy.instance==null);
+    }
+}

+ 45 - 0
designPattern/src/creational/singleton/LazyThread.java

@@ -0,0 +1,45 @@
+package creational.singleton;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+// 懒汉式,线程安全
+
+public class LazyThread implements Runnable{
+
+
+    private static int POOL_NUM = 5;
+    private static LazyThread instance;
+    private LazyThread (){}
+    public static synchronized LazyThread getInstance() throws InterruptedException {
+        //这里是粗暴地对整个 getInstance() 方法加锁,这样做代价很大,
+        // 因为,只有当第一次调用 getInstance() 时才需要同步创建对象,创建之后再次调用 getInstance()
+        // 时就只是简单的返回成员变量,而这里是无需同步的,所以没必要对整个方法加锁。
+        //
+        //由于同步一个方法会降低上百倍甚至更高的性能, 每次调用获取和释放锁的开销似乎是可以避免的:
+        // 一旦初始化完成,获取和释放锁就显得很不必要。
+        if (instance == null) {
+            instance = new LazyThread();
+            System.out.println();
+        }
+        return instance;
+    }
+    @Override
+    public void run() {
+        try {
+            System.out.println(LazyThread.getInstance());
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+        ExecutorService executorService = Executors.newFixedThreadPool(3);
+        for (int i = 0; i < POOL_NUM; i++) {
+            LazyThread thread = new LazyThread();
+            Thread.sleep(1000);
+            executorService.execute(thread);
+        }
+        executorService.shutdown();
+    }
+}

+ 11 - 0
designPattern/src/structural/adapter/AdapterPatternDemo.java

@@ -0,0 +1,11 @@
+package structural.adapter;
+
+public class AdapterPatternDemo {
+    public static void main(String[] args) {
+        AudioPlayer audioPlayer = new AudioPlayer();
+        audioPlayer.play("mp3", "beyond the horizon.mp3");
+        audioPlayer.play("mp4", "alone.mp4");
+        audioPlayer.play("vlc", "far far away.vlc");
+        audioPlayer.play("avi", "mind me.avi");
+    }
+}

+ 6 - 0
designPattern/src/structural/adapter/AdvancedMediaPlayer.java

@@ -0,0 +1,6 @@
+package structural.adapter;
+
+public interface AdvancedMediaPlayer {
+    public void playVlc(String fileName);
+    public void playMp4(String fileName);
+}

+ 22 - 0
designPattern/src/structural/adapter/AudioPlayer.java

@@ -0,0 +1,22 @@
+package structural.adapter;
+
+public class AudioPlayer implements MediaPlayer {
+    MediaAdapter mediaAdapter;
+    @Override
+    public void play(String audioType, String fileName) {
+        //播放 mp3 音乐文件的内置支持
+        if(audioType.equalsIgnoreCase("mp3")){
+            System.out.println("Playing mp3 file. Name: "+ fileName);
+        }
+        //mediaAdapter 提供了播放其他文件格式的支持
+        else if(audioType.equalsIgnoreCase("vlc")
+                || audioType.equalsIgnoreCase("mp4")){
+            mediaAdapter = new MediaAdapter(audioType);
+            mediaAdapter.play(audioType, fileName);
+        }
+        else{
+            System.out.println("Invalid media. "+
+                    audioType + " format not supported");
+        }
+    }
+}

+ 20 - 0
designPattern/src/structural/adapter/MediaAdapter.java

@@ -0,0 +1,20 @@
+package structural.adapter;
+
+public class MediaAdapter implements MediaPlayer {
+    AdvancedMediaPlayer advancedMusicPlayer;
+    public MediaAdapter(String audioType){
+        if(audioType.equalsIgnoreCase("vlc") ){
+            advancedMusicPlayer = new VlcPlayer();
+        } else if (audioType.equalsIgnoreCase("mp4")){
+            advancedMusicPlayer = new Mp4Player();
+        }
+    }
+    @Override
+    public void play(String audioType, String fileName) {
+        if(audioType.equalsIgnoreCase("vlc")){
+            advancedMusicPlayer.playVlc(fileName);
+        }else if(audioType.equalsIgnoreCase("mp4")){
+            advancedMusicPlayer.playMp4(fileName);
+        }
+    }
+}

+ 5 - 0
designPattern/src/structural/adapter/MediaPlayer.java

@@ -0,0 +1,5 @@
+package structural.adapter;
+
+public interface MediaPlayer {
+    public void play(String audioType, String fileName);
+}

+ 12 - 0
designPattern/src/structural/adapter/Mp4Player.java

@@ -0,0 +1,12 @@
+package structural.adapter;
+
+public class Mp4Player implements AdvancedMediaPlayer{
+    @Override
+    public void playVlc(String fileName) {
+        //什么也不做
+    }
+    @Override
+    public void playMp4(String fileName) {
+        System.out.println("Playing mp4 file. Name: "+ fileName);
+    }
+}

+ 12 - 0
designPattern/src/structural/adapter/VlcPlayer.java

@@ -0,0 +1,12 @@
+package structural.adapter;
+
+public class VlcPlayer implements AdvancedMediaPlayer{
+    @Override
+    public void playVlc(String fileName) {
+        System.out.println("Playing vlc file. Name: "+ fileName);
+    }
+    @Override
+    public void playMp4(String fileName) {
+        //什么也不做
+    }
+}

+ 27 - 0
designPattern/src/structural/composite/CompositePatternDemo.java

@@ -0,0 +1,27 @@
+package structural.composite;
+
+public class CompositePatternDemo {
+    public static void main(String[] args) {
+        Employee CEO = new Employee("John","CEO", 30000);
+        Employee headSales = new Employee("Robert","Head Sales", 20000);
+        Employee headMarketing = new Employee("Michel","Head Marketing", 20000);
+        Employee clerk1 = new Employee("Laura","Marketing", 10000);
+        Employee clerk2 = new Employee("Bob","Marketing", 10000);
+        Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
+        Employee salesExecutive2 = new Employee("Rob","Sales", 10000);
+        CEO.add(headSales);
+        CEO.add(headMarketing);
+        headSales.add(salesExecutive1);
+        headSales.add(salesExecutive2);
+        headMarketing.add(clerk1);
+        headMarketing.add(clerk2);
+        //打印该组织的所有员工
+        System.out.println(CEO);
+        for (Employee headEmployee : CEO.getSubordinates()) {
+            System.out.println(headEmployee);
+            for (Employee employee : headEmployee.getSubordinates()) {
+                System.out.println(employee);
+            }
+        }
+    }
+}

+ 31 - 0
designPattern/src/structural/composite/Employee.java

@@ -0,0 +1,31 @@
+package structural.composite;
+
+import java.util.ArrayList;
+import java.util.List;
+public class Employee {
+    private String name;
+    private String dept;
+    private int salary;
+    private List<Employee> subordinates;
+    //构造函数
+    public Employee(String name,String dept, int sal) {
+        this.name = name;
+        this.dept = dept;
+        this.salary = sal;
+        subordinates = new ArrayList<Employee>();
+    }
+    public void add(Employee e) {
+        subordinates.add(e);
+    }
+    public void remove(Employee e) {
+        subordinates.remove(e);
+    }
+    public List<Employee> getSubordinates(){
+        return subordinates;
+    }
+    public String toString(){
+        return ("Employee :[ Name : "+ name
+                +", dept : "+ dept + ", salary :"
+                + salary+" ]");
+    }
+}

+ 8 - 0
designPattern/src/structural/decorator/Circle.java

@@ -0,0 +1,8 @@
+package structural.decorator;
+
+public class Circle implements Shape {
+    @Override
+    public void draw() {
+        System.out.println("Shape: Circle");
+    }
+}

+ 17 - 0
designPattern/src/structural/decorator/DecoratorPatternDemo.java

@@ -0,0 +1,17 @@
+package structural.decorator;
+
+public class DecoratorPatternDemo {
+    public static void main(String[] args) {
+        Shape circle = new Circle();
+        ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
+        ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
+        //Shape redCircle = new RedShapeDecorator(new Circle());
+        //Shape redRectangle = new RedShapeDecorator(new Rectangle());
+        System.out.println("Circle with normal border");
+        circle.draw();
+        System.out.println("\nCircle of red border");
+        redCircle.draw();
+        System.out.println("\nRectangle of red border");
+        redRectangle.draw();
+    }
+}

+ 8 - 0
designPattern/src/structural/decorator/Rectangle.java

@@ -0,0 +1,8 @@
+package structural.decorator;
+
+public class Rectangle implements Shape {
+    @Override
+    public void draw() {
+        System.out.println("Shape: Rectangle");
+    }
+}

+ 15 - 0
designPattern/src/structural/decorator/RedShapeDecorator.java

@@ -0,0 +1,15 @@
+package structural.decorator;
+
+public class RedShapeDecorator extends ShapeDecorator {
+    public RedShapeDecorator(Shape decoratedShape) {
+        super(decoratedShape);
+    }
+    @Override
+    public void draw() {
+        decoratedShape.draw();
+        setRedBorder(decoratedShape);
+    }
+    private void setRedBorder(Shape decoratedShape){
+        System.out.println("Border Color: Red");
+    }
+}

+ 5 - 0
designPattern/src/structural/decorator/Shape.java

@@ -0,0 +1,5 @@
+package structural.decorator;
+
+public interface Shape {
+    void draw();
+}

+ 11 - 0
designPattern/src/structural/decorator/ShapeDecorator.java

@@ -0,0 +1,11 @@
+package structural.decorator;
+
+public abstract class ShapeDecorator implements Shape {
+    protected Shape decoratedShape;
+    public ShapeDecorator(Shape decoratedShape){
+        this.decoratedShape = decoratedShape;
+    }
+    public void draw(){
+        decoratedShape.draw();
+    }
+}

+ 5 - 0
designPattern/src/structural/proxy/Image.java

@@ -0,0 +1,5 @@
+package structural.proxy;
+
+public interface Image {
+    void display();
+}

+ 16 - 0
designPattern/src/structural/proxy/ProxyImage.java

@@ -0,0 +1,16 @@
+package structural.proxy;
+
+public class ProxyImage implements Image{
+    private RealImage realImage;
+    private String fileName;
+    public ProxyImage(String fileName){
+        this.fileName = fileName;
+    }
+    @Override
+    public void display() {
+        if(realImage == null){
+            realImage = new RealImage(fileName);
+        }
+        realImage.display();
+    }
+}

+ 12 - 0
designPattern/src/structural/proxy/ProxyPatternDemo.java

@@ -0,0 +1,12 @@
+package structural.proxy;
+
+public class ProxyPatternDemo {
+    public static void main(String[] args) {
+        Image image = new ProxyImage("test_10mb.jpg");
+        // 图像将从磁盘加载
+        image.display();
+        System.out.println("");
+        // 图像不需要从磁盘加载
+        image.display();
+    }
+}

+ 16 - 0
designPattern/src/structural/proxy/RealImage.java

@@ -0,0 +1,16 @@
+package structural.proxy;
+
+public class RealImage implements Image {
+    private String fileName;
+    public RealImage(String fileName){
+        this.fileName = fileName;
+        loadFromDisk(fileName);
+    }
+    @Override
+    public void display() {
+        System.out.println("Displaying " + fileName);
+    }
+    private void loadFromDisk(String fileName){
+        System.out.println("Loading " + fileName);
+    }
+}