[
  {
    "path": ".gitignore",
    "content": "target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n*.iml\n.gradle\nlocal.properties\n.idea/workspace.xml\n.idea/libraries\n.DS_Store\nbuild/\ncaptures/\n.externalNativeBuild\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 spring2go.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "core-spring-patterns\r\n======\r\n\r\nSpring核心原理和模式，波波微课\r\n\r\n## 大纲\r\n\r\n### 1. 创建模式\r\n\r\n名称 | 代码 | ppt | 视频 |\r\n----|-----|-----|-----|\r\n简单工厂Simple Factory|[code](patterns/creation/simple-factory)|[ppt](ppts/简单工厂.pdf)|[video](https://v.qq.com/x/page/n0629exrd31.html)|\r\n工厂方法Factory Method|[code](patterns/creation/factory-method)|[ppt](ppts/工厂方法.pdf)|[video](https://v.qq.com/x/page/a0629kh0xxc.html)|\r\n抽象工厂Abstract Factory|[code](patterns/creation/abstract-factory)|[ppt](ppts/抽象工厂.pdf)|[video](https://v.qq.com/x/page/p0629psr89t.html)|\r\n单例Singleton|[code](patterns/creation/singleton)|[ppt](ppts/单例.pdf)|[video](https://v.qq.com/x/page/s0630rqg9wg.html)|\r\n构造者Builder|[code](patterns/creation/builder)|[ppt](ppts/构建者.pdf)|[video](https://v.qq.com/x/page/z0630bg1qs3.html)|\r\n流畅接口Fluent Interface|[code](patterns/creation/builder)|[ppt](ppts/流畅接口.pdf)|[video](https://v.qq.com/x/page/v063000n872.html)|\r\n\r\n### 2. 结构模式\r\n\r\n名称 | 代码 | ppt | 视频 |\r\n----|-----|-----|-----|\r\n适配器Adapter|[code](patterns/structural/adapter)|[ppt](ppts/适配器.pdf)|[video](https://v.qq.com/x/page/w0632njvzkw.html)|\r\n桥接器Bridge|[code](patterns/structural/bridge)|[ppt](ppts/桥接器.pdf)|[video](https://v.qq.com/x/page/h0632obkktb.html)|\r\n组合Composite|[code](patterns/structural/composite)|[ppt](ppts/组合模式.pdf)|[video](https://v.qq.com/x/page/t0634x9lbew.html)|\r\n装饰Decorator|[code](patterns/structural/decorator)|[ppt](ppts/装饰模式.pdf)|[video](http://v.qq.com/x/page/p0636w3d6s2.html)|\r\n门面Facade|[code](patterns/structural/facade)|[ppt](ppts/门面模式.pdf)|[video](https://v.qq.com/x/page/m06379lgexy.html)|\r\n代理Proxy|[code](patterns/structural/proxy)|[ppt](ppts/代理模式.pdf)|[video](https://v.qq.com/x/page/k0637354wuw.html)|\r\n\r\n\r\n### 3. 行为模式\r\n\r\n名称 | 代码 | ppt | 视频 |\r\n----|-----|-----|-----|\r\n职责链Chain of Responsibility|[code](patterns/behavior/chain_of_responsibility)|[ppt](ppts/职责链模式.pdf)|[video](http://v.qq.com/x/page/r0640omm9hs.html)|\r\n命令Command|[code](patterns/behavior/command)|[ppt](ppts/命令模式.pdf)|[video](https://v.qq.com/x/page/j0641ba2m4j.html)|\r\n解释器Interpreter|[code](patterns/behavior/interpreter)|[ppt](ppts/解释器模式.pdf)|[video](http://v.qq.com/x/page/t0642g9ioam.html)|\r\n迭代器Iterator|[code](patterns/behavior/iterator)|[ppt](ppts/迭代器模式.pdf)|[video](https://v.qq.com/x/page/a0643uhcvgn.html)|\r\n策略Strategy|[code](patterns/behavior/strategy)|[ppt](ppts/策略模式.pdf)|[video](http://v.qq.com/x/page/n0645457b19.html)|\r\n观察者Observer|[code](patterns/behavior/observer)|[ppt](ppts/观察者模式.pdf)|[video](http://v.qq.com/x/page/j0653cekdal.html)|\r\n模板方法Template Method|[code](patterns/behavior/template)|[ppt](ppts/模板方法模式.pdf)|[video](https://v.qq.com/x/page/p0654hjkpy3.html)|\r\n\r\n### 4. 核心模式\r\n\r\n名称 | 代码 | ppt | 视频 |\r\n----|-----|-----|-----|\r\n依赖倒置原则，控制反转，依赖注入|[code](patterns/general/dependency-inversion)|[ppt](ppts/DIP+IoC+DI.pdf)|[video](https://v.qq.com/x/page/k0629qsrpz5.html)|\r\n\r\n## 波波微课公众号\r\n\r\n![公众号](image/qrcode_wechat.jpg)\r\n\r\n## 官网\r\n\r\n[jskillcloud.com](http://www.jskillcloud.com)\r\n"
  },
  {
    "path": "patterns/behavior/chain_of_responsibility/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>ChainOfResponsibility</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/ApproveHandler.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// Handler\r\npublic interface ApproveHandler {\r\n\t\r\n\tpublic void setNextHandler(ApproveHandler nextHandler);\r\n\t\r\n\tpublic void approve(Leave leave);\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/ClientProgram.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// Client\r\npublic class ClientProgram {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tTeamLeader tl = new TeamLeader();\r\n\t\tProjectLeader pl = new ProjectLeader();\r\n\t\tHR hr = new HR();\r\n\t\t\r\n\t\ttl.setNextHandler(pl);\r\n\t\tpl.setNextHandler(hr);\r\n\t\t\r\n\t\t\r\n\t\ttl.approve(new Leave(1, 5));\r\n\t\ttl.approve(new Leave(2, 15));\r\n\t\ttl.approve(new Leave(3, 25));\r\n\t\ttl.approve(new Leave(4, 35));\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/HR.java",
    "content": "package io.spring2go.corespring;\r\n\r\n//ConcreteHandler\r\npublic class HR implements ApproveHandler {\r\n\r\n\tprivate ApproveHandler nextHandler;\r\n\t\r\n\tpublic final static int MAX_LEAVES_CAN_APPROVE = 30;\r\n\r\n\tpublic void setNextHandler(ApproveHandler nextHandler) {\r\n\t\tthis.nextHandler = nextHandler;\r\n\t}\r\n\r\n\tpublic void approve(Leave leave) {\r\n\t\tif (leave.getNumberOfDays() < MAX_LEAVES_CAN_APPROVE) {\r\n\t\t\tString output = String.format(\r\n\t\t\t\t\t\"LeaveId: %d, Days: %d, Approver: %s\", \r\n\t\t\t\t\tleave.getLeaveId(), \r\n\t\t\t\t\tleave.getNumberOfDays(), \r\n\t\t\t\t\t\"HR\");\r\n\t\t\tSystem.out.println(output);\r\n\t\t} else {\r\n\t\t\tif (nextHandler != null) {\r\n\t\t\t\tnextHandler.approve(leave);\r\n\t\t\t} else {\r\n\t\t\t\tSystem.out.println(\"Leave application suspended, Please contact HR\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/Leave.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// 请求对象\r\npublic class Leave {\r\n\tprivate int leaveId;\r\n\tprivate int numberOfDays;\r\n\t\r\n\tpublic Leave(int leaveId, int numberOfDays) {\r\n\t\tthis.leaveId = leaveId;\r\n\t\tthis.numberOfDays = numberOfDays;\r\n\t}\r\n\r\n\t// region getter/setter\r\n\tpublic int getLeaveId() {\r\n\t\treturn leaveId;\r\n\t}\r\n\r\n\tpublic void setLeaveId(int leaveId) {\r\n\t\tthis.leaveId = leaveId;\r\n\t}\r\n\r\n\tpublic int getNumberOfDays() {\r\n\t\treturn numberOfDays;\r\n\t}\r\n\r\n\tpublic void setNumberOfDays(int numberOfDays) {\r\n\t\tthis.numberOfDays = numberOfDays;\r\n\t}\r\n\t// endregion\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/ProjectLeader.java",
    "content": "package io.spring2go.corespring;\r\n\r\n//ConcreteHandler\r\npublic class ProjectLeader implements ApproveHandler {\r\n\r\n\tprivate ApproveHandler nextHandler;\r\n\t\r\n\tpublic final static int MAX_LEAVES_CAN_APPROVE = 20;\r\n\r\n\tpublic void setNextHandler(ApproveHandler nextHandler) {\r\n\t\tthis.nextHandler = nextHandler;\r\n\t}\r\n\r\n\tpublic void approve(Leave leave) {\r\n\t\tif (leave.getNumberOfDays() < MAX_LEAVES_CAN_APPROVE) {\r\n\t\t\tString output = String.format(\r\n\t\t\t\t\t\"LeaveId: %d, Days: %d, Approver: %s\", \r\n\t\t\t\t\tleave.getLeaveId(), \r\n\t\t\t\t\tleave.getNumberOfDays(), \r\n\t\t\t\t\t\"ProjectLeader\");\r\n\t\t\tSystem.out.println(output);\r\n\t\t} else {\r\n\t\t\tif (nextHandler != null) {\r\n\t\t\t\tnextHandler.approve(leave);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/TeamLeader.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// ConcreteHandler\r\npublic class TeamLeader implements ApproveHandler {\r\n\t\r\n\tprivate ApproveHandler nextHandler;\r\n\t\r\n\tpublic final static int MAX_LEAVES_CAN_APPROVE = 10;\r\n\r\n\tpublic void setNextHandler(ApproveHandler nextHandler) {\r\n\t\tthis.nextHandler = nextHandler;\r\n\t}\r\n\r\n\tpublic void approve(Leave leave) {\r\n\t\tif (leave.getNumberOfDays() < MAX_LEAVES_CAN_APPROVE) {\r\n\t\t\tString output = String.format(\r\n\t\t\t\t\t\"LeaveId: %d, Days: %d, Approver: %s\", \r\n\t\t\t\t\tleave.getLeaveId(), \r\n\t\t\t\t\tleave.getNumberOfDays(), \r\n\t\t\t\t\t\"TeamLeader\");\r\n\t\t\tSystem.out.println(output);\r\n\t\t} else {\r\n\t\t\tif (nextHandler != null) {\r\n\t\t\t\tnextHandler.approve(leave);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Command</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/CloseFileCommand.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Concrete Command\r\npublic class CloseFileCommand implements Command {\r\n\r\n\tprivate FileSystemReceiver fileSystem;\r\n\t\r\n\tpublic CloseFileCommand(FileSystemReceiver fs) {\r\n\t\tthis.fileSystem = fs;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void execute() {\r\n\t\tthis.fileSystem.closeFile();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/Command.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Command interface\r\npublic interface Command {\r\n\t\r\n\tvoid execute();\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileInvoker.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Invoker\r\npublic class FileInvoker {\r\n\r\n\tprivate Command command;\r\n\t\r\n\tpublic FileInvoker(Command c) {\r\n\t\tthis.command = c;\r\n\t}\r\n\t\r\n\tpublic void execute() {\r\n\t\tthis.command.execute();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileSystemClient.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Client\r\npublic class FileSystemClient {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// creating the receiver object\r\n\t\tFileSystemReceiver fs = FileSystemReceiverUtil.getUnderlyingFileSystem();\r\n\t\t\r\n\t\t// creating command and associating with receiver\r\n\t\tOpenFileCommand openFileCommand = new OpenFileCommand(fs);\r\n\t\t\r\n\t\t// creating invoker and associating with Command\r\n\t\tFileInvoker file = new FileInvoker(openFileCommand);\r\n\t\t\r\n\t\t// perform action on invoker object\r\n\t\tfile.execute();\r\n\t\t\r\n\t\tWriteFileCommand writeFileCommand = new WriteFileCommand(fs);\r\n\t\tfile = new FileInvoker(writeFileCommand);\r\n\t\tfile.execute();\r\n\t\t\r\n\t\tCloseFileCommand closeFileCommand = new CloseFileCommand(fs);\r\n\t\tfile = new FileInvoker(closeFileCommand);\r\n\t\tfile.execute();\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileSystemReceiver.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Receiver Interface\r\npublic interface FileSystemReceiver {\r\n\tvoid openFile();\r\n\tvoid writeFile();\r\n\tvoid closeFile();\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileSystemReceiverUtil.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\npublic class FileSystemReceiverUtil {\r\n\t\r\n\tpublic static FileSystemReceiver getUnderlyingFileSystem() {\r\n\t\tString osName = System.getProperty(\"os.name\");\r\n\t\tSystem.out.println(\"Underlying OS is : \" + osName);\r\n\t\tif (osName.contains(\"Windows\")) {\r\n\t\t\treturn new WindowsFileSystemReceiver();\r\n\t\t} else {\r\n\t\t\treturn new UnixFileSystemReceiver();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/OpenFileCommand.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Concrete Command\r\npublic class OpenFileCommand implements Command {\r\n\r\n\tprivate FileSystemReceiver fileSystem;\r\n\t\r\n\tpublic OpenFileCommand(FileSystemReceiver fs) {\r\n\t\tthis.fileSystem = fs;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void execute() {\r\n\t\t// open command is forwarding request to openFile method\r\n\t\tthis.fileSystem.openFile();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/UnixFileSystemReceiver.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Receiver\r\npublic class UnixFileSystemReceiver implements FileSystemReceiver {\r\n\r\n\t@Override\r\n\tpublic void openFile() {\r\n\t\tSystem.out.println(\"Opening file in unix OS\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void writeFile() {\r\n\t\tSystem.out.println(\"Writing file in unix OS\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void closeFile() {\r\n\t\tSystem.out.println(\"Closing file in unix OS\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/WindowsFileSystemReceiver.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Receiver\r\npublic class WindowsFileSystemReceiver implements FileSystemReceiver {\r\n\r\n\t@Override\r\n\tpublic void openFile() {\r\n\t\tSystem.out.println(\"Opening file in Windows OS\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void writeFile() {\r\n\t\tSystem.out.println(\"Writing file in Windows OS\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void closeFile() {\r\n\t\tSystem.out.println(\"Closing file in Windows OS\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/WriteFileCommand.java",
    "content": "package io.spring2go.corespring.command;\r\n\r\n// Concrete Command\r\npublic class WriteFileCommand implements Command {\r\n\r\n\tprivate FileSystemReceiver fileSystem;\r\n\t\r\n\tpublic WriteFileCommand(FileSystemReceiver fs) {\r\n\t\tthis.fileSystem = fs;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void execute() {\r\n\t\tthis.fileSystem.writeFile();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/command/src/main/java/io/spring2go/corespring/command/uml.ucls",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<class-diagram version=\"1.2.2\" icons=\"true\" always-add-relationships=\"false\" generalizations=\"true\" realizations=\"true\" \r\n  associations=\"true\" dependencies=\"false\" nesting-relationships=\"true\" router=\"FAN\">  \r\n  <interface id=\"1\" language=\"java\" name=\"io.spring2go.corespring.command.FileSystemReceiver\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/FileSystemReceiver.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"867\" y=\"271\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <class id=\"2\" language=\"java\" name=\"io.spring2go.corespring.command.WindowsFileSystemReceiver\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/WindowsFileSystemReceiver.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"1167\" y=\"382\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"3\" language=\"java\" name=\"io.spring2go.corespring.command.UnixFileSystemReceiver\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/UnixFileSystemReceiver.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"1156\" y=\"131\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <interface id=\"4\" language=\"java\" name=\"io.spring2go.corespring.command.Command\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/Command.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"144\" y=\"270\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <class id=\"5\" language=\"java\" name=\"io.spring2go.corespring.command.WriteFileCommand\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/WriteFileCommand.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"491\" y=\"90\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"6\" language=\"java\" name=\"io.spring2go.corespring.command.CloseFileCommand\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/CloseFileCommand.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"495\" y=\"273\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"7\" language=\"java\" name=\"io.spring2go.corespring.command.OpenFileCommand\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/OpenFileCommand.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"495\" y=\"479\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"8\" language=\"java\" name=\"io.spring2go.corespring.command.FileSystemClient\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/FileSystemClient.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"477\" y=\"681\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"9\" language=\"java\" name=\"io.spring2go.corespring.command.FileInvoker\" project=\"Command\" \r\n    file=\"/Command/src/main/java/io/spring2go/corespring/command/FileInvoker.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"179\" y=\"583\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <realization id=\"10\">    \r\n    <end type=\"SOURCE\" refId=\"7\"/>    \r\n    <end type=\"TARGET\" refId=\"4\"/>  \r\n  </realization>  \r\n  <realization id=\"11\">    \r\n    <end type=\"SOURCE\" refId=\"2\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <realization id=\"12\">    \r\n    <end type=\"SOURCE\" refId=\"6\"/>    \r\n    <end type=\"TARGET\" refId=\"4\"/>  \r\n  </realization>  \r\n  <association id=\"13\">    \r\n    <end type=\"SOURCE\" refId=\"6\" navigable=\"false\">      \r\n      <attribute id=\"14\" name=\"fileSystem\"/>      \r\n      <multiplicity id=\"15\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <realization id=\"16\">    \r\n    <end type=\"SOURCE\" refId=\"5\"/>    \r\n    <end type=\"TARGET\" refId=\"4\"/>  \r\n  </realization>  \r\n  <association id=\"17\">    \r\n    <end type=\"SOURCE\" refId=\"5\" navigable=\"false\">      \r\n      <attribute id=\"18\" name=\"fileSystem\"/>      \r\n      <multiplicity id=\"19\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <association id=\"20\">    \r\n    <end type=\"SOURCE\" refId=\"9\" navigable=\"false\">      \r\n      <attribute id=\"21\" name=\"command\"/>      \r\n      <multiplicity id=\"22\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"4\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <association id=\"23\">    \r\n    <end type=\"SOURCE\" refId=\"7\" navigable=\"false\">      \r\n      <attribute id=\"24\" name=\"fileSystem\"/>      \r\n      <multiplicity id=\"25\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <realization id=\"26\">    \r\n    <end type=\"SOURCE\" refId=\"3\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <classifier-display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n    sort-features=\"false\" accessors=\"true\" visibility=\"true\">    \r\n    <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>  \r\n  </classifier-display>  \r\n  <association-display labels=\"true\" multiplicity=\"true\"/>\r\n</class-diagram>"
  },
  {
    "path": "patterns/behavior/interpreter/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Interpreter</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n\r\n</project>"
  },
  {
    "path": "patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/App.java",
    "content": "package io.spring2go.corespring.interpreter;\r\n\r\nimport java.util.Stack;\r\n\r\n// Interpreter\r\npublic class App {\r\n\r\n\t/**\r\n\t * Expression can be evaluated using prefix, infix or postfix notations\r\n\t * This sample uses postfix, where operator comes after the operands.\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tString tokenString = \"4 3 2 - 1 + *\"; // (3 - 2 + 1) * 4\r\n\t\tStack<Expression> stack = new Stack<>();\r\n\t\t\r\n\t\tString[] tokenList = tokenString.split(\" \");\r\n\t\tfor(String s : tokenList) {\r\n\t\t\tif (isOperator(s)) {\r\n\t\t\t\tExpression rightExpression = stack.pop();\r\n\t\t\t\tExpression leftExpression = stack.pop();\r\n\t\t\t\tExpression operator = \r\n\t\t\t\t\t\tgetOperatorInstance(s, leftExpression, rightExpression);\r\n\t\t\t\tint result = operator.interpret();\r\n\t\t\t\tNumberExpression resultExpression = new NumberExpression(result);\r\n\t\t\t\tstack.push(resultExpression);\r\n\t\t\t} else {\r\n\t\t\t\tExpression i = new NumberExpression(s);\r\n\t\t\t\tstack.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tSystem.out.println(\"result: \" + stack.pop().interpret());\r\n\t}\r\n\r\n\tpublic static boolean isOperator(String s) {\r\n\t\treturn s.equals(\"+\") || s.equals(\"-\") || s.equals(\"*\");\r\n \t}\r\n\t\r\n\t// Get expression for string\r\n\tpublic static Expression getOperatorInstance(\r\n\t\t\tString s, Expression left, Expression right) {\r\n\t\tswitch (s) {\r\n\t\tcase \"+\":\r\n\t\t\treturn new PlusExpression(left, right);\r\n\t\tcase \"-\":\r\n\t\t\treturn new MinusExpression(left, right);\r\n\t\tcase \"*\":\r\n\t\t\treturn new MultiplyExpression(left, right);\r\n\t\tdefault:\r\n\t\t\treturn new MultiplyExpression(left, right);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/Expression.java",
    "content": "package io.spring2go.corespring.interpreter;\r\n\r\n// Expression\r\npublic abstract class Expression {\r\n\t\r\n\tpublic abstract int interpret();\r\n\t\r\n\t@Override\r\n\tpublic abstract String toString();\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/MinusExpression.java",
    "content": "package io.spring2go.corespring.interpreter;\r\n\r\n// MinusExpression\r\npublic class MinusExpression extends Expression {\r\n\r\n\tprivate Expression leftExpression;\r\n\tprivate Expression rightExpression;\r\n\t\r\n\tpublic MinusExpression(\r\n\t\t\tExpression leftExpression, \r\n\t\t\tExpression rightExpression) {\r\n\t\tthis.leftExpression = leftExpression;\r\n\t\tthis.rightExpression = rightExpression;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int interpret() {\r\n\t\treturn leftExpression.interpret() - rightExpression.interpret();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"-\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/MultiplyExpression.java",
    "content": "package io.spring2go.corespring.interpreter;\r\n\r\n// MultiplyExpression\r\npublic class MultiplyExpression extends Expression {\r\n\r\n\tprivate Expression leftExpression;\r\n\tprivate Expression rightExpression;\r\n\t\r\n\tpublic MultiplyExpression(\r\n\t\t\tExpression leftExpression, \r\n\t\t\tExpression rightExpression) {\r\n\t\tthis.leftExpression = leftExpression;\r\n\t\tthis.rightExpression = rightExpression;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int interpret() {\r\n\t\treturn leftExpression.interpret() * rightExpression.interpret();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"*\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/NumberExpression.java",
    "content": "package io.spring2go.corespring.interpreter;\r\n\r\n// NumberExpression\r\npublic class NumberExpression extends Expression {\r\n\r\n\tprivate int number;\r\n\t\r\n\tpublic NumberExpression(int number) {\r\n\t\tthis.number = number;\r\n\t}\r\n\t\r\n\tpublic NumberExpression(String s) {\r\n\t\tthis.number = Integer.parseInt(s);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int interpret() {\r\n\t\treturn number;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"number\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/PlusExpression.java",
    "content": "package io.spring2go.corespring.interpreter;\r\n\r\n// PlusExpression\r\npublic class PlusExpression extends Expression {\r\n\r\n\tprivate Expression leftExpression;\r\n\tprivate Expression rightExpression;\r\n\t\r\n\tpublic PlusExpression(\r\n\t\t\tExpression leftExpression, \r\n\t\t\tExpression rightExpression) {\r\n\t\tthis.leftExpression = leftExpression;\r\n\t\tthis.rightExpression = rightExpression;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int interpret() {\r\n\t\treturn leftExpression.interpret() + rightExpression.interpret();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"+\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/uml.ucls",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<class-diagram version=\"1.2.2\" icons=\"true\" always-add-relationships=\"false\" generalizations=\"true\" realizations=\"true\" \r\n  associations=\"true\" dependencies=\"false\" nesting-relationships=\"true\" router=\"FAN\">  \r\n  <class id=\"1\" language=\"java\" name=\"io.spring2go.corespring.interpreter.Expression\" project=\"Interpreter\" \r\n    file=\"/Interpreter/src/main/java/io/spring2go/corespring/interpreter/Expression.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"472\" y=\"185\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"2\" language=\"java\" name=\"io.spring2go.corespring.interpreter.MinusExpression\" project=\"Interpreter\" \r\n    file=\"/Interpreter/src/main/java/io/spring2go/corespring/interpreter/MinusExpression.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"172\" y=\"496\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"3\" language=\"java\" name=\"io.spring2go.corespring.interpreter.MultiplyExpression\" project=\"Interpreter\" \r\n    file=\"/Interpreter/src/main/java/io/spring2go/corespring/interpreter/MultiplyExpression.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"482\" y=\"495\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"4\" language=\"java\" name=\"io.spring2go.corespring.interpreter.NumberExpression\" project=\"Interpreter\" \r\n    file=\"/Interpreter/src/main/java/io/spring2go/corespring/interpreter/NumberExpression.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"109\" y=\"186\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"5\" language=\"java\" name=\"io.spring2go.corespring.interpreter.PlusExpression\" project=\"Interpreter\" \r\n    file=\"/Interpreter/src/main/java/io/spring2go/corespring/interpreter/PlusExpression.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"807\" y=\"495\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <association id=\"6\">    \r\n    <end type=\"SOURCE\" refId=\"5\" navigable=\"false\">      \r\n      <attribute id=\"7\" name=\"rightExpression\"/>      \r\n      <multiplicity id=\"8\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <generalization id=\"9\">    \r\n    <end type=\"SOURCE\" refId=\"2\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </generalization>  \r\n  <association id=\"10\">    \r\n    <end type=\"SOURCE\" refId=\"3\" navigable=\"false\">      \r\n      <attribute id=\"11\" name=\"rightExpression\"/>      \r\n      <multiplicity id=\"12\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <association id=\"13\">    \r\n    <end type=\"SOURCE\" refId=\"2\" navigable=\"false\">      \r\n      <attribute id=\"14\" name=\"rightExpression\"/>      \r\n      <multiplicity id=\"15\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <generalization id=\"16\">    \r\n    <end type=\"SOURCE\" refId=\"5\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </generalization>  \r\n  <association id=\"17\">    \r\n    <end type=\"SOURCE\" refId=\"2\" navigable=\"false\">      \r\n      <attribute id=\"18\" name=\"leftExpression\"/>      \r\n      <multiplicity id=\"19\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <generalization id=\"20\">    \r\n    <end type=\"SOURCE\" refId=\"3\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </generalization>  \r\n  <association id=\"21\">    \r\n    <end type=\"SOURCE\" refId=\"3\" navigable=\"false\">      \r\n      <attribute id=\"22\" name=\"leftExpression\"/>      \r\n      <multiplicity id=\"23\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <generalization id=\"24\">    \r\n    <end type=\"SOURCE\" refId=\"4\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </generalization>  \r\n  <association id=\"25\">    \r\n    <end type=\"SOURCE\" refId=\"5\" navigable=\"false\">      \r\n      <attribute id=\"26\" name=\"leftExpression\"/>      \r\n      <multiplicity id=\"27\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <classifier-display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n    sort-features=\"false\" accessors=\"true\" visibility=\"true\">    \r\n    <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>  \r\n  </classifier-display>  \r\n  <association-display labels=\"true\" multiplicity=\"true\"/>\r\n</class-diagram>"
  },
  {
    "path": "patterns/behavior/iterator/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Iterator</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/App.java",
    "content": "package io.spring2go.corespring.iterator;\r\n\r\n// Client App\r\npublic class App {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tChannelCollection channels = populateChannels();\r\n\t\tChannelIterator baseIterator = channels.iterator(ChannelTypeEnum.ALL);\r\n\t\twhile (baseIterator.hasNext()) {\r\n\t\t\tChannel c = baseIterator.next();\r\n\t\t\tSystem.out.println(c.toString());\r\n\t\t}\r\n\t\tSystem.out.println(\"******\");\r\n\t\t// Channel Type Iterator\r\n\t\tChannelIterator englishIterator = channels.iterator(ChannelTypeEnum.ENGLISH);\r\n\t\twhile (englishIterator.hasNext()) {\r\n\t\t\tChannel c = englishIterator.next();\r\n\t\t\tSystem.out.println(c.toString());\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static ChannelCollection populateChannels() {\r\n\t\tChannelCollection channels = new ChannelCollectionImpl();\r\n\t\tchannels.addChannel(new Channel(98.5, ChannelTypeEnum.ENGLISH));\r\n\t\tchannels.addChannel(new Channel(99.5, ChannelTypeEnum.CHINESE));\r\n\t\tchannels.addChannel(new Channel(100.5, ChannelTypeEnum.FRENCH));\r\n\t\tchannels.addChannel(new Channel(101.5, ChannelTypeEnum.ENGLISH));\r\n\t\tchannels.addChannel(new Channel(102.5, ChannelTypeEnum.CHINESE));\r\n\t\tchannels.addChannel(new Channel(103.5, ChannelTypeEnum.FRENCH));\r\n\t\tchannels.addChannel(new Channel(104.5, ChannelTypeEnum.ENGLISH));\r\n\t\tchannels.addChannel(new Channel(105.5, ChannelTypeEnum.CHINESE));\r\n\t\tchannels.addChannel(new Channel(106.5, ChannelTypeEnum.FRENCH));\r\n\t\treturn channels;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/Channel.java",
    "content": "package io.spring2go.corespring.iterator;\r\n\r\npublic class Channel {\r\n\tprivate double frequency;\r\n\tprivate ChannelTypeEnum type;\r\n\t\r\n\tpublic Channel(double freq, ChannelTypeEnum type) {\r\n\t\tthis.frequency = freq;\r\n\t\tthis.type = type;\r\n\t}\r\n\t\r\n\tpublic double getFrequency() {\r\n\t\treturn frequency;\r\n\t}\r\n\t\r\n\tpublic ChannelTypeEnum getType() {\r\n\t\treturn type;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Frequency = \" + this.frequency + \", Type = \" + this.type;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelCollection.java",
    "content": "package io.spring2go.corespring.iterator;\r\n\r\n// Aggregate\r\npublic interface ChannelCollection {\r\n\t\r\n\tpublic void addChannel(Channel c);\r\n\t\r\n\tpublic void removeChannel(Channel c);\r\n\t\r\n\tpublic ChannelIterator iterator(ChannelTypeEnum type);\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelCollectionImpl.java",
    "content": "package io.spring2go.corespring.iterator;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\n// ConcreteAggregate\r\npublic class ChannelCollectionImpl implements ChannelCollection {\r\n\r\n\tprivate List<Channel> channelList;\r\n\t\r\n\tpublic ChannelCollectionImpl() {\r\n\t\tchannelList = new ArrayList<>();\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void addChannel(Channel c) {\r\n\t\tthis.channelList.add(c);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void removeChannel(Channel c) {\r\n\t\tthis.channelList.remove(c);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic ChannelIterator iterator(ChannelTypeEnum type) {\r\n\t\treturn new ChannelIteratorImpl(type, this.channelList);\r\n\t}\r\n\t\r\n\t// ConcreteIterator\r\n\tprivate class ChannelIteratorImpl implements ChannelIterator {\r\n\t\tprivate ChannelTypeEnum type;\r\n\t\tprivate List<Channel> channels;\r\n\t\tprivate int position;\r\n\t\t\r\n\t\tpublic ChannelIteratorImpl(ChannelTypeEnum type, \r\n\t\t\t\tList<Channel> channelList) {\r\n\t\t\tthis.type = type;\r\n\t\t\tthis.channels = channelList;\r\n\t\t}\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic boolean hasNext() {\r\n\t\t\twhile (position < channels.size()) {\r\n\t\t\t\tChannel c = channels.get(position);\r\n\t\t\t\tif (c.getType().equals(type) || \r\n\t\t\t\t\t\ttype.equals(ChannelTypeEnum.ALL)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tposition++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic Channel next() {\r\n\t\t\tChannel c = channels.get(position);\r\n\t\t\tposition++;\r\n\t\t\treturn c;\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelIterator.java",
    "content": "package io.spring2go.corespring.iterator;\r\n\r\n// Iterator\r\npublic interface ChannelIterator {\r\n\t\r\n\tpublic boolean hasNext();\r\n\t\r\n\tpublic Channel next();\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelTypeEnum.java",
    "content": "package io.spring2go.corespring.iterator;\r\n\r\npublic enum ChannelTypeEnum {\r\n\tENGLISH, CHINESE, FRENCH, ALL;\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/uml.ucls",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<class-diagram version=\"1.2.2\" icons=\"true\" always-add-relationships=\"false\" generalizations=\"true\" realizations=\"true\" \r\n  associations=\"true\" dependencies=\"false\" nesting-relationships=\"true\" router=\"FAN\">  \r\n  <interface id=\"1\" language=\"java\" name=\"io.spring2go.corespring.iterator.ChannelIterator\" project=\"Iterator\" \r\n    file=\"/Iterator/src/main/java/io/spring2go/corespring/iterator/ChannelIterator.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"1018\" y=\"68\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <interface id=\"2\" language=\"java\" name=\"io.spring2go.corespring.iterator.ChannelCollection\" project=\"Iterator\" \r\n    file=\"/Iterator/src/main/java/io/spring2go/corespring/iterator/ChannelCollection.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"456\" y=\"76\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <enumeration id=\"3\" language=\"java\" name=\"io.spring2go.corespring.iterator.ChannelTypeEnum\" project=\"Iterator\" \r\n    file=\"/Iterator/src/main/java/io/spring2go/corespring/iterator/ChannelTypeEnum.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"1051\" y=\"549\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </enumeration>  \r\n  <class id=\"4\" language=\"java\" name=\"io.spring2go.corespring.iterator.Channel\" project=\"Iterator\" \r\n    file=\"/Iterator/src/main/java/io/spring2go/corespring/iterator/Channel.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"739\" y=\"548\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"5\" language=\"java\" name=\"io.spring2go.corespring.iterator.ChannelCollectionImpl.ChannelIteratorImpl\" \r\n    project=\"Iterator\" file=\"/Iterator/src/main/java/io/spring2go/corespring/iterator/ChannelCollectionImpl.java\" \r\n    binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"1017\" y=\"304\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"6\" language=\"java\" name=\"io.spring2go.corespring.iterator.ChannelCollectionImpl\" project=\"Iterator\" \r\n    file=\"/Iterator/src/main/java/io/spring2go/corespring/iterator/ChannelCollectionImpl.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"455\" y=\"307\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"7\" language=\"java\" name=\"io.spring2go.corespring.iterator.App\" project=\"Iterator\" \r\n    file=\"/Iterator/src/main/java/io/spring2go/corespring/iterator/App.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"124\" width=\"245\" x=\"154\" y=\"507\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <association id=\"8\">    \r\n    <end type=\"SOURCE\" refId=\"6\" navigable=\"false\">      \r\n      <attribute id=\"9\" name=\"channelList\"/>      \r\n      <multiplicity id=\"10\" minimum=\"0\" maximum=\"2147483647\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"4\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <association id=\"11\">    \r\n    <end type=\"SOURCE\" refId=\"4\" navigable=\"false\">      \r\n      <attribute id=\"12\" name=\"type\"/>      \r\n      <multiplicity id=\"13\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"3\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <realization id=\"14\">    \r\n    <end type=\"SOURCE\" refId=\"5\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <realization id=\"15\">    \r\n    <end type=\"SOURCE\" refId=\"6\"/>    \r\n    <end type=\"TARGET\" refId=\"2\"/>  \r\n  </realization>  \r\n  <association id=\"16\">    \r\n    <end type=\"SOURCE\" refId=\"5\" navigable=\"false\">      \r\n      <attribute id=\"17\" name=\"channels\"/>      \r\n      <multiplicity id=\"18\" minimum=\"0\" maximum=\"2147483647\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"4\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <nesting id=\"19\">    \r\n    <end type=\"SOURCE\" refId=\"6\"/>    \r\n    <end type=\"TARGET\" refId=\"5\"/>  \r\n  </nesting>  \r\n  <association id=\"20\">    \r\n    <end type=\"SOURCE\" refId=\"5\" navigable=\"false\">      \r\n      <attribute id=\"21\" name=\"type\"/>      \r\n      <multiplicity id=\"22\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"3\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <classifier-display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n    sort-features=\"false\" accessors=\"true\" visibility=\"true\">    \r\n    <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>  \r\n  </classifier-display>  \r\n  <association-display labels=\"true\" multiplicity=\"true\"/>\r\n</class-diagram>"
  },
  {
    "path": "patterns/behavior/observer/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.patterns</groupId>\r\n\t<artifactId>Observer</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/Follower.java",
    "content": "package io.spring2go.patterns.observer;\r\n\r\npublic class Follower implements Observer {\r\n\t\r\n\tprivate String followerName;\r\n\t\r\n\tpublic Follower(String followerName) {\r\n\t\tthis.followerName = followerName;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void update(String oaName, String article) {\r\n\t\tSystem.out.println(followerName + \" has received \" \r\n\t              + oaName + \"'s article :: \" + article );\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn followerName;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/Observer.java",
    "content": "package io.spring2go.patterns.observer;\r\n\r\n// The Observers are notified when the Subject changes\r\npublic interface Observer {\r\n\t\r\n\tpublic void update(String name, String s);\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/ObserverPatternMain.java",
    "content": "package io.spring2go.patterns.observer;\r\n\r\npublic class ObserverPatternMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tOfficialAccount bobo = new OfficialAccount(\"bobo\");\r\n\t\tOfficialAccount infoq = new OfficialAccount(\"infoq\");\r\n\t\t\r\n\t\tFollower mark = new Follower(\"Mark\");\r\n\t\tFollower eric = new Follower(\"Eric\");\r\n\t\tFollower jack = new Follower(\"Jack\");\r\n\t\tFollower frank = new Follower(\"Frank\");\r\n\t\tFollower daniel = new Follower(\"Daniel\");\r\n\t\tFollower alice = new Follower(\"Alice\");\r\n\t\t\r\n\t\tbobo.register(mark);\r\n\t\tbobo.register(eric);\r\n\t\tbobo.register(jack);\r\n\t\t\r\n\t\tinfoq.register(frank);\r\n\t\tinfoq.register(daniel);\r\n\t\tinfoq.register(alice);\r\n\t\t\r\n\t\tbobo.pushArticle(\"observer design pattern video course\");\r\n\t\tinfoq.pushArticle(\"spring 5.0 is out\");\r\n\r\n\t\tbobo.unregister(eric);\r\n\t\t\r\n\t\tbobo.pushArticle(\"core java course is released\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/OfficialAccount.java",
    "content": "package io.spring2go.patterns.observer;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\npublic class OfficialAccount implements Subject {\r\n\t\r\n\tprivate String oaName;\r\n\tprivate List<Observer> followers;\r\n\r\n\tpublic OfficialAccount(String oaName) {\r\n\t\tthis.oaName = oaName;\r\n\t\tfollowers = new ArrayList<Observer>();\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void register(Observer o) {\r\n\t\tfollowers.add(o);\r\n\t\tSystem.out.println(o + \" has started following \" + oaName);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void unregister(Observer o) {\r\n\t\tfollowers.remove(o);\r\n\t\tSystem.out.println(o + \" has stopped following \" + oaName);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void notifyAllObservers(String article) {\r\n\t\tfor(Observer follower : followers) {\r\n\t\t\tfollower.update(oaName, article);\r\n\t\t}\r\n\t\tSystem.out.println();\r\n\t}\r\n\t\r\n\tpublic void pushArticle(String article) {\r\n\t\tSystem.out.println(\"\\n\" + oaName + \" has pushed :: \" + article);\r\n\t\tnotifyAllObservers(article);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/Subject.java",
    "content": "package io.spring2go.patterns.observer;\r\n\r\n// interface for adding, deleting \r\n// and updating all observers\r\npublic interface Subject {\r\n\tpublic void register(Observer o);\r\n\tpublic void unregister(Observer o);\r\n\tpublic void notifyAllObservers(String s);\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/uml.ucls",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<class-diagram version=\"1.2.2\" icons=\"true\" always-add-relationships=\"false\" generalizations=\"true\" realizations=\"true\" \r\n  associations=\"true\" dependencies=\"false\" nesting-relationships=\"true\" router=\"FAN\">  \r\n  <interface id=\"1\" language=\"java\" name=\"io.spring2go.patterns.observer.Observer\" project=\"Observer\" \r\n    file=\"/Observer/src/main/java/io/spring2go/patterns/observer/Observer.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"557\" y=\"193\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <class id=\"2\" language=\"java\" name=\"io.spring2go.patterns.observer.Follower\" project=\"Observer\" \r\n    file=\"/Observer/src/main/java/io/spring2go/patterns/observer/Follower.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"557\" y=\"463\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"3\" language=\"java\" name=\"io.spring2go.patterns.observer.OfficialAccount\" project=\"Observer\" \r\n    file=\"/Observer/src/main/java/io/spring2go/patterns/observer/OfficialAccount.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"178\" width=\"198\" x=\"840\" y=\"364\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <interface id=\"4\" language=\"java\" name=\"io.spring2go.patterns.observer.Subject\" project=\"Observer\" \r\n    file=\"/Observer/src/main/java/io/spring2go/patterns/observer/Subject.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"940\" y=\"205\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <association id=\"5\">    \r\n    <end type=\"SOURCE\" refId=\"3\" navigable=\"false\">      \r\n      <attribute id=\"6\" name=\"followers\"/>      \r\n      <multiplicity id=\"7\" minimum=\"0\" maximum=\"2147483647\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <realization id=\"8\">    \r\n    <end type=\"SOURCE\" refId=\"3\"/>    \r\n    <end type=\"TARGET\" refId=\"4\"/>  \r\n  </realization>  \r\n  <realization id=\"9\">    \r\n    <end type=\"SOURCE\" refId=\"2\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <classifier-display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n    sort-features=\"false\" accessors=\"true\" visibility=\"true\">    \r\n    <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>  \r\n  </classifier-display>  \r\n  <association-display labels=\"true\" multiplicity=\"true\"/>\r\n</class-diagram>"
  },
  {
    "path": "patterns/behavior/strategy/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Strategy</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/HeapSortStrategy.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.List;\r\n\r\npublic class HeapSortStrategy implements SortingStrategy {\r\n\r\n\t@Override\r\n\tpublic void sort(List<Integer> list) {\r\n\t\tSystem.out.println(\"Sorting using heap sort\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/MergeSortStrategy.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.List;\r\n\r\n// ConcreteStrategy\r\npublic class MergeSortStrategy implements SortingStrategy {\r\n\r\n\t@Override\r\n\tpublic void sort(List<Integer> list) {\r\n\t\tSystem.out.println(\"Sorting List using merge sort\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/QuickSortStrategy.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.List;\r\n\r\n// ConcreteStrategy\r\npublic class QuickSortStrategy implements SortingStrategy {\r\n\r\n\t@Override\r\n\tpublic void sort(List<Integer> list) {\r\n\t\tSystem.out.println(\"Sorting List using quick sort\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingMainV1.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.Arrays;\r\nimport java.util.List;\r\n\r\npublic class SortingMainV1 {\r\n\tpublic static void main(String[] args) {\r\n\t\tList list = Arrays.asList(new Integer[] { 44, 5, 3, 5, 5, 64, 3 });\r\n\r\n\t\tSortingManagerV1 sm = new SortingManagerV1(list);\r\n\r\n\t\t// Sorting using merge sort\r\n\t\tsm.sortListBasedOnType(SortingType.MERGE_SORT);\r\n\r\n\t\tSystem.out.println();\r\n\r\n\t\t// Sorting using quick sort\r\n\t\tsm.sortListBasedOnType(SortingType.QUICK_SORT);\r\n\r\n\t\tSystem.out.println();\r\n\r\n\t\t// Sorting using heap sort\r\n\t\tsm.sortListBasedOnType(SortingType.HEAP_SORT);\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingMainV2.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.Arrays;\r\nimport java.util.List;\r\n\r\npublic class SortingMainV2 {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tList<Integer> list = Arrays.asList(new Integer[] { 44, 5, 3, 5, 5, 64, 3 });\r\n\t\tMergeSortStrategy mergeSortStrategy = new MergeSortStrategy();\r\n\t\tSortingManagerV2 sm = new SortingManagerV2(list, mergeSortStrategy);\r\n\t\tsm.sortList();\r\n\r\n\t\tSystem.out.println();\r\n\r\n\t\tQuickSortStrategy quickSort = new QuickSortStrategy();\r\n\t\tsm.setSortingStrategy(quickSort);\r\n\t\tsm.sortList();\r\n\r\n\t\tSystem.out.println();\r\n\r\n\t\tHeapSortStrategy heapSort = new HeapSortStrategy();\r\n\t\tsm.setSortingStrategy(heapSort);\r\n\t\tsm.sortList();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingManagerV1.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.List;\r\n\r\npublic class SortingManagerV1 {\r\n\tList list;\r\n\r\n\tpublic SortingManagerV1(List list) {\r\n\t\tthis.list = list;\r\n\t}\r\n\r\n\tpublic void sortListBasedOnType(SortingType sortingType) {\r\n\t\tSystem.out.println(\"===================================\");\r\n\t\tSystem.out.println(\"Sorting List based on Type\");\r\n\t\tSystem.out.println(\"===================================\");\r\n\r\n\t\tif (SortingType.MERGE_SORT == sortingType) {\r\n\t\t\tsortListUsingMergeSort();\r\n\t\t} else if (SortingType.QUICK_SORT == sortingType) {\r\n\t\t\tsortListUsingQuickSort();\r\n\t\t} else if (SortingType.HEAP_SORT == sortingType) {\r\n\t\t\tsortListUsingHeapSort();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void sortListUsingMergeSort() {\r\n\t\tSystem.out.println(\"Sorting List using merge sort\");\r\n\t}\r\n\r\n\tprivate void sortListUsingQuickSort() {\r\n\t\tSystem.out.println(\"Sorting List using quick sort\");\r\n\t}\r\n\r\n\tprivate void sortListUsingHeapSort() {\r\n\t\tSystem.out.println(\"Sorting List using heap sort\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingManagerV2.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.List;\r\n\r\npublic class SortingManagerV2 {\r\n\tSortingStrategy sortingStrategy;\r\n\tList<Integer> list;\r\n\r\n\tpublic SortingManagerV2(List<Integer> list, SortingStrategy sortingStrategy) {\r\n\t\tsuper();\r\n\t\tthis.list = list;\r\n\t\tthis.sortingStrategy = sortingStrategy;\r\n\t}\r\n\r\n\tpublic void sortList() {\r\n\t\tSystem.out.println(\"===================================\");\r\n\t\tSystem.out.println(\"Sorting List based on Type\");\r\n\t\tSystem.out.println(\"===================================\");\r\n\r\n\t\tsortingStrategy.sort(list);\r\n\t}\r\n\r\n\tpublic SortingStrategy getSortingStrategy() {\r\n\t\treturn sortingStrategy;\r\n\t}\r\n\r\n\tpublic void setSortingStrategy(SortingStrategy sortingStrategy) {\r\n\t\tthis.sortingStrategy = sortingStrategy;\r\n\t}\r\n\r\n\tpublic List<Integer> getList() {\r\n\t\treturn list;\r\n\t}\r\n\r\n\tpublic void setList(List<Integer> list) {\r\n\t\tthis.list = list;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingStrategy.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\nimport java.util.List;\r\n\r\n// Strategy\r\npublic interface SortingStrategy {\r\n\tvoid sort(List<Integer> list);\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingType.java",
    "content": "package io.spring2go.corespring.strategy;\r\n\r\npublic enum SortingType {\r\n\tMERGE_SORT, QUICK_SORT, HEAP_SORT;\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/uml.ucls",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<class-diagram version=\"1.2.2\" icons=\"true\" always-add-relationships=\"false\" generalizations=\"true\" realizations=\"true\" \r\n  associations=\"true\" dependencies=\"false\" nesting-relationships=\"true\" router=\"FAN\">  \r\n  <interface id=\"1\" language=\"java\" name=\"io.spring2go.corespring.strategy.SortingStrategy\" project=\"Strategy\" \r\n    file=\"/Strategy/src/main/java/io/spring2go/corespring/strategy/SortingStrategy.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"721\" y=\"244\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <class id=\"2\" language=\"java\" name=\"io.spring2go.corespring.strategy.MergeSortStrategy\" project=\"Strategy\" \r\n    file=\"/Strategy/src/main/java/io/spring2go/corespring/strategy/MergeSortStrategy.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"106\" width=\"187\" x=\"388\" y=\"398\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"3\" language=\"java\" name=\"io.spring2go.corespring.strategy.QuickSortStrategy\" project=\"Strategy\" \r\n    file=\"/Strategy/src/main/java/io/spring2go/corespring/strategy/QuickSortStrategy.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"722\" y=\"452\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"4\" language=\"java\" name=\"io.spring2go.corespring.strategy.HeapSortStrategy\" project=\"Strategy\" \r\n    file=\"/Strategy/src/main/java/io/spring2go/corespring/strategy/HeapSortStrategy.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"978\" y=\"453\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"5\" language=\"java\" name=\"io.spring2go.corespring.strategy.SortingManagerV2\" project=\"Strategy\" \r\n    file=\"/Strategy/src/main/java/io/spring2go/corespring/strategy/SortingManagerV2.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"352\" y=\"244\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"6\" language=\"java\" name=\"io.spring2go.corespring.strategy.SortingMainV2\" project=\"Strategy\" \r\n    file=\"/Strategy/src/main/java/io/spring2go/corespring/strategy/SortingMainV2.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"40\" y=\"247\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <realization id=\"7\">    \r\n    <end type=\"SOURCE\" refId=\"2\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <realization id=\"8\">    \r\n    <end type=\"SOURCE\" refId=\"4\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <realization id=\"9\">    \r\n    <end type=\"SOURCE\" refId=\"3\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <association id=\"10\">    \r\n    <end type=\"SOURCE\" refId=\"5\" navigable=\"false\">      \r\n      <attribute id=\"11\" name=\"sortingStrategy\"/>      \r\n      <multiplicity id=\"12\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <classifier-display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n    sort-features=\"false\" accessors=\"true\" visibility=\"true\">    \r\n    <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>  \r\n  </classifier-display>  \r\n  <association-display labels=\"true\" multiplicity=\"true\"/>\r\n</class-diagram>"
  },
  {
    "path": "patterns/behavior/template/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.patterns.template</groupId>\r\n\t<artifactId>Template</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/behavior/template/src/main/java/io/spring2go/patterns/template/CSVDataParser.java",
    "content": "package io.spring2go.patterns.template;\r\n\r\npublic class CSVDataParser extends DataParser {\r\n\r\n\t@Override\r\n\tvoid readData() {\r\n\t\tSystem.out.println(\"Reading data from csv file\");\r\n\t}\r\n\r\n\t@Override\r\n\tvoid processData() {\r\n\t\tSystem.out.println(\"Looping through loaded csv file\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/template/src/main/java/io/spring2go/patterns/template/DataParser.java",
    "content": "package io.spring2go.patterns.template;\r\n\r\nabstract class DataParser {\r\n\t\r\n\t// generic data processing flow\r\n\tpublic final void process() {\r\n\t\treadData();\r\n\t\tprocessData();\r\n\t\twriteData();\r\n\t}\r\n\t\r\n\t// implemented by subclass\r\n\tabstract void readData();\r\n\tabstract void processData();\r\n\t\r\n\t// same for all subclass\r\n\tpublic void writeData() {\r\n\t\tSystem.out.println(\"Ouput generated, writing to CSV\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/template/src/main/java/io/spring2go/patterns/template/DatabaseDataParser.java",
    "content": "package io.spring2go.patterns.template;\r\n\r\npublic class DatabaseDataParser extends DataParser {\r\n\r\n\t@Override\r\n\tvoid readData() {\r\n\t\tSystem.out.println(\"Reading data from database\");\r\n\t}\r\n\r\n\t@Override\r\n\tvoid processData() {\r\n\t\tSystem.out.println(\"Looping through records in DB\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/behavior/template/src/main/java/io/spring2go/patterns/template/TemplateMethodMain.java",
    "content": "package io.spring2go.patterns.template;\r\n\r\npublic class TemplateMethodMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tCSVDataParser csvDataParser = new CSVDataParser();\r\n\t\tcsvDataParser.process();\r\n\t\tSystem.out.println(\"**********************\");\r\n\t\tDatabaseDataParser databaseDataParser = new DatabaseDataParser();\r\n\t\tdatabaseDataParser.process();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>AbstractFactory</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/AbstractFactoryMain.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\npublic class AbstractFactoryMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\t// 国产\r\n\t\tIElectricalFactory electricalFactory = new ChineseElectricalFactory();\r\n\t\t\r\n\t\tIFan fan = electricalFactory.createFan();\r\n\t\t\r\n\t\tfan.swithOn();\r\n\t\t\r\n\t\t// 美产\r\n\t\telectricalFactory = new USElectricalFactory();\r\n\t\t\r\n\t\tITubeLight tubeLight = electricalFactory.createTubeLight();\r\n\t\ttubeLight.swithOn();\r\n\t\ttubeLight.tuneLight();\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ChineseElectricalFactory.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\npublic class ChineseElectricalFactory implements IElectricalFactory {\r\n\r\n\tpublic IFan createFan() {\r\n\t\treturn new ChineseFan();\r\n\t}\r\n\r\n\tpublic ITubeLight createTubeLight() {\r\n\t\treturn new ChineseTubeLight();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ChineseFan.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\npublic class ChineseFan implements IFan {\r\n\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The ChineseFan is swithed on ...\");\r\n\t}\r\n\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The ChineseFan is swithed off ...\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ChineseTubeLight.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\npublic class ChineseTubeLight implements ITubeLight {\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The ChineseTubeLight is swithed on ...\");\r\n\t}\r\n\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The ChineseTubeLight is swithed off ...\");\r\n\t}\r\n\r\n\tpublic void tuneLight() {\r\n\t\tSystem.out.println(\"The ChineseTubeLight is tuned ...\");\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/IElectricalFactory.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\n// 电器工厂接口\r\npublic interface IElectricalFactory {\r\n\t\r\n\tIFan createFan();\r\n\t\r\n\tITubeLight createTubeLight();\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/IFan.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\n// 电扇接口\r\npublic interface IFan {\r\n\t\r\n\tpublic void swithOn();\r\n\t\r\n\tpublic void switchOff();\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ITubeLight.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\n// 日光灯接口\r\npublic interface ITubeLight {\r\n\tpublic void swithOn();\r\n\t\r\n\tpublic void switchOff();\r\n\t\r\n\tpublic void tuneLight();\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/USElectricalFactory.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\npublic class USElectricalFactory  implements IElectricalFactory {\r\n\r\n\tpublic IFan createFan() {\r\n\t\treturn new USFan();\r\n\t}\r\n\r\n\tpublic ITubeLight createTubeLight() {\r\n\t\treturn new USTubeLight();\r\n\t}\r\n\r\n}"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/USFan.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\npublic class USFan implements IFan {\r\n\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The USFan is swithed on ...\");\r\n\t}\r\n\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The USFan is swithed off ...\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/USTubeLight.java",
    "content": "package io.spring2go.corespring.abstractfactory;\r\n\r\npublic class USTubeLight implements ITubeLight {\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The USTubeLight is swithed on ...\");\r\n\t}\r\n\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The USTubeLight is swithed off ...\");\r\n\t}\r\n\r\n\tpublic void tuneLight() {\r\n\t\tSystem.out.println(\"The USTubeLight is tuned ...\");\t\r\n\t}\r\n}"
  },
  {
    "path": "patterns/creation/builder/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Builder</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n\r\n</project>"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/AndroidPhoneBuilder.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 安卓手机具体构建者\"ConcreteBuilder\"\r\npublic class AndroidPhoneBuilder implements IMobilePhoneBuilder {\r\n\t\r\n\tprivate MobilePhone phone;\r\n\r\n\tpublic AndroidPhoneBuilder() {\r\n\t\tthis.phone = new MobilePhone(\"Android Phone\");\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void buildScreen() {\r\n\t\tphone.setPhoneScreen(ScreenType.SCREENTYPE_TOUCH_RESISTIVE);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void buildBattery() {\r\n\t\tphone.setPhoneBattery(Battery.MAH_1500);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void buildOS() {\r\n\t\tphone.setPhoneOS(OperatingSystem.ANDROID);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void buildStylus() {\r\n\t\tphone.setPhoneStylus(Stylus.YES);\r\n\t}\r\n\r\n\t// 获得最终构建出来的产品\r\n\t@Override\r\n\tpublic MobilePhone getPhone() {\r\n\t\treturn this.phone;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/Battery.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 电池容量\r\npublic enum Battery {\r\n\tMAH_1000,\r\n\tMAH_1500,\r\n\tMAH_2000\r\n}\r\n\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/ClassicBuilderMain.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 客户程序\r\npublic class ClassicBuilderMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// 先创建导演Director\r\n\t\tManufacturer manufacturer = new Manufacturer();\r\n\t\t// 先准备Builder接口\r\n\t\tIMobilePhoneBuilder phoneBuilder = null;\r\n\t\t\r\n\t\t// 制造一部安卓手机\r\n\t\tphoneBuilder = new AndroidPhoneBuilder();\r\n\t\tmanufacturer.construct(phoneBuilder);\r\n\t\tString output = String.format(\"A new Phone built:\\n\\n%s\", phoneBuilder.getPhone().toString());\r\n\t\tSystem.out.println(output);\r\n\t\t\r\n\t\t// 制造一部Windows手机\r\n\t\tphoneBuilder = new WindowsPhoneBuilder();\r\n\t\tmanufacturer.construct(phoneBuilder);\r\n\t\toutput = String.format(\"A new Phone built:\\n\\n%s\", phoneBuilder.getPhone().toString());\r\n\t\tSystem.out.println(output);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/IMobilePhoneBuilder.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 这个是构建者\"Builder\"接口\r\npublic interface IMobilePhoneBuilder {\r\n\tvoid buildScreen();\r\n\tvoid buildBattery();\r\n\tvoid buildOS();\r\n\tvoid buildStylus();\r\n\tMobilePhone getPhone();\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/Manufacturer.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 这个是导演\"Director\"\r\npublic class Manufacturer {\r\n\tpublic void construct(IMobilePhoneBuilder phoneBuilder) {\r\n\t\tphoneBuilder.buildBattery();\r\n\t\tphoneBuilder.buildOS();\r\n\t\tphoneBuilder.buildScreen();\r\n\t\tphoneBuilder.buildStylus();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/MobilePhone.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 这是\"Product\"产品类\r\npublic class MobilePhone {\r\n\t// 部件类型\r\n\tprivate String phoneName;\r\n\tprivate ScreenType phoneScreen;\r\n\tprivate Battery phoneBattery;\r\n\tprivate OperatingSystem phoneOS;\r\n\tprivate Stylus phoneStylus;\r\n\r\n\t// region 访问手机组件的getter/setter公开方法\r\n\tpublic MobilePhone(String name) {\r\n\t\tthis.phoneName = name;\r\n\t}\r\n\r\n\tpublic String getPhoneName() {\r\n\t\treturn phoneName;\r\n\t}\r\n\r\n\tpublic ScreenType getPhoneScreen() {\r\n\t\treturn phoneScreen;\r\n\t}\r\n\r\n\tpublic void setPhoneScreen(ScreenType phoneScreen) {\r\n\t\tthis.phoneScreen = phoneScreen;\r\n\t}\r\n\r\n\tpublic Battery getPhoneBattery() {\r\n\t\treturn phoneBattery;\r\n\t}\r\n\r\n\tpublic void setPhoneBattery(Battery phoneBattery) {\r\n\t\tthis.phoneBattery = phoneBattery;\r\n\t}\r\n\r\n\tpublic OperatingSystem getPhoneOS() {\r\n\t\treturn phoneOS;\r\n\t}\r\n\r\n\tpublic void setPhoneOS(OperatingSystem phoneOS) {\r\n\t\tthis.phoneOS = phoneOS;\r\n\t}\r\n\r\n\tpublic Stylus getPhoneStylus() {\r\n\t\treturn phoneStylus;\r\n\t}\r\n\r\n\tpublic void setPhoneStylus(Stylus phoneStylus) {\r\n\t\tthis.phoneStylus = phoneStylus;\r\n\t}\r\n\t// endregion\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn String.format(\"Name: %s\\nScreen: %s\\nBattery: %s\\nOS: %s\\nStylus: %s\\n\", this.phoneName,\r\n\t\t\t\tthis.phoneScreen, this.phoneBattery, this.phoneOS, this.phoneStylus);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/OperatingSystem.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 操作系统\r\npublic enum OperatingSystem {\r\n\tANDROID,\r\n\tWINDOWS_MOBILE,\r\n\tWINDOWS_PHONE,\r\n\tSYMBIAN\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/ScreenType.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 屏幕类型\r\npublic enum ScreenType {\r\n\tSCREENTYPE_TOUCH_CAPACITIVE, // 电容式\r\n\tSCREENTYPE_TOUCH_RESISTIVE, // 电阻式\r\n\tSCREENTYPE_NON_TOUCH\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/Stylus.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// 触控笔\r\npublic enum Stylus {\r\n\tYES,\r\n\tNO\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/WindowsPhoneBuilder.java",
    "content": "package io.spring2go.corespring.classicbuilder;\r\n\r\n// Windows手机具体构建者\"ConcreteBuilder\"\r\npublic class WindowsPhoneBuilder implements IMobilePhoneBuilder  {\r\n\r\n\tprivate MobilePhone phone;\r\n\t\r\n\tpublic WindowsPhoneBuilder() {\r\n\t\tthis.phone = new MobilePhone(\"Windows Phone\");\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void buildScreen() {\r\n\t\tphone.setPhoneScreen(ScreenType.SCREENTYPE_TOUCH_CAPACITIVE);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void buildBattery() {\r\n\t\tphone.setPhoneBattery(Battery.MAH_2000);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void buildOS() {\r\n\t\tphone.setPhoneOS(OperatingSystem.WINDOWS_PHONE);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void buildStylus() {\r\n\t\tphone.setPhoneStylus(Stylus.NO);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic MobilePhone getPhone() {\r\n\t\treturn this.phone;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/javabean/JavaBeanMain.java",
    "content": "package io.spring2go.corespring.javabean;\r\n\r\npublic class JavaBeanMain {\r\n\r\n\t// JavaBean构造对象\r\n\tpublic static void main(String[] args) {\r\n\t\tUser user = new User();\r\n\t\tuser.setFirstName(\"william\");\r\n\t\tuser.setLastName(\"yang\");\r\n\t\tuser.setAge(35);\r\n\t\tuser.setPhone(\"18001756666\");\r\n\t\tuser.setAddress(\"shanghai pudong\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/javabean/User.java",
    "content": "package io.spring2go.corespring.javabean;\r\n\r\n// JavaBeans模式\r\npublic class User {\r\n\t\r\n\t//region 私有成员\r\n\tprivate String firstName;\r\n\tprivate String lastName;\r\n\tprivate int age;\r\n\tprivate String phone;\r\n\tprivate String address;\r\n\t//endregion\r\n\t\r\n\tpublic User() {}\r\n\t\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\tpublic void setFirstName(String firstName) {\r\n\t\tthis.firstName = firstName;\r\n\t}\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n\tpublic void setLastName(String lastName) {\r\n\t\tthis.lastName = lastName;\r\n\t}\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\tpublic void setAge(int age) {\r\n\t\tthis.age = age;\r\n\t}\r\n\tpublic String getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\tpublic void setPhone(String phone) {\r\n\t\tthis.phone = phone;\r\n\t}\r\n\tpublic String getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\tpublic void setAddress(String address) {\r\n\t\tthis.address = address;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/modernbuilder/ModernBuilderMain.java",
    "content": "package io.spring2go.corespring.modernbuilder;\r\n\r\npublic class ModernBuilderMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tUser user1 = new User.UserBuilder(\"william\", \"Yang\")\r\n\t\t\t\t.age(35)\r\n\t\t\t\t.phone(\"123456\")\r\n\t\t\t\t.address(\"Fake address 1234\")\r\n\t\t\t\t.build();\r\n\t\t\r\n\t\tSystem.out.println(user1);\r\n\t\t\r\n\t\tUser user2 = new User.UserBuilder(\"Jack\", \"Liu\")\r\n\t\t\t\t.age(40)\r\n\t\t\t\t.phone(\"5655\")\r\n\t\t\t\t//no address\r\n\t\t\t\t.build();\r\n\t\t\r\n\t\tSystem.out.println(user2);\r\n\t\t\r\n\t\tUser user3 = new User.UserBuilder(\"Frank\", \"Han\")\r\n\t\t\t\t//no age\r\n\t\t\t\t//no phone\r\n\t\t\t\t//no address\r\n\t\t\t\t.build();\r\n\t\t\r\n\t\tSystem.out.println(user3);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/modernbuilder/User.java",
    "content": "package io.spring2go.corespring.modernbuilder;\r\n\r\n// 流畅接口(Fluent Interface)\r\npublic class User {\r\n\t// 所有字段final\r\n\tprivate final String firstName; // 必须\r\n\tprivate final String lastName; // 必须\r\n\tprivate final int age; // 可选\r\n\tprivate final String phone; // 可选\r\n\tprivate final String address; // 可选\r\n\r\n\tprivate User(UserBuilder builder) {\r\n\t\tthis.firstName = builder.firstName;\r\n\t\tthis.lastName = builder.lastName;\r\n\t\tthis.age = builder.age;\r\n\t\tthis.phone = builder.phone;\r\n\t\tthis.address = builder.address;\r\n\t}\r\n\r\n\t// 全部是getter，没有setter，保证不可变性immutability\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\r\n\tpublic String getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\r\n\tpublic String getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"User: \" + this.firstName + \", \" \r\n\t           + this.lastName + \", \" + this.age + \", \" \r\n\t\t\t   + this.phone + \", \" + this.address;\r\n\t}\r\n\r\n\tpublic static class UserBuilder {\r\n\t\tprivate final String firstName;\r\n\t\tprivate final String lastName;\r\n\t\tprivate int age;\r\n\t\tprivate String phone;\r\n\t\tprivate String address;\r\n\r\n\t\tpublic UserBuilder(String firstName, String lastName) {\r\n\t\t\tthis.firstName = firstName;\r\n\t\t\tthis.lastName = lastName;\r\n\t\t}\r\n\r\n\t\tpublic UserBuilder age(int age) {\r\n\t\t\tthis.age = age;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tpublic UserBuilder phone(String phone) {\r\n\t\t\tthis.phone = phone;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tpublic UserBuilder address(String address) {\r\n\t\t\tthis.address = address;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// 返回最终构造的用户对象\r\n\t\tpublic User build() {\r\n\t\t\tUser user = new User(this);\r\n\t\t\tvalidateUserObject(user);\r\n\t\t\treturn user;\r\n\t\t}\r\n\r\n\t\tprivate void validateUserObject(User user) {\r\n\t\t\t// 基本的验证检查\r\n\t\t\t// 确保用户对象不违反系统假设\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/builder/src/main/java/io/spring2go/corespring/telescoping_constructor/User.java",
    "content": "package io.spring2go.corespring.telescoping_constructor;\r\n\r\n// 显微镜构造函数模式\r\npublic class User {\r\n\t\r\n\t// region 私有成员\r\n\tprivate String firstName;\r\n\tprivate String lastName;\r\n\tprivate int age;\r\n\tprivate String phone;\r\n\tprivate String address;\r\n\t// endregion\r\n\r\n\tpublic User(String firstName, String lastName, int age, String phone) {\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t\tthis.age = age;\r\n\t\tthis.phone = phone;\r\n\t}\r\n\t\r\n\tpublic User(String firstName, String lastName, String phone, String address) {\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t\tthis.phone = phone;\r\n\t\tthis.address = address;\r\n\t}\r\n\t\r\n\tpublic User(String firstName, String lastName, int age) {\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t\tthis.age = age;\r\n\t}\r\n\t\r\n\tpublic User(String firstName, String lastName) {\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t}\r\n\r\n\t// region public getter\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\r\n\tpublic String getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\r\n\tpublic String getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\t// endregion\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>FactoryMethod</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/CeilingFan.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\n// 吊扇\r\npublic class CeilingFan implements IFan {\r\n\r\n\t@Override\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The CeilingFan is swithed on ...\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The CeilingFan is swithed off ...\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/CeilingFanFactory.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\npublic class CeilingFanFactory implements IFanFactory {\r\n\r\n\t@Override\r\n\tpublic IFan createFan() {\r\n\t\treturn new CeilingFan();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/ExhaustFan.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\npublic class ExhaustFan implements IFan {\r\n\r\n\t@Override\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The ExhaustFan is swithed on ...\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The ExhaustFan is swithed off ...\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/ExhaustFanFactory.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\npublic class ExhaustFanFactory implements IFanFactory {\r\n\r\n\t@Override\r\n\tpublic IFan createFan() {\r\n\t\treturn new ExhaustFan();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/FactoryMethodMain.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\n//客户端代码\r\npublic class FactoryMethodMain {\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tIFanFactory fanFactory = new PropellerFanFactory();\r\n\t\t\r\n\t\t// 使用工厂方法创建一个电扇\r\n\t\tIFan fan = fanFactory.createFan();\r\n\t\t\r\n\t\t// 使用创建的对象\r\n\t\tfan.swithOn();\r\n\t\t\r\n\t\tfan.switchOff();\r\n\t}\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/IFan.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\npublic interface IFan {\r\n\t\r\n\tpublic void swithOn();\r\n\t\r\n\tpublic void switchOff();\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/IFanFactory.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\npublic interface IFanFactory {\r\n\tIFan createFan();\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/PropellerFan.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\n// 螺旋桨式通风扇\r\npublic class PropellerFan implements IFan {\r\n\r\n\t@Override\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The PropellerFan is swithed on ...\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The PropellerFan is swithed off ...\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/PropellerFanFactory.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\npublic class PropellerFanFactory implements IFanFactory {\r\n\r\n\t@Override\r\n\tpublic IFan createFan() {\r\n\t\treturn new PropellerFan();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/TableFan.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\n// 台扇\r\npublic class TableFan implements IFan {\r\n\r\n\t@Override\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The TableFan is swithed on ...\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The TableFan is swithed off ...\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/TableFanFactory.java",
    "content": "package io.spring2go.corespring.factorymethod;\r\n\r\npublic class TableFanFactory implements IFanFactory {\r\n\r\n\t@Override\r\n\tpublic IFan createFan() {\r\n\t\treturn new TableFan();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>SimpleFactory</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/nofactory/NoFactoryMain.java",
    "content": "package io.spring2go.corespring.nofactory;\r\n\r\npublic class NoFactoryMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tTableFan fan = new TableFan();\r\n\t\tfan.switchOn();\r\n\t}\r\n\r\n}\r\n\r\nclass TableFan {\r\n\tpublic void switchOn() {\r\n\t\tSystem.out.println(\"The TableFan is switched on ...\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/CeilingFan.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\npublic class CeilingFan implements IFan {\r\n\r\n\t@Override\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The CeilingFan is swithed on ...\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The CeilingFan is swithed off ...\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/ExhaustFan.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\npublic class ExhaustFan implements IFan {\r\n\r\n\t@Override\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The ExhaustFan is swithed on ...\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The ExhaustFan is swithed off ...\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/FanFactory.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\npublic class FanFactory implements IFanFactory {\r\n\r\n\t@Override\r\n\tpublic IFan createFan(FanType type) {\r\n\t\tswitch (type) {\r\n\t\tcase TableFan:\r\n\t\t\treturn new TableFan();\r\n\t\tcase CeilingFan:\r\n\t\t\treturn new CeilingFan();\r\n\t\tcase ExhaustFan:\r\n\t\t\treturn new ExhaustFan();\r\n\t\tdefault:\r\n\t\t\treturn new TableFan();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/FanType.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\npublic enum FanType {\r\n\t\r\n\tTableFan, //台扇\r\n\tCeilingFan, //吊扇\r\n\tExhaustFan // 排风扇\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/IFan.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\npublic interface IFan {\r\n\t\r\n\tpublic void swithOn();\r\n\t\r\n\tpublic void switchOff();\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/IFanFactory.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\npublic interface IFanFactory {\r\n\tIFan createFan(FanType type);\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/SimpleFactoryMain.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\n// 客户端代码\r\npublic class SimpleFactoryMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tIFanFactory simpleFactory = new FanFactory();\r\n\t\t// 使用简单工厂创建一个电扇\r\n\t\tIFan fan = simpleFactory.createFan(FanType.TableFan);\r\n\t\tfan.swithOn();\r\n\t\tfan.switchOff();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/TableFan.java",
    "content": "package io.spring2go.corespring.simplefactory;\r\n\r\npublic class TableFan implements IFan {\r\n\r\n\t@Override\r\n\tpublic void swithOn() {\r\n\t\tSystem.out.println(\"The TableFan is swithed on ...\");\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void switchOff() {\r\n\t\tSystem.out.println(\"The TableFan is swithed off ...\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/singleton/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Singleton</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton/v3/BillPughSingleton.java",
    "content": "package io.spring2go.corespring.singleton.v3;\r\n\r\n// 比尔.普夫单例\r\npublic class BillPughSingleton {\r\n\t// 私有构造函数，避免被客户端代码使用\r\n\tprivate BillPughSingleton() {}\r\n\r\n\tprivate static class LazyHolder {\r\n\t\tprivate static final BillPughSingleton INSTANCE = new BillPughSingleton();\r\n\t}\r\n\r\n\tpublic static BillPughSingleton getInstance() {\r\n\t\treturn LazyHolder.INSTANCE;\r\n\t}\r\n}"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton/v4/EnumSingleton.java",
    "content": "package io.spring2go.corespring.singleton.v4;\r\n\r\n// 枚举单例\r\npublic enum EnumSingleton {\r\n    INSTANCE;\r\n \r\n    // 添加单例方法\r\n    public void method() {\r\n        System.out.println(\"Singleton method called...\");\r\n    }\r\n}\r\n"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton/v4/TestEnumSingleton.java",
    "content": "package io.spring2go.corespring.singleton.v4;\r\n\r\npublic class TestEnumSingleton {\r\n\r\n   public static void main(String[] args) {\r\n       EnumSingleton.INSTANCE.method();\r\n   }\r\n\r\n}"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_deserialization/DemoSingleton.java",
    "content": "package io.spring2go.corespring.singleton_deserialization;\r\n\r\nimport java.io.Serializable;\r\n\r\npublic class DemoSingleton implements Serializable {\r\n\tprivate static final long serialVersionUID = -7604766932017737115L;\r\n    \r\n    private static class LazyHolder{\r\n        private static final DemoSingleton INSTANCE = new DemoSingleton();\r\n    }\r\n    \r\n    public static DemoSingleton getInstance(){\r\n        return LazyHolder.INSTANCE;\r\n    }\r\n\r\n    // 确保反序列化单例\r\n    protected Object readResolve() {\r\n    \treturn getInstance();\r\n    }\r\n}"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_deserialization/SerializationTest.java",
    "content": "package io.spring2go.corespring.singleton_deserialization;\r\n\r\nimport java.io.FileInputStream;\r\nimport java.io.FileNotFoundException;\r\nimport java.io.FileOutputStream;\r\nimport java.io.IOException;\r\nimport java.io.ObjectInput;\r\nimport java.io.ObjectInputStream;\r\nimport java.io.ObjectOutput;\r\nimport java.io.ObjectOutputStream;\r\n\r\npublic class SerializationTest {\r\n\r\n    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {\r\n        DemoSingleton instanceOne = DemoSingleton.getInstance();\r\n        ObjectOutput out = new ObjectOutputStream(new FileOutputStream(\r\n                \"filename.ser\"));\r\n        out.writeObject(instanceOne);\r\n        out.close();\r\n        \r\n        // 从文件反序列化到对象\r\n        ObjectInput in = new ObjectInputStream(new FileInputStream(\r\n                \"filename.ser\"));\r\n        DemoSingleton instanceTwo = (DemoSingleton) in.readObject();\r\n        in.close();\r\n        \r\n        System.out.println(\"instanceOne hashCode=\"+instanceOne.hashCode());\r\n        System.out.println(\"instanceTwo hashCode=\"+instanceTwo.hashCode());\r\n        \r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_reflection/ReflectionSingleton.java",
    "content": "package io.spring2go.corespring.singleton_reflection;\r\n\r\npublic class ReflectionSingleton {\r\n\tprivate static ReflectionSingleton INSTANCE;\r\n\r\n    private ReflectionSingleton() {\r\n    \t//throw new InstantiationError(\"不能通过反射创建单例\");\r\n    }\r\n    \r\n\tpublic static synchronized ReflectionSingleton getInstance() {\r\n\t\tif (INSTANCE == null) {\r\n\t\t\tINSTANCE = new ReflectionSingleton();\r\n\t\t}\r\n\t\treturn INSTANCE;\r\n\t}\r\n}"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_reflection/ReflectionTest.java",
    "content": "package io.spring2go.corespring.singleton_reflection;\r\n\r\nimport java.lang.reflect.Constructor;\r\n\r\npublic class ReflectionTest {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tReflectionSingleton instanceOne = ReflectionSingleton.getInstance();\r\n\t\tReflectionSingleton instanceTwo = null;\r\n\t\ttry {\r\n\t\t\tConstructor constructor = ReflectionSingleton.class.getDeclaredConstructor();\r\n\t\t\t// 下面的代码会破坏单例\r\n\t\t\tconstructor.setAccessible(true);\r\n\t\t\t// 创建第二个实例\r\n\t\t\tinstanceTwo = (ReflectionSingleton) constructor.newInstance();\r\n\t\t} catch (Exception e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\tSystem.out.println(instanceOne.hashCode());\r\n\t\tSystem.out.println(instanceTwo.hashCode());\r\n\t}\r\n}"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v1/EagerSingleton.java",
    "content": "package io.spring2go.corespring.singleton_v1;\r\n\r\n// 提前初始化单例\r\npublic class EagerSingleton {\r\n\tprivate static final EagerSingleton INSTANCE = new EagerSingleton();\r\n\r\n\t// 私有构造函数，避免被客户端代码使用\r\n\tprivate EagerSingleton() {}\r\n\r\n\tpublic static EagerSingleton getInstance() {\r\n\t\treturn INSTANCE;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v1_1/StaticBlockSingleton.java",
    "content": "package io.spring2go.corespring.singleton_v1_1;\r\n\r\n// 静态初始化块单例\r\npublic class StaticBlockSingleton {\r\n\tprivate static final StaticBlockSingleton INSTANCE;\r\n\r\n\t// 私有构造函数，避免被客户端使用\r\n\tprivate StaticBlockSingleton() {}\r\n\r\n\tstatic {\r\n\t\ttry {\r\n\t\t\tINSTANCE = new StaticBlockSingleton();\r\n\t\t} catch (Exception e) { // 异常处理\r\n\t\t\tthrow new RuntimeException(\"Uffff, i was not expecting this!\", e);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static StaticBlockSingleton getInstance() {\r\n\t\treturn INSTANCE;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v2/LazySingleton.java",
    "content": "package io.spring2go.corespring.singleton_v2;\r\n\r\n// 延迟初始化单例\r\npublic class LazySingleton {\r\n    private static LazySingleton INSTANCE;\r\n    \r\n    private LazySingleton(){}\r\n    \r\n    public static LazySingleton getInstance(){\r\n        if(INSTANCE == null){\r\n        \tINSTANCE = new LazySingleton();\r\n        }\r\n        return INSTANCE;\r\n    }\r\n}\r\n"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v2_1/ThreadSafeSingleton.java",
    "content": "package io.spring2go.corespring.singleton_v2_1;\r\n\r\n// ̰߳ȫ\r\npublic class ThreadSafeSingleton {\r\n\tprivate static ThreadSafeSingleton INSTANCE;\r\n\t\r\n\t// ˽й캯ⱻͻ˴ʹ\r\n\tprivate ThreadSafeSingleton(){}\r\n\r\n\tpublic static synchronized ThreadSafeSingleton getInstance() {\r\n\t\tif (INSTANCE == null) {\r\n\t\t\tINSTANCE = new ThreadSafeSingleton();\r\n\t\t}\r\n\t\treturn INSTANCE;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v2_2/DoubleCheckLockingSingleton.java",
    "content": "package io.spring2go.corespring.singleton_v2_2;\r\n\r\n// 双重检查锁定单例\r\npublic class DoubleCheckLockingSingleton {\r\n\tprivate static volatile DoubleCheckLockingSingleton INSTANCE;\r\n\r\n\t// 私有构造函数，避免被客户端代码使用\r\n\tprivate DoubleCheckLockingSingleton() {}\r\n\r\n\tpublic static DoubleCheckLockingSingleton getInstance() {\r\n\t\tif (INSTANCE == null) {\r\n\t\t\tsynchronized (DoubleCheckLockingSingleton.class) {\r\n\t\t\t\t// 双重检查\r\n\t\t\t\tif (INSTANCE == null) {\r\n\t\t\t\t\tINSTANCE = new DoubleCheckLockingSingleton();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn INSTANCE;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>DependencyInversion</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/injection/AppMonitorConstructorInjection.java",
    "content": "package io.spring2go.corespring.injection;\r\n\r\nimport io.spring2go.corespring.ioc.EventLogWriter;\r\nimport io.spring2go.corespring.ioc.INotifier;\r\n\r\npublic class AppMonitorConstructorInjection {\r\n\t// 事件通知器\r\n\tprivate INotifier notifier = null;\r\n\t\r\n\tpublic AppMonitorConstructorInjection(INotifier notifier) {\r\n\t\tthis.notifier = notifier;\r\n\t}\r\n\t\r\n\t// 应用有问题时该方法被调用\r\n\tpublic void notify(String message) {\r\n\t\tnotifier.notify(message);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tEventLogWriter writer = new EventLogWriter();\r\n\t\tAppMonitorConstructorInjection monitor = \r\n\t\t\t\tnew AppMonitorConstructorInjection(writer);\r\n\t\tmonitor.notify(\"App has a problem ...\");\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/injection/AppMonitorSetterInjection.java",
    "content": "package io.spring2go.corespring.injection;\r\n\r\nimport io.spring2go.corespring.ioc.EventLogWriter;\r\nimport io.spring2go.corespring.ioc.INotifier;\r\n\r\npublic class AppMonitorSetterInjection {\r\n\t// 事件通知器\r\n\tprivate INotifier notifier = null;\r\n\t\r\n\tpublic void SetNotifier(INotifier notifier) {\r\n\t\tthis.notifier = notifier;\r\n\t}\r\n\t\r\n\t// 应用有问题时该方法被调用\r\n\tpublic void notify(String message) {\r\n\t\tnotifier.notify(message);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tEventLogWriter writer = new EventLogWriter();\r\n\t\tAppMonitorSetterInjection monitor = \r\n\t\t\t\tnew AppMonitorSetterInjection();\r\n\t\t// 可以在其它类中设置\r\n\t\tmonitor.SetNotifier(writer);\r\n\t\t// 可以在其它类中调用\r\n\t\tmonitor.notify(\"App has a problem ...\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/AppMonitorIOC.java",
    "content": "package io.spring2go.corespring.ioc;\r\n\r\npublic class AppMonitorIOC {\r\n\t// 事件通知器\r\n\tprivate INotifier notifier = null;\r\n\t\r\n\t// 应用有问题时该方法被调用\r\n\tpublic void notify(String message) {\r\n\t\tif (notifier == null) {\r\n\t\t\t// 将抽象接口映射到具体类\r\n\t\t\tnotifier = new EventLogWriter();\r\n\t\t}\r\n\t\tnotifier.notify(message);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tAppMonitorIOC appMonitor = new AppMonitorIOC();\r\n\t\tappMonitor.notify(\"App has a problem ...\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/EmailSender.java",
    "content": "package io.spring2go.corespring.ioc;\r\n\r\npublic class EmailSender implements INotifier {\r\n\r\n\tpublic void notify(String message) {\r\n\t\t// 发送Email\r\n\t\tSystem.out.println(\"Send email, message : \" + message);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/EventLogWriter.java",
    "content": "package io.spring2go.corespring.ioc;\r\n\r\npublic class EventLogWriter implements INotifier {\r\n\r\n\tpublic void notify(String message) {\r\n\t\t// 写到事件日志\r\n\t\tSystem.out.println(\"Write to event log, message : \" + message);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/INotifier.java",
    "content": "package io.spring2go.corespring.ioc;\r\n\r\n// 事件通知器接口\r\npublic interface INotifier {\r\n\tpublic void notify(String message);\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/SMSSender.java",
    "content": "package io.spring2go.corespring.ioc;\r\n\r\npublic class SMSSender implements INotifier {\r\n\r\n\tpublic void notify(String message) {\r\n\t\t// 发送短消息\r\n\t\tSystem.out.println(\"Send SMS, message : \" + message);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/nodip/AppMonitorNoDIP.java",
    "content": "package io.spring2go.corespring.nodip;\r\n\r\npublic class AppMonitorNoDIP {\r\n\r\n\t// 负责将事件日志写到日志系统\r\n\tprivate EventLogWriter writer = null;\r\n\t\r\n\t// 应用有问题时该方法将被调用\r\n\tpublic void notify(String message) {\r\n\t\tif (writer == null) {\r\n\t\t\twriter = new EventLogWriter();\r\n\t\t}\r\n\t\twriter.write(message);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tAppMonitorNoDIP appMonitor = new AppMonitorNoDIP();\r\n\t\tappMonitor.notify(\"App has a problem ...\");\r\n\t}\r\n}\r\n\r\nclass EventLogWriter {\r\n\t\r\n\tpublic void write(String message) {\r\n\t\t// 写到事件日志\r\n\t\tSystem.out.println(\"Write to event log, message : \" + message);\r\n\t}\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "patterns/structural/adapter/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Adapter</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n\r\n</project>"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/IHdmi.java",
    "content": "package io.spring2go.corespring.display;\r\n\r\n// HDMI接口\r\npublic interface IHdmi {\r\n\t\r\n\tpublic void openHdmi();\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/IVga.java",
    "content": "package io.spring2go.corespring.display;\r\n\r\n// VGA接口\r\npublic interface IVga {\r\n\t\r\n\tpublic void openVga();\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/LaptopMain.java",
    "content": "package io.spring2go.corespring.display;\r\n\r\npublic class LaptopMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\tVgaDisplay vgaDisplay = new VgaDisplay();\r\n\t\t\r\n\t\tVga2HdmiAdapter adapter = new Vga2HdmiAdapter(vgaDisplay);\r\n\t\t\r\n\t\toperateHdmiLaptop(adapter);\r\n\t}\r\n\t\r\n\tstatic void operateHdmiLaptop(IHdmi hdmiDisplay) {\r\n\t\thdmiDisplay.openHdmi();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/Vga2HdmiAdapter.java",
    "content": "package io.spring2go.corespring.display;\r\n\r\n// VGA2HDMI适配器\r\npublic class Vga2HdmiAdapter implements IHdmi {\r\n\r\n\tprivate IVga vgaDisplay;\r\n\t\r\n\tpublic Vga2HdmiAdapter(IVga vgaDisplay) {\r\n\t\tthis.vgaDisplay = vgaDisplay;\r\n\t}\r\n\t\r\n\tpublic void openHdmi() {\r\n\t\t// 适配逻辑\r\n\t\tthis.vgaDisplay.openVga();\r\n\t\tSystem.out.println(\"Opening HDMI device\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/VgaDisplay.java",
    "content": "package io.spring2go.corespring.display;\r\n\r\n//  支持VGA接口的显示器\r\npublic class VgaDisplay implements IVga {\r\n\r\n\tpublic void openVga() {\r\n\t\tSystem.out.println(\"Opening..VGA Display...\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/ArrayStack.java",
    "content": "package io.spring2go.corespring.stack;\r\n\r\n// ջʵ\r\npublic class ArrayStack<T> implements IStack<T> {\r\n\r\n\tprivate static final int DEFAULT_CAPACITY = 15;\r\n\tprivate int top; // ָջԪ\r\n\tprivate T[] array;\r\n\r\n\t// region 캯\r\n\t/**\r\n\t * һջָʼ\r\n\t */\r\n\tpublic ArrayStack(int initialCapacity) {\r\n\t\tif (initialCapacity <= 0)\r\n\t\t\tarray = (T[]) new Object[DEFAULT_CAPACITY];\r\n\t\telse\r\n\t\t\tarray = (T[]) new Object[initialCapacity];\r\n\r\n\t\ttop = -1; // ջ\r\n\t}\r\n\r\n\t/**\r\n\t * һջʹóʼ\r\n\t */\r\n\tpublic ArrayStack() {\r\n\t\tthis(DEFAULT_CAPACITY);\r\n\t}\r\n\t// endregion\r\n\r\n\t/**\r\n\t * ջǷΪ\r\n\t */\r\n\tpublic boolean isEmpty() {\r\n\t\treturn top == -1;\r\n\t}\r\n\r\n\t/**\r\n\t * ƳջԪ\r\n\t */\r\n\tpublic T pop() throws StackException {\r\n\t\tT x = peek();\r\n\t\tarray[top] = null; // ȷ󱻻\r\n\t\ttop--;\r\n\t\treturn x;\r\n\t}\r\n\r\n\t/**\r\n\t * ջԪأǲƳ\r\n\t */\r\n\tpublic T peek() throws StackException {\r\n\t\tif (isEmpty())\r\n\t\t\tthrow new StackException(\"Stack is empty\");\r\n\t\treturn array[top];\r\n\t}\r\n\r\n\t/**\r\n\t * ջһԪ\r\n\t */\r\n\tpublic void push(T e) throws StackException {\r\n\t\tif (top == array.length)\r\n\t\t\tthrow new StackException(\"Stack has overflowed\");\r\n\t\ttop++;\r\n\t\tarray[top] = e;\r\n\t}\r\n\r\n\t/**\r\n\t * ջԪ\r\n\t */\r\n\tpublic void clear() {\r\n\t\tfor (int i = 0; i <= top; i++) {\r\n\t\t\tarray[i] = null;\r\n\t\t}\r\n\t\ttop = -1;\r\n\t}\r\n\r\n\t/**\r\n\t * ջַʾ\r\n\t */\r\n\tpublic String toString() {\r\n\t\tif (isEmpty())\r\n\t\t\treturn \"[ ]\";\r\n\r\n\t\tStringBuffer out = new StringBuffer(\"[\");\r\n\t\tfor (int i = 0; i < top; i++)\r\n\t\t\tout.append(array[i] + \", \");\r\n\r\n\t\tout.append(array[top] + \"]\");\r\n\t\treturn out.toString();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/ArrayStackMain.java",
    "content": "package io.spring2go.corespring.stack;\r\n\r\npublic class ArrayStackMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayStack<Integer> stack = new ArrayStack<Integer>(6);\r\n\t\t\r\n\t\ttry {\r\n\t\t\tfor(int i = 0; i < 6; i++) {\r\n\t\t\t\tstack.push(i);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tSystem.out.println(stack);\r\n\t\t\t\r\n\t\t\tfor(int i = 0; i < 5; i++) {\r\n\t\t\t\tstack.pop();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tSystem.out.println(stack);\r\n\t\t} catch(StackException e) {\r\n\t\t\tSystem.err.println(e);\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/IStack.java",
    "content": "package io.spring2go.corespring.stack;\r\n\r\n// ջӿ\r\npublic interface IStack<T> {\r\n\tpublic boolean isEmpty();\r\n\t\r\n\tpublic T pop() throws StackException;\r\n\t\r\n\tpublic T peek() throws StackException;\r\n\t\r\n\tpublic void push (T e) throws StackException;\r\n\t\r\n\tpublic void clear();\r\n}\r\n"
  },
  {
    "path": "patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/StackException.java",
    "content": "package io.spring2go.corespring.stack;\r\n\r\npublic class StackException extends RuntimeException {\r\n\r\n\tprivate static final long serialVersionUID = 1L;\r\n\r\n\tpublic StackException(String name) {\r\n\t\tsuper(name);\r\n\t}\r\n\r\n\tpublic StackException() {\r\n\t\tsuper();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Bridge</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/Client.java",
    "content": "package io.spring2go.corespring.bridge;\r\n\r\npublic class Client {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tString os = \"linux\";\r\n\t\tFileDownloaderAbstraction downloader = null;\r\n\r\n\t\tswitch (os) {\r\n\t\tcase \"windows\":\r\n\t\t\tdownloader = new FileDownloaderAbstractionImpl(new WindowsFileDownloadImplementor());\r\n\t\t\tbreak;\r\n\t\tcase \"linux\":\r\n\t\t\tdownloader = new FileDownloaderAbstractionImpl(new LinuxFileDownloadImplementor());\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tSystem.out.println(\"OS not supported !!\");\r\n\t\t}\r\n\r\n\t\tObject fileContent = downloader.download(\"some path\");\r\n\t\tdownloader.store(fileContent);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/FileDownloadImplementor.java",
    "content": "package io.spring2go.corespring.bridge;\r\n\r\n// Implementor\r\npublic interface FileDownloadImplementor {\r\n\t\r\n\tpublic Object downloadFile(String path);\r\n\t\r\n\tpublic boolean storeFile(Object object);\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/FileDownloaderAbstraction.java",
    "content": "package io.spring2go.corespring.bridge;\r\n\r\n// Abstraction\r\npublic interface FileDownloaderAbstraction {\r\n\t\r\n\tpublic Object download(String path);\r\n\t\r\n\tpublic boolean store(Object object);\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/FileDownloaderAbstractionImpl.java",
    "content": "package io.spring2go.corespring.bridge;\r\n\r\n// RefinedAbstraction\r\npublic class FileDownloaderAbstractionImpl implements FileDownloaderAbstraction {\r\n\tprivate FileDownloadImplementor provider = null;\r\n\t\r\n\tpublic FileDownloaderAbstractionImpl(FileDownloadImplementor provider) {\r\n\t\tsuper();\r\n\t\tthis.provider = provider;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic Object download(String path) {\r\n\t\treturn provider.downloadFile(path);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean store(Object path) {\r\n\t\treturn provider.storeFile(path);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/LinuxFileDownloadImplementor.java",
    "content": "package io.spring2go.corespring.bridge;\r\n\r\n// Concrete Implementor\r\npublic class LinuxFileDownloadImplementor implements FileDownloadImplementor {\r\n\r\n\t@Override\r\n\tpublic Object downloadFile(String path) {\r\n\t\treturn new Object();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean storeFile(Object object) {\r\n\t\tSystem.out.println(\"File download successfully in LINUX !!\");\r\n\t\treturn true;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/WindowsFileDownloadImplementor.java",
    "content": "package io.spring2go.corespring.bridge;\r\n\r\n//Concrete Implementor\r\npublic class WindowsFileDownloadImplementor implements FileDownloadImplementor {\r\n\r\n\t@Override\r\n\tpublic Object downloadFile(String path) {\r\n\t\treturn new Object();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean storeFile(Object object) {\r\n\t\tSystem.out.println(\"File download successfully in WINDOWS !!\");\r\n\t\treturn true;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/abstraction_change/FileDownloaderAbstraction.java",
    "content": "package io.spring2go.corespring.bridge.abstraction_change;\r\n\r\npublic interface FileDownloaderAbstraction {\r\n\tpublic Object download(String path);\r\n\r\n\tpublic boolean store(Object object);\r\n\r\n\t// 添加接口\r\n\tpublic boolean delete(String object);\r\n}"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/abstraction_change/FileDownloaderAbstractionImpl.java",
    "content": "package io.spring2go.corespring.bridge.abstraction_change;\r\n\r\nimport io.spring2go.corespring.bridge.FileDownloadImplementor;\r\nimport io.spring2go.corespring.bridge.abstraction_change.FileDownloaderAbstraction;\r\n\r\npublic class FileDownloaderAbstractionImpl implements FileDownloaderAbstraction {\r\n\r\n\tprivate FileDownloadImplementor provider = null;\r\n\r\n\tpublic FileDownloaderAbstractionImpl(FileDownloadImplementor provider) {\r\n\t\tsuper();\r\n\t\tthis.provider = provider;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Object download(String path) {\r\n\t\treturn provider.downloadFile(path);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean store(Object object) {\r\n\t\treturn provider.storeFile(object);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean delete(String object) {\r\n\t\treturn false;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/implementation_change/FileDownloadImplementor.java",
    "content": "package io.spring2go.corespring.bridge.implementation_change;\r\n\r\npublic interface FileDownloadImplementor {\r\n\tpublic Object downloadFile(String path);\r\n\r\n\tpublic boolean storeFile(Object object);\r\n\r\n\t// 增加接口\r\n\tpublic boolean delete(String object);\r\n}"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/implementation_change/LinuxFileDownloadImplementor.java",
    "content": "package io.spring2go.corespring.bridge.implementation_change;\r\n\r\npublic class LinuxFileDownloadImplementor implements FileDownloadImplementor {\r\n\t@Override\r\n\tpublic Object downloadFile(String path) {\r\n\t\treturn new Object();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean storeFile(Object object) {\r\n\t\tSystem.out.println(\"File downloaded successfully in LINUX !!\");\r\n\t\treturn true;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean delete(String object) {\r\n\t\treturn false;\r\n\t}\r\n}"
  },
  {
    "path": "patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/implementation_change/WindowsFileDownloadImplementor.java",
    "content": "package io.spring2go.corespring.bridge.implementation_change;\r\n\r\npublic class WindowsFileDownloadImplementor implements FileDownloadImplementor\r\n{\r\n    @Override\r\n    public Object downloadFile(String path) {\r\n        return new Object();\r\n    }\r\n \r\n    @Override\r\n    public boolean storeFile(Object object) {\r\n        System.out.println(\"File downloaded successfully in LINUX !!\");\r\n        return true;\r\n    }\r\n \r\n    @Override\r\n    public boolean delete(String object) {\r\n        return false;\r\n    }\r\n}"
  },
  {
    "path": "patterns/structural/composite/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go</groupId>\r\n\t<artifactId>Composite</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/BaseEmployee.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\nimport java.util.List;\r\n\r\npublic abstract class BaseEmployee implements IEmployee {\r\n\t\r\n\tprotected String name;\r\n\tprotected int employeeId;\r\n\tprotected List<Subscription> subscriptions;\r\n\t\r\n\t@Override\r\n\tpublic String getName() {\r\n\t\treturn this.name;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int getEmployeeId() {\r\n\t\treturn this.employeeId;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void setEmployeeId(int employeeId) {\r\n\t\tthis.employeeId = employeeId;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic List<Subscription> getSubscriptions() {\r\n\t\treturn this.subscriptions;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void setSubscriptions(List<Subscription> subscriptions) {\r\n\t\tthis.subscriptions = subscriptions;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/CompanyMain.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\nimport java.util.Arrays;\r\nimport java.util.List;\r\n\r\npublic class CompanyMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// 创建一些开发者并赋予订购项\r\n\t\tIEmployee emp1 = new Developer(\"A\", 1);\r\n\t\tList<Subscription> subs = Arrays.asList(Util.getIntellijSubscription(), Util.getJProfilierSubscription(),\r\n\t\t\t\tUtil.getCSDNSubscription(), Util.getTrainingSubscription());\r\n\t\temp1.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp2 = new Developer(\"B\", 2);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription(), Util.getJProfilierSubscription());\r\n\t\temp2.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp3 = new Developer(\"C\", 3);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription());\r\n\t\temp3.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp4 = new Developer(\"D\", 4);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription());\r\n\t\temp4.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp5 = new Developer(\"E\", 5);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription());\r\n\t\temp5.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp6 = new Developer(\"F\", 6);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription(), Util.getTrainingSubscription());\r\n\t\temp6.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp7 = new Developer(\"G\", 7);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription());\r\n\t\temp7.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp8 = new Developer(\"H\", 8);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription());\r\n\t\temp8.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp9 = new Developer(\"I\", 9);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription());\r\n\t\temp9.setSubscriptions(subs);\r\n\t\t\r\n\t\tIEmployee emp10 = new Developer(\"J\", 10);\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription(), Util.getCSDNSubscription());\r\n\t\temp10.setSubscriptions(subs);\r\n\t\t\r\n\t\t// 获取单个员工的成本细节\r\n\t\tSystem.out.println(\"Let's get cost details of single employee\");\r\n\t\tUtil.printCostDetails(emp1);\r\n\t\t\r\n\t\t// 获取一组员工的成本细节\r\n\t\tList<IEmployee> employees = Arrays.asList(emp1, emp2, emp3, emp4, emp5, emp6, emp7, emp8, emp9, emp10);\r\n\t\tSystem.out.println(\"Let's check cost details of list of employees\");\r\n\t\tfor(IEmployee employee : employees) {\r\n\t\t\tUtil.printCostDetails(employee);\r\n\t\t}\r\n\t\t\r\n\t\t// 设置经理\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription(), Util.getJProfilierSubscription(),\r\n\t\t\t\tUtil.getCSDNSubscription(), Util.getTrainingSubscription());\r\n\t\tList<IEmployee> teamMembers = Arrays.asList(emp1, emp2, emp3);\r\n\t\tIEmployee mng1 = new Manager(\"MA\", 11, subs, teamMembers);\r\n\r\n\t\tsubs = Arrays.asList(Util.getIntellijSubscription());\r\n\t\tteamMembers = Arrays.asList(emp4, emp5, emp6);\r\n\t\tIEmployee mng2 = new Manager(\"MB\", 12, subs, teamMembers);\r\n\t\t\r\n\t\tsubs = Arrays.asList(Util.getTrainingSubscription());\r\n\t\tteamMembers = Arrays.asList(emp7, emp8, emp9, emp10);\r\n\t\tIEmployee mng3 = new Manager(\"MC\", 13, subs, teamMembers);\r\n\t\t\r\n\t\t// 获取单个经理的成本细节\r\n\t\tSystem.out.println(\"Let's get cost details of single manager\");\r\n\t\tUtil.printCostDetails(mng1);\r\n\t\t\r\n\t\t// 获取一组经理的成本细节\r\n\t\tSystem.out.println(\"Let's check details of list of manager\");\r\n\t\tList<IEmployee> managers = Arrays.asList(mng1, mng2, mng3);\r\n\t\tfor(IEmployee employee : managers) {\r\n\t\t\tUtil.printCostDetails(employee);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Developer.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\n// Leaf\r\npublic class Developer extends BaseEmployee {\r\n\r\n\tpublic Developer(String name, int employeeId) {\r\n\t\tthis.name = name;\r\n\t\tthis.employeeId = employeeId;\r\n\t}\r\n\t\r\n\tpublic double getCost() {\r\n\t\tif (subscriptions== null)\r\n\t\t\treturn 0;\r\n\t\tdouble cost = subscriptions.stream().mapToDouble(s -> s.getCost()).sum();\r\n\t\treturn cost;\r\n\t}\r\n\r\n\tpublic int getSubscriptionCount(SubscriptionType type) {\r\n\t\tif (subscriptions == null)\r\n\t\t\treturn 0;\r\n\t\tint count = (int) subscriptions.stream().filter(s -> s.getsType() == type).count();\r\n\t\treturn count;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/IEmployee.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\nimport java.util.List;\r\n\r\n//Component\r\npublic interface IEmployee {\r\n\tpublic String getName();\r\n\t\r\n\tpublic void setName(String name);\r\n\t\r\n\tpublic int getEmployeeId();\r\n\t\r\n\tpublic void setEmployeeId(int employeeId);\r\n\t\r\n\tpublic List<Subscription> getSubscriptions();\r\n\t\r\n\tpublic void setSubscriptions(List<Subscription> subscriptions);\r\n\t\r\n\tpublic double getCost();\r\n\t\r\n\tpublic int getSubscriptionCount(SubscriptionType type);\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Manager.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\nimport java.util.List;\r\n\r\n// Composite\r\npublic class Manager extends BaseEmployee {\r\n\r\n\tprivate List<IEmployee> teamMembers;\r\n\r\n\tpublic Manager(String name, int employeeId, \r\n\t\t\tList<Subscription> subscriptions, \r\n\t\t\tList<IEmployee> teamMembers) {\r\n\t\tthis.name = name;\r\n\t\tthis.employeeId = employeeId;\r\n\t\tthis.subscriptions = subscriptions;\r\n\t\tthis.teamMembers = teamMembers;\r\n\t}\r\n\r\n\tpublic List<IEmployee> getTeamMembers() {\r\n\t\treturn teamMembers;\r\n\t}\r\n\r\n\tpublic void setTeamMembers(List<IEmployee> teamMembers) {\r\n\t\tthis.teamMembers = teamMembers;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic double getCost() {\r\n\t\tdouble subsCost = 0.0;\r\n\t\tif (subscriptions != null) {\r\n\t\t\tsubsCost = subscriptions.stream().mapToDouble(s -> s.getCost()).sum();\r\n\t\t}\r\n\r\n\t\tdouble membersCost = 0.0;\r\n\t\tif (teamMembers != null) {\r\n\t\t\tmembersCost = teamMembers.stream().mapToDouble(m -> m.getCost()).sum();\r\n\t\t}\r\n\r\n\t\treturn subsCost + membersCost;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic int getSubscriptionCount(SubscriptionType type) {\r\n\t\tint subCount = 0;\r\n\t\tif (subscriptions != null) {\r\n\t\t\tsubCount = (int) subscriptions.stream().filter(s -> s.getsType() == type).count();\r\n\t\t}\r\n\r\n\t\tint membersSubCount = 0;\r\n\t\tif (teamMembers != null) {\r\n\t\t\tfor (IEmployee member: teamMembers) {\r\n\t\t\t\tList<Subscription> subs = member.getSubscriptions();\r\n\t\t\t\tif (subs != null) {\r\n\t\t\t\t\tfor(Subscription sub : subs) {\r\n\t\t\t\t\t\tif (sub.getsType() == type) {\r\n\t\t\t\t\t\t\tmembersSubCount++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn subCount + membersSubCount;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Subscription.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\npublic class Subscription {\r\n\tprivate SubscriptionType sType; // 订购类型\r\n\tprivate String name; // 名称\r\n\tprivate double cost; // 费用\r\n\t\r\n\tpublic SubscriptionType getsType() {\r\n\t\treturn sType;\r\n\t}\r\n\tpublic void setsType(SubscriptionType sType) {\r\n\t\tthis.sType = sType;\r\n\t}\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic double getCost() {\r\n\t\treturn cost;\r\n\t}\r\n\tpublic void setCost(double cost) {\r\n\t\tthis.cost = cost;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/SubscriptionType.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\npublic enum SubscriptionType {\r\n\tPRINT, // 打印\r\n\tSOFTWARE_LICENSE, // 软件License\r\n\tTRAINING; // 培训\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Util.java",
    "content": "package io.spring2go.corespring.composite_complex;\r\n\r\npublic class Util {\r\n\r\n\tpublic static void printCostDetails(IEmployee employee) {\r\n\t\tdouble cost = employee.getCost();\r\n\t\tint licenseSubCount = employee.getSubscriptionCount(SubscriptionType.SOFTWARE_LICENSE);\r\n\t\tint printSubCount = employee.getSubscriptionCount(SubscriptionType.PRINT);\r\n\t\tint trainingSubCount = employee.getSubscriptionCount(SubscriptionType.TRAINING);\r\n\t\tString outMsg = \"Cost: %f, Count License: %d, Count Print: %d, Count Training: %d, Emp ID: %d\\n\";\r\n\t\tSystem.out.print(String.format(outMsg, cost, licenseSubCount, printSubCount, trainingSubCount, employee.getEmployeeId()));\r\n\t}\r\n\t\r\n\tpublic static Subscription getIntellijSubscription() {\r\n\t\tSubscription sub = new Subscription();\r\n\t\tsub.setCost(30);\r\n\t\tsub.setName(\"Intellij License\");\r\n\t\tsub.setsType(SubscriptionType.SOFTWARE_LICENSE);\r\n\t\treturn sub;\r\n\t}\r\n\t\r\n\tpublic static Subscription getJProfilierSubscription() {\r\n\t\tSubscription sub = new Subscription();\r\n\t\tsub.setCost(20);\r\n\t\tsub.setName(\"JProfilier License\");\r\n\t\tsub.setsType(SubscriptionType.SOFTWARE_LICENSE);\r\n\t\treturn sub;\r\n\t}\r\n\t\r\n\tpublic static Subscription getCSDNSubscription() {\r\n\t\tSubscription sub = new Subscription();\r\n\t\tsub.setName(\"CSDN Magazine\");\r\n\t\tsub.setsType(SubscriptionType.PRINT);\r\n\t\tsub.setCost(10);\r\n\t\treturn sub;\r\n\t}\r\n\t\r\n\tpublic static Subscription getTrainingSubscription() {\r\n\t\tSubscription sub = new Subscription();\r\n\t\tsub.setName(\"Java Design Pattern\");\r\n\t\tsub.setsType(SubscriptionType.TRAINING);\r\n\t\tsub.setCost(300);\r\n\t\treturn sub;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/CompositePatternMain.java",
    "content": "package io.spring2go.corespring.composite_simple;\r\n\r\n// Client\r\npublic class CompositePatternMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tIEmployee emp1 = new Developer(\"John\", 10000);\r\n\t\tIEmployee emp2 = new Developer(\"David\", 15000);\r\n\t\tIEmployee manager1 = new Manager(\"Daniel\", 25000);\r\n\t\tmanager1.add(emp1);\r\n\t\tmanager1.add(emp2);\r\n\t\tIEmployee emp3 = new Developer(\"Michael\", 20000);\r\n\t\tManager generalManager = new Manager(\"Mark\", 50000);\r\n\t\tgeneralManager.add(emp3);\r\n\t\tgeneralManager.add(manager1);\r\n\t\tgeneralManager.print();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/Developer.java",
    "content": "package io.spring2go.corespring.composite_simple;\r\n\r\nimport io.spring2go.corespring.composite_simple.IEmployee;\r\n\r\n// leaf\r\npublic class Developer implements IEmployee {\r\n\t\r\n\tprivate String name;\r\n\tprivate double salary;\r\n\t\r\n\tpublic Developer(String name, double salary) {\r\n\t\tthis.name = name;\r\n\t\tthis.salary = salary;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void add(IEmployee employee) {\r\n\t\tString msg = \"not supported by leaf node.\";\r\n\t\tthrow new UnsupportedOperationException(msg);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void remove(IEmployee employee) {\r\n\t\tString msg = \"not supported by leaf node.\";\r\n\t\tthrow new UnsupportedOperationException(msg);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic IEmployee getChild(int i) {\r\n\t\tString msg = \"not supported by leaf node.\";;\r\n\t\tthrow new UnsupportedOperationException(msg);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getName() {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic double getSalary() {\r\n\t\treturn this.salary;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void print() {\r\n        System.out.println(\"-------------\");\r\n        System.out.println(\"Name =\"+getName());\r\n        System.out.println(\"Salary =\"+getSalary());\r\n        System.out.println(\"-------------\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/IEmployee.java",
    "content": "package io.spring2go.corespring.composite_simple;\r\n\r\n// Component\r\npublic interface IEmployee {\r\n\tpublic void add(IEmployee employee);\r\n\tpublic void remove(IEmployee employee);\r\n\tpublic IEmployee getChild(int i);\r\n\tpublic String getName();\r\n\tpublic double getSalary();\r\n\tpublic void print();\r\n}\r\n"
  },
  {
    "path": "patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/Manager.java",
    "content": "package io.spring2go.corespring.composite_simple;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\n// Composite\r\npublic class Manager implements IEmployee {\r\n\r\n\tprivate String name;\r\n\tprivate double salary;\r\n\tprivate List<IEmployee> employees = new ArrayList<IEmployee>();\r\n\r\n\tpublic Manager(String name, double salary) {\r\n\t\tthis.name = name;\r\n\t\tthis.salary = salary;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void add(IEmployee employee) {\r\n\t\temployees.add(employee);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void remove(IEmployee employee) {\r\n\t\temployees.remove(employee);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic IEmployee getChild(int i) {\r\n\t\treturn employees.get(i);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getName() {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic double getSalary() {\r\n\t\treturn this.salary;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void print() {\r\n\t\tSystem.out.println(\"-------------\");\r\n\t\tSystem.out.println(\"Name =\" + getName());\r\n\t\tSystem.out.println(\"Salary =\" + getSalary());\r\n\t\tSystem.out.println(\"-------------\");\r\n\t\t\r\n\t\tfor(IEmployee employee : this.employees) {\r\n\t\t\temployee.print();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Decorator</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/ArtificialScentDecorator.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n//Concrete Decorator\r\npublic class ArtificialScentDecorator extends Decorator {\r\n\r\n\tprotected ArtificialScentDecorator(BakeryComponent baseComponent) {\r\n\t\tsuper(baseComponent);\r\n\t\tthis.name = \"Artificial Scent\";\r\n\t\tthis.price = 3.0;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/BakeryComponent.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n// Component Interface\r\npublic interface BakeryComponent {\r\n\t\r\n\tpublic String getName();\r\n\t\r\n\tpublic double getPrice();\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/CakeBase.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n// ConcreteComponent\r\npublic class CakeBase implements BakeryComponent {\r\n\r\n\tprivate String name = \"Cake Base\";\r\n\tprivate double price = 200.0;\r\n\t\r\n\t@Override\r\n\tpublic String getName() {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic double getPrice() {\r\n\t\treturn this.price;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/CherryDecorator.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n//Concrete Decorator\r\npublic class CherryDecorator extends Decorator {\r\n\r\n\tprotected CherryDecorator(BakeryComponent baseComponent) {\r\n\t\tsuper(baseComponent);\r\n\t\tthis.name = \"Cherry\";\r\n\t\tthis.price = 2.0;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/CreamDecorator.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n// Concrete Decorator\r\npublic class CreamDecorator extends Decorator {\r\n\r\n\tprotected CreamDecorator(BakeryComponent baseComponent) {\r\n\t\tsuper(baseComponent);\r\n\t\tthis.name = \"Cream\";\r\n\t\tthis.price = 1.0;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/Decorator.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n// Decorator\r\npublic abstract class Decorator implements BakeryComponent {\r\n\t\r\n\tprivate BakeryComponent baseComponent = null;\r\n\t\r\n\tprotected String name = \"Undefined Decorator\";\r\n\tprotected double price = 0.0;\r\n\t\r\n\tprotected Decorator(BakeryComponent baseComponent) {\r\n\t\tthis.baseComponent = baseComponent;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getName() {\r\n\t\treturn this.baseComponent.getName() + \", \" + this.name;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic double getPrice() {\r\n\t\treturn this.price + this.baseComponent.getPrice();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/DecoratorMain.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\npublic class DecoratorMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// 先创建一个简单的Cake Base\r\n\t\tCakeBase cBase = new CakeBase();\r\n\t\tUtil.printProductDetails(cBase);\r\n\t\t\r\n\t\t// 在蛋糕上添加奶油\r\n\t\tCreamDecorator creamCake = new CreamDecorator(cBase);\r\n\t\tUtil.printProductDetails(creamCake);\r\n\t\t\r\n\t\t// 在蛋糕上添加樱桃\r\n\t\tCherryDecorator cherryCake = new CherryDecorator(creamCake);\r\n\t\tUtil.printProductDetails(cherryCake);\r\n\t\t\r\n\t\t// 再添加香味\r\n\t\tArtificialScentDecorator scentedCake = \r\n\t\t\t\tnew ArtificialScentDecorator(cherryCake);\r\n\t\tUtil.printProductDetails(scentedCake);\r\n\t\t\r\n\t\t// 最后在蛋糕上添加名片\r\n\t\tNameCardDecorator nameCardOnCake = new NameCardDecorator(scentedCake);\r\n\t\tUtil.printProductDetails(nameCardOnCake);\r\n\t\t\r\n\t\t// 现在创建一个简单的糕点\r\n\t\tPastryBase pastry = new PastryBase();\r\n\t\tUtil.printProductDetails(pastry);\r\n\t\t\r\n\t\t// 在糕点上只添加奶油和樱桃\r\n\t\tCreamDecorator creamPastry = new CreamDecorator(pastry);\r\n\t\tCherryDecorator cherryPastry = new CherryDecorator(creamPastry);\r\n\t\tUtil.printProductDetails(cherryPastry);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/NameCardDecorator.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n//Concrete Decorator\r\npublic class NameCardDecorator extends Decorator {\r\n\r\n\tprotected NameCardDecorator(BakeryComponent baseComponent) {\r\n\t\tsuper(baseComponent);\r\n\t\tthis.name = \"Name Card\";\r\n\t\tthis.price = 4.0;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getName() {\r\n\t\treturn super.getName() + \r\n\t\t\t\t\"(Please Collect your discount card for \" + \r\n\t\t\t\tthis.price + \r\n\t\t\t\t\")\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/PastryBase.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\n// ConcreteComponent\r\npublic class PastryBase implements BakeryComponent {\r\n\t\r\n\tprivate String name = \"Pastry Base\";\r\n\tprivate double price = 20.0;\r\n\r\n\t@Override\r\n\tpublic String getName() {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic double getPrice() {\r\n\t\treturn this.price;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/Util.java",
    "content": "package io.spring2go.corespring.decorator;\r\n\r\npublic class Util {\r\n\tpublic static void printProductDetails(BakeryComponent bComponent) {\r\n\t\tString out = \"Item: \" + bComponent.getName() + \", \" + \"Price: \" + bComponent.getPrice();\r\n\t\tSystem.out.println(out);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/uml.ucls",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<class-diagram version=\"1.2.2\" icons=\"true\" always-add-relationships=\"false\" generalizations=\"true\" realizations=\"true\" \r\n  associations=\"true\" dependencies=\"false\" nesting-relationships=\"true\" router=\"FAN\">  \r\n  <interface id=\"1\" language=\"java\" name=\"io.spring2go.corespring.decorator.BakeryComponent\" project=\"Decorator\" \r\n    file=\"/Decorator/src/main/java/io/spring2go/corespring/decorator/BakeryComponent.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"481\" y=\"101\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <class id=\"2\" language=\"java\" name=\"io.spring2go.corespring.decorator.CakeBase\" project=\"Decorator\" \r\n    file=\"/Decorator/src/main/java/io/spring2go/corespring/decorator/CakeBase.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"200\" y=\"369\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"3\" language=\"java\" name=\"io.spring2go.corespring.decorator.PastryBase\" project=\"Decorator\" \r\n    file=\"/Decorator/src/main/java/io/spring2go/corespring/decorator/PastryBase.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"478\" y=\"371\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"4\" language=\"java\" name=\"io.spring2go.corespring.decorator.Decorator\" project=\"Decorator\" \r\n    file=\"/Decorator/src/main/java/io/spring2go/corespring/decorator/Decorator.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"779\" y=\"375\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"5\" language=\"java\" name=\"io.spring2go.corespring.decorator.CherryDecorator\" project=\"Decorator\" \r\n    file=\"/Decorator/src/main/java/io/spring2go/corespring/decorator/CherryDecorator.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"509\" y=\"609\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"6\" language=\"java\" name=\"io.spring2go.corespring.decorator.CreamDecorator\" project=\"Decorator\" \r\n    file=\"/Decorator/src/main/java/io/spring2go/corespring/decorator/CreamDecorator.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"778\" y=\"608\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"7\" language=\"java\" name=\"io.spring2go.corespring.decorator.NameCardDecorator\" project=\"Decorator\" \r\n    file=\"/Decorator/src/main/java/io/spring2go/corespring/decorator/NameCardDecorator.java\" binary=\"false\" \r\n    corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"1061\" y=\"614\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <realization id=\"8\">    \r\n    <end type=\"SOURCE\" refId=\"2\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <generalization id=\"9\">    \r\n    <end type=\"SOURCE\" refId=\"7\"/>    \r\n    <end type=\"TARGET\" refId=\"4\"/>  \r\n  </generalization>  \r\n  <generalization id=\"10\">    \r\n    <end type=\"SOURCE\" refId=\"6\"/>    \r\n    <end type=\"TARGET\" refId=\"4\"/>  \r\n  </generalization>  \r\n  <realization id=\"11\">    \r\n    <end type=\"SOURCE\" refId=\"3\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <association id=\"12\">    \r\n    <bendpoint x=\"779\" y=\"101\"/>    \r\n    <end type=\"SOURCE\" refId=\"4\" navigable=\"false\">      \r\n      <attribute id=\"13\" name=\"baseComponent\"/>      \r\n      <multiplicity id=\"14\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <generalization id=\"15\">    \r\n    <end type=\"SOURCE\" refId=\"5\"/>    \r\n    <end type=\"TARGET\" refId=\"4\"/>  \r\n  </generalization>  \r\n  <realization id=\"16\">    \r\n    <end type=\"SOURCE\" refId=\"4\"/>    \r\n    <end type=\"TARGET\" refId=\"1\"/>  \r\n  </realization>  \r\n  <classifier-display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n    sort-features=\"false\" accessors=\"true\" visibility=\"true\">    \r\n    <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>  \r\n  </classifier-display>  \r\n  <association-display labels=\"true\" multiplicity=\"true\"/>\r\n</class-diagram>"
  },
  {
    "path": "patterns/structural/facade/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Facade</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/CostManager.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 费用计算实现\r\npublic class CostManager implements ICosting {\r\n\r\n\t@Override\r\n\tpublic float applyDiscount(float price, float discountPercent) {\r\n\t\tString out = String.format(\r\n\t\t\t\t\"A discount of %f%% has been applied on the product's price of %f\", \r\n\t\t\t\tdiscountPercent, price);\r\n\t\tSystem.out.println(out);\r\n\t\treturn price - ((discountPercent / 100) * price);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/FacadeMain.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\npublic class FacadeMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// Creating the Order/Product details\r\n\t\tOrderDetails orderDetails = new OrderDetails(\"Java Design Pattern book\",\r\n\t\t\t\t\"Simplified book on design patterns in Java\", \r\n\t\t\t\t500, 10, \"Street No 1\", \"Educational Area\", 1212,\r\n\t\t\t\t\"8811123456\");\r\n\t\t\r\n\t\t// Using Facade\r\n\t\tOnlineShoppingFacade facade = new OnlineShoppingFacade();\r\n\t\tfacade.finalizeOrder(orderDetails);\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/ICosting.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 费用计算接口\r\npublic interface ICosting {\r\n\tpublic float applyDiscount(float price, float discountPercent);\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/IInventory.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 库存接口\r\npublic interface IInventory {\r\n\tpublic void update(int productId);\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/ILogistics.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 物流接口\r\npublic interface ILogistics {\r\n\tpublic void shipProducts(String productName, String shippingAddress);\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/IOrderVerify.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 订单校验接口\r\npublic interface IOrderVerify {\r\n\tpublic boolean verifyShippingAddress(int pincode);\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/IPaymentGateway.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 支付接口\r\npublic interface IPaymentGateway {\r\n\tpublic boolean verifyCardDetails(String cardNo);\r\n\tpublic boolean processPayment(String cardNo, float cost);\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/InventoryManager.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 库存实现\r\npublic class InventoryManager implements IInventory {\r\n\r\n\t@Override\r\n\tpublic void update(int productId) {\r\n\t\tString msg = \"Product# \" + productId + \r\n\t\t\t\t\" is subtracted from store's inventory\";\r\n\t\tSystem.out.println(msg);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/LogisticsManager.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 物流实现\r\npublic class LogisticsManager implements ILogistics {\r\n\r\n\t@Override\r\n\tpublic void shipProducts(String productName, String shippingAddress) {\r\n\t\tString out = String.format(\r\n\t\t\t\"Congratulations your product %s has been shipped at the following address: %s.\", \r\n\t\t\tproductName, shippingAddress);\r\n\t    System.out.println(out);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/NoFacadeMain.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// Client Code without Facade.\r\npublic class NoFacadeMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// Creating the Order/Product details\r\n\t\tOrderDetails orderDetails = new OrderDetails(\"Java Design Pattern book\",\r\n\t\t\t\t\"Simplified book on design patterns in Java\", \r\n\t\t\t\t500, 10, \"Street No 1\", \"Educational Area\", 1212,\r\n\t\t\t\t\"8811123456\");\r\n\r\n\t\t// Updating the inventory.\r\n\t\tIInventory inventory = new InventoryManager();\r\n\t\tinventory.update(orderDetails.getProductNo());\r\n\r\n\t\t// verifying various details for the order such as the shipping address.\r\n\t\tIOrderVerify orderVerify = new OrderVerificationManager();\r\n\t\torderVerify.verifyShippingAddress(orderDetails.getPinCode());\r\n\r\n\t\t// Calculating the final cost after applying various discounts.\r\n\t\tICosting costManager = new CostManager();\r\n\t\torderDetails.setPrice(\r\n\t\t\t\tcostManager.applyDiscount(\r\n\t\t\t\t\t\torderDetails.getPrice(), \r\n\t\t\t\t\t\torderDetails.getDiscountPercent()\r\n\t\t\t\t)\r\n\t\t\t\t);\r\n\r\n\t\t// Going through various steps if payment gateway like card verification,\r\n\t\t// charging from the card.\r\n\t\tIPaymentGateway paymentGateway = new PaymentGatewayManager();\r\n\t\tpaymentGateway.verifyCardDetails(orderDetails.getCardNo());\r\n\t\tpaymentGateway.processPayment(orderDetails.getCardNo(), orderDetails.getPrice());\r\n\t\t\r\n\t\t// Completing the order by providing logistics.\r\n\t\tILogistics logistics = new LogisticsManager();\r\n\t\tString shippingAddress = String.format(\"%s, %s - %d\", \r\n\t\t\t\torderDetails.getAddressLine1(), \r\n\t\t\t\torderDetails.getAddressLine2(), \r\n\t\t\t\torderDetails.getPinCode());\r\n\t\tlogistics.shipProducts(orderDetails.getProductName(), shippingAddress);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/OnlineShoppingFacade.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\npublic class OnlineShoppingFacade {\r\n\tIInventory inventory = new InventoryManager();\r\n\tIOrderVerify orderVerify = new OrderVerificationManager();\r\n\tICosting costManager = new CostManager();\r\n\tIPaymentGateway paymentGateway = new PaymentGatewayManager();\r\n\tILogistics logistics = new LogisticsManager();\r\n\t\r\n\tpublic void finalizeOrder(OrderDetails orderDetails) {\r\n\t\tinventory.update(orderDetails.getProductNo());\r\n\t\torderVerify.verifyShippingAddress(orderDetails.getPinCode());\r\n\t\torderDetails.setPrice(\r\n\t\t\t\tcostManager.applyDiscount(\r\n\t\t\t\t\t\torderDetails.getPrice(), \r\n\t\t\t\t\t\torderDetails.getDiscountPercent()\r\n\t\t\t\t)\r\n\t\t\t\t);\r\n\t\tpaymentGateway.verifyCardDetails(orderDetails.getCardNo());\r\n\t\tpaymentGateway.processPayment(orderDetails.getCardNo(), orderDetails.getPrice());\r\n\t\tString shippingAddress = String.format(\"%s, %s - %d\", \r\n\t\t\t\torderDetails.getAddressLine1(), \r\n\t\t\t\torderDetails.getAddressLine2(), \r\n\t\t\t\torderDetails.getPinCode());\r\n\t\tlogistics.shipProducts(orderDetails.getCardNo(), shippingAddress);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/OrderDetails.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\nimport java.util.Random;\r\n\r\npublic class OrderDetails {\r\n\t// region 私有成员\r\n\tprivate int productNo;\r\n\tprivate String productName;\r\n\tprivate String productDescription;\r\n\tprivate float price;\r\n\tprivate float discountPercent;\r\n\tprivate String addressLine1;\r\n\tprivate String addressLine2;\r\n\tprivate int pinCode;\r\n\tprivate String cardNo;\r\n\t// endregion\r\n\t\r\n\tpublic OrderDetails(String productName, String prodDescription, float price,\r\n\t\t\tfloat discount, String addressLine1, String addressLine2,\r\n\t\t\tint pinCode, String cardNo) {\r\n\t\tthis.productNo = new Random(1).nextInt(100);\r\n\t\tthis.productName = productName;\r\n\t\tthis.productDescription = prodDescription;\r\n\t\tthis.price = price;\r\n\t\tthis.discountPercent = discount;\r\n\t\tthis.addressLine1 = addressLine1;\r\n\t\tthis.addressLine2 = addressLine2;\r\n\t\tthis.pinCode = pinCode;\r\n\t\tthis.cardNo = cardNo;\r\n\t}\r\n\r\n\t// region getters\r\n\tpublic int getProductNo() {\r\n\t\treturn productNo;\r\n\t}\r\n\r\n\tpublic void setProductNo(int productNo) {\r\n\t\tthis.productNo = productNo;\r\n\t}\r\n\r\n\tpublic String getProductName() {\r\n\t\treturn productName;\r\n\t}\r\n\r\n\tpublic void setProductName(String productName) {\r\n\t\tthis.productName = productName;\r\n\t}\r\n\r\n\tpublic String getProductDescription() {\r\n\t\treturn productDescription;\r\n\t}\r\n\r\n\tpublic void setProductDescription(String productDescription) {\r\n\t\tthis.productDescription = productDescription;\r\n\t}\r\n\r\n\tpublic float getPrice() {\r\n\t\treturn price;\r\n\t}\r\n\r\n\tpublic void setPrice(float price) {\r\n\t\tthis.price = price;\r\n\t}\r\n\r\n\tpublic float getDiscountPercent() {\r\n\t\treturn discountPercent;\r\n\t}\r\n\r\n\tpublic void setDiscountPercent(float discountPercent) {\r\n\t\tthis.discountPercent = discountPercent;\r\n\t}\r\n\r\n\tpublic String getAddressLine1() {\r\n\t\treturn addressLine1;\r\n\t}\r\n\r\n\tpublic void setAddressLine1(String addressLine1) {\r\n\t\tthis.addressLine1 = addressLine1;\r\n\t}\r\n\r\n\tpublic String getAddressLine2() {\r\n\t\treturn addressLine2;\r\n\t}\r\n\r\n\tpublic void setAddressLine2(String addressLine2) {\r\n\t\tthis.addressLine2 = addressLine2;\r\n\t}\r\n\r\n\tpublic int getPinCode() {\r\n\t\treturn pinCode;\r\n\t}\r\n\r\n\tpublic void setPinCode(int pinCode) {\r\n\t\tthis.pinCode = pinCode;\r\n\t}\r\n\r\n\tpublic String getCardNo() {\r\n\t\treturn cardNo;\r\n\t}\r\n\r\n\tpublic void setCardNo(String cardNo) {\r\n\t\tthis.cardNo = cardNo;\r\n\t}\r\n\t// endregion\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/OrderVerificationManager.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 订单校验实现\r\npublic class OrderVerificationManager implements IOrderVerify {\r\n\r\n\t@Override\r\n\tpublic boolean verifyShippingAddress(int pincode) {\r\n\t\tSystem.out.println(\r\n\t\t\t\t\"The product can be shipped to the pincode \"\r\n\t\t        + pincode);\r\n\t\treturn true;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/PaymentGatewayManager.java",
    "content": "package io.spring2go.corespring.facade;\r\n\r\n// 支付实现\r\npublic class PaymentGatewayManager implements IPaymentGateway {\r\n\r\n\t@Override\r\n\tpublic boolean verifyCardDetails(String cardNo) {\r\n\t\tString out = \"Card# \" + cardNo + \r\n\t\t\t\t\" has been verified and is accepted.\";\r\n\t\tSystem.out.println(out);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic boolean processPayment(String cardNo, float cost) {\r\n\t\tString out = \"Card# \" + cardNo + \r\n\t\t\t\t\" is used to make a payment of \" + cost + \".\";\r\n\t\tSystem.out.println(out);\r\n\t\treturn true;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/proxy/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>io.spring2go.corespring</groupId>\r\n\t<artifactId>Proxy</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<maven.compiler.source>1.8</maven.compiler.source>\r\n\t\t<maven.compiler.target>1.8</maven.compiler.target>\r\n\t</properties>\r\n\r\n</project>"
  },
  {
    "path": "patterns/structural/proxy/src/main/java/io/spring2go/corespring/Folder.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// RealSubject\r\npublic class Folder implements IFolder {\r\n\r\n\tpublic void performOperations() {\r\n\t\t// access folder and perform various operations like copy or cut files\r\n\t\tSystem.out.println(\"Performing operation on folder\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/proxy/src/main/java/io/spring2go/corespring/FolderProxy.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// Proxy\r\npublic class FolderProxy implements IFolder {\r\n\t\r\n\tFolder folder;\r\n\tUser user;\r\n\t\r\n\tpublic FolderProxy(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\r\n\tpublic void performOperations() {\r\n\t\tif (user.getUserName().equalsIgnoreCase(\"bobo\") && \r\n\t\t\tuser.getPassword().equalsIgnoreCase(\"xyz\")) {\r\n\t\t\tfolder = new Folder();\r\n\t\t\tfolder.performOperations();\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"You don't have access to this folder\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/proxy/src/main/java/io/spring2go/corespring/IFolder.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// Subject\r\npublic interface IFolder {\r\n\t \r\n    public void performOperations();\r\n    \r\n}"
  },
  {
    "path": "patterns/structural/proxy/src/main/java/io/spring2go/corespring/ProxyDesignPatternMain.java",
    "content": "package io.spring2go.corespring;\r\n\r\n// Client\r\npublic class ProxyDesignPatternMain {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// When you click on folder, Let's say a GUI form will ask for \r\n\t\t// usesrName and password.\r\n\t\t// and this GUI will create this user object\r\n\t\t\r\n\t\t// If we give correct userName and password\r\n\t\tUser user = new User(\"bobo\", \"xyz\");\r\n\t\tFolderProxy folderProxy = new FolderProxy(user);\r\n\t\tSystem.out.println(\"When userName and password are correct:\");\r\n\t\tfolderProxy.performOperations();\r\n\t\tSystem.out.println(\"**************************************\");\r\n\t\t// if we give wrong userName and Password\r\n\t\tUser userWrong = new User(\"abc\", \"abc\");\r\n\t\tFolderProxy folderProxyWrong = new FolderProxy(userWrong);\r\n\t\tSystem.out.println(\"When userName and password are incorrect\");\r\n\t\tfolderProxyWrong.performOperations();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "patterns/structural/proxy/src/main/java/io/spring2go/corespring/User.java",
    "content": "package io.spring2go.corespring;\r\n\r\npublic class User {\r\n\t\r\n\tString username;\r\n\tString password;\r\n\t\r\n\tpublic User(String username, String password) {\r\n\t\tthis.username = username;\r\n\t\tthis.password = password;\r\n\t}\r\n\t\r\n\tpublic String getUserName() {\r\n\t\treturn this.username;\r\n\t}\r\n\t\r\n\tpublic String getPassword() {\r\n\t\treturn this.password;\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "patterns/structural/proxy/src/main/java/io/spring2go/corespring/uml.ucls",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<class-diagram version=\"1.2.2\" icons=\"true\" always-add-relationships=\"false\" generalizations=\"true\" realizations=\"true\" \r\n  associations=\"true\" dependencies=\"false\" nesting-relationships=\"true\" router=\"FAN\">  \r\n  <class id=\"1\" language=\"java\" name=\"io.spring2go.corespring.Folder\" project=\"Proxy\" \r\n    file=\"/Proxy/src/main/java/io/spring2go/corespring/Folder.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"195\" y=\"326\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <class id=\"2\" language=\"java\" name=\"io.spring2go.corespring.FolderProxy\" project=\"Proxy\" \r\n    file=\"/Proxy/src/main/java/io/spring2go/corespring/FolderProxy.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"511\" y=\"328\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <interface id=\"3\" language=\"java\" name=\"io.spring2go.corespring.IFolder\" project=\"Proxy\" \r\n    file=\"/Proxy/src/main/java/io/spring2go/corespring/IFolder.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"344\" y=\"126\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </interface>  \r\n  <class id=\"4\" language=\"java\" name=\"io.spring2go.corespring.ProxyDesignPatternMain\" project=\"Proxy\" \r\n    file=\"/Proxy/src/main/java/io/spring2go/corespring/ProxyDesignPatternMain.java\" binary=\"false\" corner=\"BOTTOM_RIGHT\">    \r\n    <position height=\"-1\" width=\"-1\" x=\"804\" y=\"326\"/>    \r\n    <display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n      sort-features=\"false\" accessors=\"true\" visibility=\"true\">      \r\n      <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>      \r\n      <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    </display>  \r\n  </class>  \r\n  <association id=\"5\">    \r\n    <end type=\"SOURCE\" refId=\"2\" navigable=\"false\">      \r\n      <attribute id=\"6\" name=\"folder\"/>      \r\n      <multiplicity id=\"7\" minimum=\"0\" maximum=\"1\"/>    \r\n    </end>    \r\n    <end type=\"TARGET\" refId=\"1\" navigable=\"true\"/>    \r\n    <display labels=\"true\" multiplicity=\"true\"/>  \r\n  </association>  \r\n  <realization id=\"8\">    \r\n    <end type=\"SOURCE\" refId=\"2\"/>    \r\n    <end type=\"TARGET\" refId=\"3\"/>  \r\n  </realization>  \r\n  <realization id=\"9\">    \r\n    <end type=\"SOURCE\" refId=\"1\"/>    \r\n    <end type=\"TARGET\" refId=\"3\"/>  \r\n  </realization>  \r\n  <classifier-display autosize=\"true\" stereotype=\"true\" package=\"true\" initial-value=\"false\" signature=\"true\" \r\n    sort-features=\"false\" accessors=\"true\" visibility=\"true\">    \r\n    <attributes public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>    \r\n    <operations public=\"true\" package=\"true\" protected=\"true\" private=\"true\" static=\"true\"/>  \r\n  </classifier-display>  \r\n  <association-display labels=\"true\" multiplicity=\"true\"/>\r\n</class-diagram>"
  }
]