Repository: spring2go/core-spring-patterns
Branch: master
Commit: 6df03a4bde6b
Files: 202
Total size: 141.1 KB
Directory structure:
gitextract_i2ygnjo2/
├── .gitignore
├── LICENSE
├── README.md
└── patterns/
├── behavior/
│ ├── chain_of_responsibility/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ ├── ApproveHandler.java
│ │ ├── ClientProgram.java
│ │ ├── HR.java
│ │ ├── Leave.java
│ │ ├── ProjectLeader.java
│ │ └── TeamLeader.java
│ ├── command/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ └── command/
│ │ ├── CloseFileCommand.java
│ │ ├── Command.java
│ │ ├── FileInvoker.java
│ │ ├── FileSystemClient.java
│ │ ├── FileSystemReceiver.java
│ │ ├── FileSystemReceiverUtil.java
│ │ ├── OpenFileCommand.java
│ │ ├── UnixFileSystemReceiver.java
│ │ ├── WindowsFileSystemReceiver.java
│ │ ├── WriteFileCommand.java
│ │ └── uml.ucls
│ ├── interpreter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ └── interpreter/
│ │ ├── App.java
│ │ ├── Expression.java
│ │ ├── MinusExpression.java
│ │ ├── MultiplyExpression.java
│ │ ├── NumberExpression.java
│ │ ├── PlusExpression.java
│ │ └── uml.ucls
│ ├── iterator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ └── iterator/
│ │ ├── App.java
│ │ ├── Channel.java
│ │ ├── ChannelCollection.java
│ │ ├── ChannelCollectionImpl.java
│ │ ├── ChannelIterator.java
│ │ ├── ChannelTypeEnum.java
│ │ └── uml.ucls
│ ├── observer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── patterns/
│ │ └── observer/
│ │ ├── Follower.java
│ │ ├── Observer.java
│ │ ├── ObserverPatternMain.java
│ │ ├── OfficialAccount.java
│ │ ├── Subject.java
│ │ └── uml.ucls
│ ├── strategy/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ └── strategy/
│ │ ├── HeapSortStrategy.java
│ │ ├── MergeSortStrategy.java
│ │ ├── QuickSortStrategy.java
│ │ ├── SortingMainV1.java
│ │ ├── SortingMainV2.java
│ │ ├── SortingManagerV1.java
│ │ ├── SortingManagerV2.java
│ │ ├── SortingStrategy.java
│ │ ├── SortingType.java
│ │ └── uml.ucls
│ └── template/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── patterns/
│ └── template/
│ ├── CSVDataParser.java
│ ├── DataParser.java
│ ├── DatabaseDataParser.java
│ └── TemplateMethodMain.java
├── creation/
│ ├── abstract-factory/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ └── abstractfactory/
│ │ ├── AbstractFactoryMain.java
│ │ ├── ChineseElectricalFactory.java
│ │ ├── ChineseFan.java
│ │ ├── ChineseTubeLight.java
│ │ ├── IElectricalFactory.java
│ │ ├── IFan.java
│ │ ├── ITubeLight.java
│ │ ├── USElectricalFactory.java
│ │ ├── USFan.java
│ │ └── USTubeLight.java
│ ├── builder/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ ├── classicbuilder/
│ │ │ ├── AndroidPhoneBuilder.java
│ │ │ ├── Battery.java
│ │ │ ├── ClassicBuilderMain.java
│ │ │ ├── IMobilePhoneBuilder.java
│ │ │ ├── Manufacturer.java
│ │ │ ├── MobilePhone.java
│ │ │ ├── OperatingSystem.java
│ │ │ ├── ScreenType.java
│ │ │ ├── Stylus.java
│ │ │ └── WindowsPhoneBuilder.java
│ │ ├── javabean/
│ │ │ ├── JavaBeanMain.java
│ │ │ └── User.java
│ │ ├── modernbuilder/
│ │ │ ├── ModernBuilderMain.java
│ │ │ └── User.java
│ │ └── telescoping_constructor/
│ │ └── User.java
│ ├── factory-method/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ └── factorymethod/
│ │ ├── CeilingFan.java
│ │ ├── CeilingFanFactory.java
│ │ ├── ExhaustFan.java
│ │ ├── ExhaustFanFactory.java
│ │ ├── FactoryMethodMain.java
│ │ ├── IFan.java
│ │ ├── IFanFactory.java
│ │ ├── PropellerFan.java
│ │ ├── PropellerFanFactory.java
│ │ ├── TableFan.java
│ │ └── TableFanFactory.java
│ ├── simple-factory/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── io/
│ │ └── spring2go/
│ │ └── corespring/
│ │ ├── nofactory/
│ │ │ └── NoFactoryMain.java
│ │ └── simplefactory/
│ │ ├── CeilingFan.java
│ │ ├── ExhaustFan.java
│ │ ├── FanFactory.java
│ │ ├── FanType.java
│ │ ├── IFan.java
│ │ ├── IFanFactory.java
│ │ ├── SimpleFactoryMain.java
│ │ └── TableFan.java
│ └── singleton/
│ ├── filename.ser
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── corespring/
│ ├── singleton/
│ │ ├── v3/
│ │ │ └── BillPughSingleton.java
│ │ └── v4/
│ │ ├── EnumSingleton.java
│ │ └── TestEnumSingleton.java
│ ├── singleton_deserialization/
│ │ ├── DemoSingleton.java
│ │ └── SerializationTest.java
│ ├── singleton_reflection/
│ │ ├── ReflectionSingleton.java
│ │ └── ReflectionTest.java
│ ├── singleton_v1/
│ │ └── EagerSingleton.java
│ ├── singleton_v1_1/
│ │ └── StaticBlockSingleton.java
│ ├── singleton_v2/
│ │ └── LazySingleton.java
│ ├── singleton_v2_1/
│ │ └── ThreadSafeSingleton.java
│ └── singleton_v2_2/
│ └── DoubleCheckLockingSingleton.java
├── general/
│ └── dependency-inversion/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── corespring/
│ ├── injection/
│ │ ├── AppMonitorConstructorInjection.java
│ │ └── AppMonitorSetterInjection.java
│ ├── ioc/
│ │ ├── AppMonitorIOC.java
│ │ ├── EmailSender.java
│ │ ├── EventLogWriter.java
│ │ ├── INotifier.java
│ │ └── SMSSender.java
│ └── nodip/
│ └── AppMonitorNoDIP.java
└── structural/
├── adapter/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── corespring/
│ ├── display/
│ │ ├── IHdmi.java
│ │ ├── IVga.java
│ │ ├── LaptopMain.java
│ │ ├── Vga2HdmiAdapter.java
│ │ └── VgaDisplay.java
│ └── stack/
│ ├── ArrayStack.java
│ ├── ArrayStackMain.java
│ ├── IStack.java
│ └── StackException.java
├── bridge/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── corespring/
│ └── bridge/
│ ├── Client.java
│ ├── FileDownloadImplementor.java
│ ├── FileDownloaderAbstraction.java
│ ├── FileDownloaderAbstractionImpl.java
│ ├── LinuxFileDownloadImplementor.java
│ ├── WindowsFileDownloadImplementor.java
│ ├── abstraction_change/
│ │ ├── FileDownloaderAbstraction.java
│ │ └── FileDownloaderAbstractionImpl.java
│ └── implementation_change/
│ ├── FileDownloadImplementor.java
│ ├── LinuxFileDownloadImplementor.java
│ └── WindowsFileDownloadImplementor.java
├── composite/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── corespring/
│ ├── composite_complex/
│ │ ├── BaseEmployee.java
│ │ ├── CompanyMain.java
│ │ ├── Developer.java
│ │ ├── IEmployee.java
│ │ ├── Manager.java
│ │ ├── Subscription.java
│ │ ├── SubscriptionType.java
│ │ └── Util.java
│ └── composite_simple/
│ ├── CompositePatternMain.java
│ ├── Developer.java
│ ├── IEmployee.java
│ └── Manager.java
├── decorator/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── corespring/
│ └── decorator/
│ ├── ArtificialScentDecorator.java
│ ├── BakeryComponent.java
│ ├── CakeBase.java
│ ├── CherryDecorator.java
│ ├── CreamDecorator.java
│ ├── Decorator.java
│ ├── DecoratorMain.java
│ ├── NameCardDecorator.java
│ ├── PastryBase.java
│ ├── Util.java
│ └── uml.ucls
├── facade/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── io/
│ └── spring2go/
│ └── corespring/
│ └── facade/
│ ├── CostManager.java
│ ├── FacadeMain.java
│ ├── ICosting.java
│ ├── IInventory.java
│ ├── ILogistics.java
│ ├── IOrderVerify.java
│ ├── IPaymentGateway.java
│ ├── InventoryManager.java
│ ├── LogisticsManager.java
│ ├── NoFacadeMain.java
│ ├── OnlineShoppingFacade.java
│ ├── OrderDetails.java
│ ├── OrderVerificationManager.java
│ └── PaymentGatewayManager.java
└── proxy/
├── pom.xml
└── src/
└── main/
└── java/
└── io/
└── spring2go/
└── corespring/
├── Folder.java
├── FolderProxy.java
├── IFolder.java
├── ProxyDesignPatternMain.java
├── User.java
└── uml.ucls
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
target/
!.mvn/wrapper/maven-wrapper.jar
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
*.iml
.gradle
local.properties
.idea/workspace.xml
.idea/libraries
.DS_Store
build/
captures/
.externalNativeBuild
### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2018 spring2go.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
core-spring-patterns
======
Spring核心原理和模式,波波微课
## 大纲
### 1. 创建模式
名称 | 代码 | ppt | 视频 |
----|-----|-----|-----|
简单工厂Simple Factory|[code](patterns/creation/simple-factory)|[ppt](ppts/简单工厂.pdf)|[video](https://v.qq.com/x/page/n0629exrd31.html)|
工厂方法Factory Method|[code](patterns/creation/factory-method)|[ppt](ppts/工厂方法.pdf)|[video](https://v.qq.com/x/page/a0629kh0xxc.html)|
抽象工厂Abstract Factory|[code](patterns/creation/abstract-factory)|[ppt](ppts/抽象工厂.pdf)|[video](https://v.qq.com/x/page/p0629psr89t.html)|
单例Singleton|[code](patterns/creation/singleton)|[ppt](ppts/单例.pdf)|[video](https://v.qq.com/x/page/s0630rqg9wg.html)|
构造者Builder|[code](patterns/creation/builder)|[ppt](ppts/构建者.pdf)|[video](https://v.qq.com/x/page/z0630bg1qs3.html)|
流畅接口Fluent Interface|[code](patterns/creation/builder)|[ppt](ppts/流畅接口.pdf)|[video](https://v.qq.com/x/page/v063000n872.html)|
### 2. 结构模式
名称 | 代码 | ppt | 视频 |
----|-----|-----|-----|
适配器Adapter|[code](patterns/structural/adapter)|[ppt](ppts/适配器.pdf)|[video](https://v.qq.com/x/page/w0632njvzkw.html)|
桥接器Bridge|[code](patterns/structural/bridge)|[ppt](ppts/桥接器.pdf)|[video](https://v.qq.com/x/page/h0632obkktb.html)|
组合Composite|[code](patterns/structural/composite)|[ppt](ppts/组合模式.pdf)|[video](https://v.qq.com/x/page/t0634x9lbew.html)|
装饰Decorator|[code](patterns/structural/decorator)|[ppt](ppts/装饰模式.pdf)|[video](http://v.qq.com/x/page/p0636w3d6s2.html)|
门面Facade|[code](patterns/structural/facade)|[ppt](ppts/门面模式.pdf)|[video](https://v.qq.com/x/page/m06379lgexy.html)|
代理Proxy|[code](patterns/structural/proxy)|[ppt](ppts/代理模式.pdf)|[video](https://v.qq.com/x/page/k0637354wuw.html)|
### 3. 行为模式
名称 | 代码 | ppt | 视频 |
----|-----|-----|-----|
职责链Chain of Responsibility|[code](patterns/behavior/chain_of_responsibility)|[ppt](ppts/职责链模式.pdf)|[video](http://v.qq.com/x/page/r0640omm9hs.html)|
命令Command|[code](patterns/behavior/command)|[ppt](ppts/命令模式.pdf)|[video](https://v.qq.com/x/page/j0641ba2m4j.html)|
解释器Interpreter|[code](patterns/behavior/interpreter)|[ppt](ppts/解释器模式.pdf)|[video](http://v.qq.com/x/page/t0642g9ioam.html)|
迭代器Iterator|[code](patterns/behavior/iterator)|[ppt](ppts/迭代器模式.pdf)|[video](https://v.qq.com/x/page/a0643uhcvgn.html)|
策略Strategy|[code](patterns/behavior/strategy)|[ppt](ppts/策略模式.pdf)|[video](http://v.qq.com/x/page/n0645457b19.html)|
观察者Observer|[code](patterns/behavior/observer)|[ppt](ppts/观察者模式.pdf)|[video](http://v.qq.com/x/page/j0653cekdal.html)|
模板方法Template Method|[code](patterns/behavior/template)|[ppt](ppts/模板方法模式.pdf)|[video](https://v.qq.com/x/page/p0654hjkpy3.html)|
### 4. 核心模式
名称 | 代码 | ppt | 视频 |
----|-----|-----|-----|
依赖倒置原则,控制反转,依赖注入|[code](patterns/general/dependency-inversion)|[ppt](ppts/DIP+IoC+DI.pdf)|[video](https://v.qq.com/x/page/k0629qsrpz5.html)|
## 波波微课公众号

## 官网
[jskillcloud.com](http://www.jskillcloud.com)
================================================
FILE: patterns/behavior/chain_of_responsibility/pom.xml
================================================
4.0.0
io.spring2go.corespring
ChainOfResponsibility
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/ApproveHandler.java
================================================
package io.spring2go.corespring;
// Handler
public interface ApproveHandler {
public void setNextHandler(ApproveHandler nextHandler);
public void approve(Leave leave);
}
================================================
FILE: patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/ClientProgram.java
================================================
package io.spring2go.corespring;
// Client
public class ClientProgram {
public static void main(String[] args) {
TeamLeader tl = new TeamLeader();
ProjectLeader pl = new ProjectLeader();
HR hr = new HR();
tl.setNextHandler(pl);
pl.setNextHandler(hr);
tl.approve(new Leave(1, 5));
tl.approve(new Leave(2, 15));
tl.approve(new Leave(3, 25));
tl.approve(new Leave(4, 35));
}
}
================================================
FILE: patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/HR.java
================================================
package io.spring2go.corespring;
//ConcreteHandler
public class HR implements ApproveHandler {
private ApproveHandler nextHandler;
public final static int MAX_LEAVES_CAN_APPROVE = 30;
public void setNextHandler(ApproveHandler nextHandler) {
this.nextHandler = nextHandler;
}
public void approve(Leave leave) {
if (leave.getNumberOfDays() < MAX_LEAVES_CAN_APPROVE) {
String output = String.format(
"LeaveId: %d, Days: %d, Approver: %s",
leave.getLeaveId(),
leave.getNumberOfDays(),
"HR");
System.out.println(output);
} else {
if (nextHandler != null) {
nextHandler.approve(leave);
} else {
System.out.println("Leave application suspended, Please contact HR");
}
}
}
}
================================================
FILE: patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/Leave.java
================================================
package io.spring2go.corespring;
// 请求对象
public class Leave {
private int leaveId;
private int numberOfDays;
public Leave(int leaveId, int numberOfDays) {
this.leaveId = leaveId;
this.numberOfDays = numberOfDays;
}
// region getter/setter
public int getLeaveId() {
return leaveId;
}
public void setLeaveId(int leaveId) {
this.leaveId = leaveId;
}
public int getNumberOfDays() {
return numberOfDays;
}
public void setNumberOfDays(int numberOfDays) {
this.numberOfDays = numberOfDays;
}
// endregion
}
================================================
FILE: patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/ProjectLeader.java
================================================
package io.spring2go.corespring;
//ConcreteHandler
public class ProjectLeader implements ApproveHandler {
private ApproveHandler nextHandler;
public final static int MAX_LEAVES_CAN_APPROVE = 20;
public void setNextHandler(ApproveHandler nextHandler) {
this.nextHandler = nextHandler;
}
public void approve(Leave leave) {
if (leave.getNumberOfDays() < MAX_LEAVES_CAN_APPROVE) {
String output = String.format(
"LeaveId: %d, Days: %d, Approver: %s",
leave.getLeaveId(),
leave.getNumberOfDays(),
"ProjectLeader");
System.out.println(output);
} else {
if (nextHandler != null) {
nextHandler.approve(leave);
}
}
}
}
================================================
FILE: patterns/behavior/chain_of_responsibility/src/main/java/io/spring2go/corespring/TeamLeader.java
================================================
package io.spring2go.corespring;
// ConcreteHandler
public class TeamLeader implements ApproveHandler {
private ApproveHandler nextHandler;
public final static int MAX_LEAVES_CAN_APPROVE = 10;
public void setNextHandler(ApproveHandler nextHandler) {
this.nextHandler = nextHandler;
}
public void approve(Leave leave) {
if (leave.getNumberOfDays() < MAX_LEAVES_CAN_APPROVE) {
String output = String.format(
"LeaveId: %d, Days: %d, Approver: %s",
leave.getLeaveId(),
leave.getNumberOfDays(),
"TeamLeader");
System.out.println(output);
} else {
if (nextHandler != null) {
nextHandler.approve(leave);
}
}
}
}
================================================
FILE: patterns/behavior/command/pom.xml
================================================
4.0.0
io.spring2go.corespring
Command
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/CloseFileCommand.java
================================================
package io.spring2go.corespring.command;
// Concrete Command
public class CloseFileCommand implements Command {
private FileSystemReceiver fileSystem;
public CloseFileCommand(FileSystemReceiver fs) {
this.fileSystem = fs;
}
@Override
public void execute() {
this.fileSystem.closeFile();
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/Command.java
================================================
package io.spring2go.corespring.command;
// Command interface
public interface Command {
void execute();
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileInvoker.java
================================================
package io.spring2go.corespring.command;
// Invoker
public class FileInvoker {
private Command command;
public FileInvoker(Command c) {
this.command = c;
}
public void execute() {
this.command.execute();
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileSystemClient.java
================================================
package io.spring2go.corespring.command;
// Client
public class FileSystemClient {
public static void main(String[] args) {
// creating the receiver object
FileSystemReceiver fs = FileSystemReceiverUtil.getUnderlyingFileSystem();
// creating command and associating with receiver
OpenFileCommand openFileCommand = new OpenFileCommand(fs);
// creating invoker and associating with Command
FileInvoker file = new FileInvoker(openFileCommand);
// perform action on invoker object
file.execute();
WriteFileCommand writeFileCommand = new WriteFileCommand(fs);
file = new FileInvoker(writeFileCommand);
file.execute();
CloseFileCommand closeFileCommand = new CloseFileCommand(fs);
file = new FileInvoker(closeFileCommand);
file.execute();
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileSystemReceiver.java
================================================
package io.spring2go.corespring.command;
// Receiver Interface
public interface FileSystemReceiver {
void openFile();
void writeFile();
void closeFile();
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/FileSystemReceiverUtil.java
================================================
package io.spring2go.corespring.command;
public class FileSystemReceiverUtil {
public static FileSystemReceiver getUnderlyingFileSystem() {
String osName = System.getProperty("os.name");
System.out.println("Underlying OS is : " + osName);
if (osName.contains("Windows")) {
return new WindowsFileSystemReceiver();
} else {
return new UnixFileSystemReceiver();
}
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/OpenFileCommand.java
================================================
package io.spring2go.corespring.command;
// Concrete Command
public class OpenFileCommand implements Command {
private FileSystemReceiver fileSystem;
public OpenFileCommand(FileSystemReceiver fs) {
this.fileSystem = fs;
}
@Override
public void execute() {
// open command is forwarding request to openFile method
this.fileSystem.openFile();
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/UnixFileSystemReceiver.java
================================================
package io.spring2go.corespring.command;
// Receiver
public class UnixFileSystemReceiver implements FileSystemReceiver {
@Override
public void openFile() {
System.out.println("Opening file in unix OS");
}
@Override
public void writeFile() {
System.out.println("Writing file in unix OS");
}
@Override
public void closeFile() {
System.out.println("Closing file in unix OS");
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/WindowsFileSystemReceiver.java
================================================
package io.spring2go.corespring.command;
// Receiver
public class WindowsFileSystemReceiver implements FileSystemReceiver {
@Override
public void openFile() {
System.out.println("Opening file in Windows OS");
}
@Override
public void writeFile() {
System.out.println("Writing file in Windows OS");
}
@Override
public void closeFile() {
System.out.println("Closing file in Windows OS");
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/WriteFileCommand.java
================================================
package io.spring2go.corespring.command;
// Concrete Command
public class WriteFileCommand implements Command {
private FileSystemReceiver fileSystem;
public WriteFileCommand(FileSystemReceiver fs) {
this.fileSystem = fs;
}
@Override
public void execute() {
this.fileSystem.writeFile();
}
}
================================================
FILE: patterns/behavior/command/src/main/java/io/spring2go/corespring/command/uml.ucls
================================================
================================================
FILE: patterns/behavior/interpreter/pom.xml
================================================
4.0.0
io.spring2go.corespring
Interpreter
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/App.java
================================================
package io.spring2go.corespring.interpreter;
import java.util.Stack;
// Interpreter
public class App {
/**
* Expression can be evaluated using prefix, infix or postfix notations
* This sample uses postfix, where operator comes after the operands.
*/
public static void main(String[] args) {
String tokenString = "4 3 2 - 1 + *"; // (3 - 2 + 1) * 4
Stack stack = new Stack<>();
String[] tokenList = tokenString.split(" ");
for(String s : tokenList) {
if (isOperator(s)) {
Expression rightExpression = stack.pop();
Expression leftExpression = stack.pop();
Expression operator =
getOperatorInstance(s, leftExpression, rightExpression);
int result = operator.interpret();
NumberExpression resultExpression = new NumberExpression(result);
stack.push(resultExpression);
} else {
Expression i = new NumberExpression(s);
stack.push(i);
}
}
System.out.println("result: " + stack.pop().interpret());
}
public static boolean isOperator(String s) {
return s.equals("+") || s.equals("-") || s.equals("*");
}
// Get expression for string
public static Expression getOperatorInstance(
String s, Expression left, Expression right) {
switch (s) {
case "+":
return new PlusExpression(left, right);
case "-":
return new MinusExpression(left, right);
case "*":
return new MultiplyExpression(left, right);
default:
return new MultiplyExpression(left, right);
}
}
}
================================================
FILE: patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/Expression.java
================================================
package io.spring2go.corespring.interpreter;
// Expression
public abstract class Expression {
public abstract int interpret();
@Override
public abstract String toString();
}
================================================
FILE: patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/MinusExpression.java
================================================
package io.spring2go.corespring.interpreter;
// MinusExpression
public class MinusExpression extends Expression {
private Expression leftExpression;
private Expression rightExpression;
public MinusExpression(
Expression leftExpression,
Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
@Override
public int interpret() {
return leftExpression.interpret() - rightExpression.interpret();
}
@Override
public String toString() {
return "-";
}
}
================================================
FILE: patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/MultiplyExpression.java
================================================
package io.spring2go.corespring.interpreter;
// MultiplyExpression
public class MultiplyExpression extends Expression {
private Expression leftExpression;
private Expression rightExpression;
public MultiplyExpression(
Expression leftExpression,
Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
@Override
public int interpret() {
return leftExpression.interpret() * rightExpression.interpret();
}
@Override
public String toString() {
return "*";
}
}
================================================
FILE: patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/NumberExpression.java
================================================
package io.spring2go.corespring.interpreter;
// NumberExpression
public class NumberExpression extends Expression {
private int number;
public NumberExpression(int number) {
this.number = number;
}
public NumberExpression(String s) {
this.number = Integer.parseInt(s);
}
@Override
public int interpret() {
return number;
}
@Override
public String toString() {
return "number";
}
}
================================================
FILE: patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/PlusExpression.java
================================================
package io.spring2go.corespring.interpreter;
// PlusExpression
public class PlusExpression extends Expression {
private Expression leftExpression;
private Expression rightExpression;
public PlusExpression(
Expression leftExpression,
Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
@Override
public int interpret() {
return leftExpression.interpret() + rightExpression.interpret();
}
@Override
public String toString() {
return "+";
}
}
================================================
FILE: patterns/behavior/interpreter/src/main/java/io/spring2go/corespring/interpreter/uml.ucls
================================================
================================================
FILE: patterns/behavior/iterator/pom.xml
================================================
4.0.0
io.spring2go.corespring
Iterator
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/App.java
================================================
package io.spring2go.corespring.iterator;
// Client App
public class App {
public static void main(String[] args) {
ChannelCollection channels = populateChannels();
ChannelIterator baseIterator = channels.iterator(ChannelTypeEnum.ALL);
while (baseIterator.hasNext()) {
Channel c = baseIterator.next();
System.out.println(c.toString());
}
System.out.println("******");
// Channel Type Iterator
ChannelIterator englishIterator = channels.iterator(ChannelTypeEnum.ENGLISH);
while (englishIterator.hasNext()) {
Channel c = englishIterator.next();
System.out.println(c.toString());
}
}
private static ChannelCollection populateChannels() {
ChannelCollection channels = new ChannelCollectionImpl();
channels.addChannel(new Channel(98.5, ChannelTypeEnum.ENGLISH));
channels.addChannel(new Channel(99.5, ChannelTypeEnum.CHINESE));
channels.addChannel(new Channel(100.5, ChannelTypeEnum.FRENCH));
channels.addChannel(new Channel(101.5, ChannelTypeEnum.ENGLISH));
channels.addChannel(new Channel(102.5, ChannelTypeEnum.CHINESE));
channels.addChannel(new Channel(103.5, ChannelTypeEnum.FRENCH));
channels.addChannel(new Channel(104.5, ChannelTypeEnum.ENGLISH));
channels.addChannel(new Channel(105.5, ChannelTypeEnum.CHINESE));
channels.addChannel(new Channel(106.5, ChannelTypeEnum.FRENCH));
return channels;
}
}
================================================
FILE: patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/Channel.java
================================================
package io.spring2go.corespring.iterator;
public class Channel {
private double frequency;
private ChannelTypeEnum type;
public Channel(double freq, ChannelTypeEnum type) {
this.frequency = freq;
this.type = type;
}
public double getFrequency() {
return frequency;
}
public ChannelTypeEnum getType() {
return type;
}
@Override
public String toString() {
return "Frequency = " + this.frequency + ", Type = " + this.type;
}
}
================================================
FILE: patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelCollection.java
================================================
package io.spring2go.corespring.iterator;
// Aggregate
public interface ChannelCollection {
public void addChannel(Channel c);
public void removeChannel(Channel c);
public ChannelIterator iterator(ChannelTypeEnum type);
}
================================================
FILE: patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelCollectionImpl.java
================================================
package io.spring2go.corespring.iterator;
import java.util.ArrayList;
import java.util.List;
// ConcreteAggregate
public class ChannelCollectionImpl implements ChannelCollection {
private List channelList;
public ChannelCollectionImpl() {
channelList = new ArrayList<>();
}
@Override
public void addChannel(Channel c) {
this.channelList.add(c);
}
@Override
public void removeChannel(Channel c) {
this.channelList.remove(c);
}
@Override
public ChannelIterator iterator(ChannelTypeEnum type) {
return new ChannelIteratorImpl(type, this.channelList);
}
// ConcreteIterator
private class ChannelIteratorImpl implements ChannelIterator {
private ChannelTypeEnum type;
private List channels;
private int position;
public ChannelIteratorImpl(ChannelTypeEnum type,
List channelList) {
this.type = type;
this.channels = channelList;
}
@Override
public boolean hasNext() {
while (position < channels.size()) {
Channel c = channels.get(position);
if (c.getType().equals(type) ||
type.equals(ChannelTypeEnum.ALL)) {
return true;
} else {
position++;
}
}
return false;
}
@Override
public Channel next() {
Channel c = channels.get(position);
position++;
return c;
}
}
}
================================================
FILE: patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelIterator.java
================================================
package io.spring2go.corespring.iterator;
// Iterator
public interface ChannelIterator {
public boolean hasNext();
public Channel next();
}
================================================
FILE: patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/ChannelTypeEnum.java
================================================
package io.spring2go.corespring.iterator;
public enum ChannelTypeEnum {
ENGLISH, CHINESE, FRENCH, ALL;
}
================================================
FILE: patterns/behavior/iterator/src/main/java/io/spring2go/corespring/iterator/uml.ucls
================================================
================================================
FILE: patterns/behavior/observer/pom.xml
================================================
4.0.0
io.spring2go.patterns
Observer
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/Follower.java
================================================
package io.spring2go.patterns.observer;
public class Follower implements Observer {
private String followerName;
public Follower(String followerName) {
this.followerName = followerName;
}
@Override
public void update(String oaName, String article) {
System.out.println(followerName + " has received "
+ oaName + "'s article :: " + article );
}
@Override
public String toString() {
return followerName;
}
}
================================================
FILE: patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/Observer.java
================================================
package io.spring2go.patterns.observer;
// The Observers are notified when the Subject changes
public interface Observer {
public void update(String name, String s);
}
================================================
FILE: patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/ObserverPatternMain.java
================================================
package io.spring2go.patterns.observer;
public class ObserverPatternMain {
public static void main(String[] args) {
OfficialAccount bobo = new OfficialAccount("bobo");
OfficialAccount infoq = new OfficialAccount("infoq");
Follower mark = new Follower("Mark");
Follower eric = new Follower("Eric");
Follower jack = new Follower("Jack");
Follower frank = new Follower("Frank");
Follower daniel = new Follower("Daniel");
Follower alice = new Follower("Alice");
bobo.register(mark);
bobo.register(eric);
bobo.register(jack);
infoq.register(frank);
infoq.register(daniel);
infoq.register(alice);
bobo.pushArticle("observer design pattern video course");
infoq.pushArticle("spring 5.0 is out");
bobo.unregister(eric);
bobo.pushArticle("core java course is released");
}
}
================================================
FILE: patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/OfficialAccount.java
================================================
package io.spring2go.patterns.observer;
import java.util.ArrayList;
import java.util.List;
public class OfficialAccount implements Subject {
private String oaName;
private List followers;
public OfficialAccount(String oaName) {
this.oaName = oaName;
followers = new ArrayList();
}
@Override
public void register(Observer o) {
followers.add(o);
System.out.println(o + " has started following " + oaName);
}
@Override
public void unregister(Observer o) {
followers.remove(o);
System.out.println(o + " has stopped following " + oaName);
}
@Override
public void notifyAllObservers(String article) {
for(Observer follower : followers) {
follower.update(oaName, article);
}
System.out.println();
}
public void pushArticle(String article) {
System.out.println("\n" + oaName + " has pushed :: " + article);
notifyAllObservers(article);
}
}
================================================
FILE: patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/Subject.java
================================================
package io.spring2go.patterns.observer;
// interface for adding, deleting
// and updating all observers
public interface Subject {
public void register(Observer o);
public void unregister(Observer o);
public void notifyAllObservers(String s);
}
================================================
FILE: patterns/behavior/observer/src/main/java/io/spring2go/patterns/observer/uml.ucls
================================================
================================================
FILE: patterns/behavior/strategy/pom.xml
================================================
4.0.0
io.spring2go.corespring
Strategy
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/HeapSortStrategy.java
================================================
package io.spring2go.corespring.strategy;
import java.util.List;
public class HeapSortStrategy implements SortingStrategy {
@Override
public void sort(List list) {
System.out.println("Sorting using heap sort");
}
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/MergeSortStrategy.java
================================================
package io.spring2go.corespring.strategy;
import java.util.List;
// ConcreteStrategy
public class MergeSortStrategy implements SortingStrategy {
@Override
public void sort(List list) {
System.out.println("Sorting List using merge sort");
}
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/QuickSortStrategy.java
================================================
package io.spring2go.corespring.strategy;
import java.util.List;
// ConcreteStrategy
public class QuickSortStrategy implements SortingStrategy {
@Override
public void sort(List list) {
System.out.println("Sorting List using quick sort");
}
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingMainV1.java
================================================
package io.spring2go.corespring.strategy;
import java.util.Arrays;
import java.util.List;
public class SortingMainV1 {
public static void main(String[] args) {
List list = Arrays.asList(new Integer[] { 44, 5, 3, 5, 5, 64, 3 });
SortingManagerV1 sm = new SortingManagerV1(list);
// Sorting using merge sort
sm.sortListBasedOnType(SortingType.MERGE_SORT);
System.out.println();
// Sorting using quick sort
sm.sortListBasedOnType(SortingType.QUICK_SORT);
System.out.println();
// Sorting using heap sort
sm.sortListBasedOnType(SortingType.HEAP_SORT);
}
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingMainV2.java
================================================
package io.spring2go.corespring.strategy;
import java.util.Arrays;
import java.util.List;
public class SortingMainV2 {
public static void main(String[] args) {
List list = Arrays.asList(new Integer[] { 44, 5, 3, 5, 5, 64, 3 });
MergeSortStrategy mergeSortStrategy = new MergeSortStrategy();
SortingManagerV2 sm = new SortingManagerV2(list, mergeSortStrategy);
sm.sortList();
System.out.println();
QuickSortStrategy quickSort = new QuickSortStrategy();
sm.setSortingStrategy(quickSort);
sm.sortList();
System.out.println();
HeapSortStrategy heapSort = new HeapSortStrategy();
sm.setSortingStrategy(heapSort);
sm.sortList();
}
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingManagerV1.java
================================================
package io.spring2go.corespring.strategy;
import java.util.List;
public class SortingManagerV1 {
List list;
public SortingManagerV1(List list) {
this.list = list;
}
public void sortListBasedOnType(SortingType sortingType) {
System.out.println("===================================");
System.out.println("Sorting List based on Type");
System.out.println("===================================");
if (SortingType.MERGE_SORT == sortingType) {
sortListUsingMergeSort();
} else if (SortingType.QUICK_SORT == sortingType) {
sortListUsingQuickSort();
} else if (SortingType.HEAP_SORT == sortingType) {
sortListUsingHeapSort();
}
}
private void sortListUsingMergeSort() {
System.out.println("Sorting List using merge sort");
}
private void sortListUsingQuickSort() {
System.out.println("Sorting List using quick sort");
}
private void sortListUsingHeapSort() {
System.out.println("Sorting List using heap sort");
}
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingManagerV2.java
================================================
package io.spring2go.corespring.strategy;
import java.util.List;
public class SortingManagerV2 {
SortingStrategy sortingStrategy;
List list;
public SortingManagerV2(List list, SortingStrategy sortingStrategy) {
super();
this.list = list;
this.sortingStrategy = sortingStrategy;
}
public void sortList() {
System.out.println("===================================");
System.out.println("Sorting List based on Type");
System.out.println("===================================");
sortingStrategy.sort(list);
}
public SortingStrategy getSortingStrategy() {
return sortingStrategy;
}
public void setSortingStrategy(SortingStrategy sortingStrategy) {
this.sortingStrategy = sortingStrategy;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingStrategy.java
================================================
package io.spring2go.corespring.strategy;
import java.util.List;
// Strategy
public interface SortingStrategy {
void sort(List list);
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/SortingType.java
================================================
package io.spring2go.corespring.strategy;
public enum SortingType {
MERGE_SORT, QUICK_SORT, HEAP_SORT;
}
================================================
FILE: patterns/behavior/strategy/src/main/java/io/spring2go/corespring/strategy/uml.ucls
================================================
================================================
FILE: patterns/behavior/template/pom.xml
================================================
4.0.0
io.spring2go.patterns.template
Template
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/behavior/template/src/main/java/io/spring2go/patterns/template/CSVDataParser.java
================================================
package io.spring2go.patterns.template;
public class CSVDataParser extends DataParser {
@Override
void readData() {
System.out.println("Reading data from csv file");
}
@Override
void processData() {
System.out.println("Looping through loaded csv file");
}
}
================================================
FILE: patterns/behavior/template/src/main/java/io/spring2go/patterns/template/DataParser.java
================================================
package io.spring2go.patterns.template;
abstract class DataParser {
// generic data processing flow
public final void process() {
readData();
processData();
writeData();
}
// implemented by subclass
abstract void readData();
abstract void processData();
// same for all subclass
public void writeData() {
System.out.println("Ouput generated, writing to CSV");
}
}
================================================
FILE: patterns/behavior/template/src/main/java/io/spring2go/patterns/template/DatabaseDataParser.java
================================================
package io.spring2go.patterns.template;
public class DatabaseDataParser extends DataParser {
@Override
void readData() {
System.out.println("Reading data from database");
}
@Override
void processData() {
System.out.println("Looping through records in DB");
}
}
================================================
FILE: patterns/behavior/template/src/main/java/io/spring2go/patterns/template/TemplateMethodMain.java
================================================
package io.spring2go.patterns.template;
public class TemplateMethodMain {
public static void main(String[] args) {
CSVDataParser csvDataParser = new CSVDataParser();
csvDataParser.process();
System.out.println("**********************");
DatabaseDataParser databaseDataParser = new DatabaseDataParser();
databaseDataParser.process();
}
}
================================================
FILE: patterns/creation/abstract-factory/pom.xml
================================================
4.0.0
io.spring2go.corespring
AbstractFactory
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/AbstractFactoryMain.java
================================================
package io.spring2go.corespring.abstractfactory;
public class AbstractFactoryMain {
public static void main(String[] args) {
// 国产
IElectricalFactory electricalFactory = new ChineseElectricalFactory();
IFan fan = electricalFactory.createFan();
fan.swithOn();
// 美产
electricalFactory = new USElectricalFactory();
ITubeLight tubeLight = electricalFactory.createTubeLight();
tubeLight.swithOn();
tubeLight.tuneLight();
}
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ChineseElectricalFactory.java
================================================
package io.spring2go.corespring.abstractfactory;
public class ChineseElectricalFactory implements IElectricalFactory {
public IFan createFan() {
return new ChineseFan();
}
public ITubeLight createTubeLight() {
return new ChineseTubeLight();
}
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ChineseFan.java
================================================
package io.spring2go.corespring.abstractfactory;
public class ChineseFan implements IFan {
public void swithOn() {
System.out.println("The ChineseFan is swithed on ...");
}
public void switchOff() {
System.out.println("The ChineseFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ChineseTubeLight.java
================================================
package io.spring2go.corespring.abstractfactory;
public class ChineseTubeLight implements ITubeLight {
public void swithOn() {
System.out.println("The ChineseTubeLight is swithed on ...");
}
public void switchOff() {
System.out.println("The ChineseTubeLight is swithed off ...");
}
public void tuneLight() {
System.out.println("The ChineseTubeLight is tuned ...");
}
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/IElectricalFactory.java
================================================
package io.spring2go.corespring.abstractfactory;
// 电器工厂接口
public interface IElectricalFactory {
IFan createFan();
ITubeLight createTubeLight();
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/IFan.java
================================================
package io.spring2go.corespring.abstractfactory;
// 电扇接口
public interface IFan {
public void swithOn();
public void switchOff();
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/ITubeLight.java
================================================
package io.spring2go.corespring.abstractfactory;
// 日光灯接口
public interface ITubeLight {
public void swithOn();
public void switchOff();
public void tuneLight();
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/USElectricalFactory.java
================================================
package io.spring2go.corespring.abstractfactory;
public class USElectricalFactory implements IElectricalFactory {
public IFan createFan() {
return new USFan();
}
public ITubeLight createTubeLight() {
return new USTubeLight();
}
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/USFan.java
================================================
package io.spring2go.corespring.abstractfactory;
public class USFan implements IFan {
public void swithOn() {
System.out.println("The USFan is swithed on ...");
}
public void switchOff() {
System.out.println("The USFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/abstract-factory/src/main/java/io/spring2go/corespring/abstractfactory/USTubeLight.java
================================================
package io.spring2go.corespring.abstractfactory;
public class USTubeLight implements ITubeLight {
public void swithOn() {
System.out.println("The USTubeLight is swithed on ...");
}
public void switchOff() {
System.out.println("The USTubeLight is swithed off ...");
}
public void tuneLight() {
System.out.println("The USTubeLight is tuned ...");
}
}
================================================
FILE: patterns/creation/builder/pom.xml
================================================
4.0.0
io.spring2go.corespring
Builder
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/AndroidPhoneBuilder.java
================================================
package io.spring2go.corespring.classicbuilder;
// 安卓手机具体构建者"ConcreteBuilder"
public class AndroidPhoneBuilder implements IMobilePhoneBuilder {
private MobilePhone phone;
public AndroidPhoneBuilder() {
this.phone = new MobilePhone("Android Phone");
}
@Override
public void buildScreen() {
phone.setPhoneScreen(ScreenType.SCREENTYPE_TOUCH_RESISTIVE);
}
@Override
public void buildBattery() {
phone.setPhoneBattery(Battery.MAH_1500);
}
@Override
public void buildOS() {
phone.setPhoneOS(OperatingSystem.ANDROID);
}
@Override
public void buildStylus() {
phone.setPhoneStylus(Stylus.YES);
}
// 获得最终构建出来的产品
@Override
public MobilePhone getPhone() {
return this.phone;
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/Battery.java
================================================
package io.spring2go.corespring.classicbuilder;
// 电池容量
public enum Battery {
MAH_1000,
MAH_1500,
MAH_2000
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/ClassicBuilderMain.java
================================================
package io.spring2go.corespring.classicbuilder;
// 客户程序
public class ClassicBuilderMain {
public static void main(String[] args) {
// 先创建导演Director
Manufacturer manufacturer = new Manufacturer();
// 先准备Builder接口
IMobilePhoneBuilder phoneBuilder = null;
// 制造一部安卓手机
phoneBuilder = new AndroidPhoneBuilder();
manufacturer.construct(phoneBuilder);
String output = String.format("A new Phone built:\n\n%s", phoneBuilder.getPhone().toString());
System.out.println(output);
// 制造一部Windows手机
phoneBuilder = new WindowsPhoneBuilder();
manufacturer.construct(phoneBuilder);
output = String.format("A new Phone built:\n\n%s", phoneBuilder.getPhone().toString());
System.out.println(output);
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/IMobilePhoneBuilder.java
================================================
package io.spring2go.corespring.classicbuilder;
// 这个是构建者"Builder"接口
public interface IMobilePhoneBuilder {
void buildScreen();
void buildBattery();
void buildOS();
void buildStylus();
MobilePhone getPhone();
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/Manufacturer.java
================================================
package io.spring2go.corespring.classicbuilder;
// 这个是导演"Director"
public class Manufacturer {
public void construct(IMobilePhoneBuilder phoneBuilder) {
phoneBuilder.buildBattery();
phoneBuilder.buildOS();
phoneBuilder.buildScreen();
phoneBuilder.buildStylus();
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/MobilePhone.java
================================================
package io.spring2go.corespring.classicbuilder;
// 这是"Product"产品类
public class MobilePhone {
// 部件类型
private String phoneName;
private ScreenType phoneScreen;
private Battery phoneBattery;
private OperatingSystem phoneOS;
private Stylus phoneStylus;
// region 访问手机组件的getter/setter公开方法
public MobilePhone(String name) {
this.phoneName = name;
}
public String getPhoneName() {
return phoneName;
}
public ScreenType getPhoneScreen() {
return phoneScreen;
}
public void setPhoneScreen(ScreenType phoneScreen) {
this.phoneScreen = phoneScreen;
}
public Battery getPhoneBattery() {
return phoneBattery;
}
public void setPhoneBattery(Battery phoneBattery) {
this.phoneBattery = phoneBattery;
}
public OperatingSystem getPhoneOS() {
return phoneOS;
}
public void setPhoneOS(OperatingSystem phoneOS) {
this.phoneOS = phoneOS;
}
public Stylus getPhoneStylus() {
return phoneStylus;
}
public void setPhoneStylus(Stylus phoneStylus) {
this.phoneStylus = phoneStylus;
}
// endregion
@Override
public String toString() {
return String.format("Name: %s\nScreen: %s\nBattery: %s\nOS: %s\nStylus: %s\n", this.phoneName,
this.phoneScreen, this.phoneBattery, this.phoneOS, this.phoneStylus);
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/OperatingSystem.java
================================================
package io.spring2go.corespring.classicbuilder;
// 操作系统
public enum OperatingSystem {
ANDROID,
WINDOWS_MOBILE,
WINDOWS_PHONE,
SYMBIAN
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/ScreenType.java
================================================
package io.spring2go.corespring.classicbuilder;
// 屏幕类型
public enum ScreenType {
SCREENTYPE_TOUCH_CAPACITIVE, // 电容式
SCREENTYPE_TOUCH_RESISTIVE, // 电阻式
SCREENTYPE_NON_TOUCH
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/Stylus.java
================================================
package io.spring2go.corespring.classicbuilder;
// 触控笔
public enum Stylus {
YES,
NO
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/classicbuilder/WindowsPhoneBuilder.java
================================================
package io.spring2go.corespring.classicbuilder;
// Windows手机具体构建者"ConcreteBuilder"
public class WindowsPhoneBuilder implements IMobilePhoneBuilder {
private MobilePhone phone;
public WindowsPhoneBuilder() {
this.phone = new MobilePhone("Windows Phone");
}
@Override
public void buildScreen() {
phone.setPhoneScreen(ScreenType.SCREENTYPE_TOUCH_CAPACITIVE);
}
@Override
public void buildBattery() {
phone.setPhoneBattery(Battery.MAH_2000);
}
@Override
public void buildOS() {
phone.setPhoneOS(OperatingSystem.WINDOWS_PHONE);
}
@Override
public void buildStylus() {
phone.setPhoneStylus(Stylus.NO);
}
@Override
public MobilePhone getPhone() {
return this.phone;
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/javabean/JavaBeanMain.java
================================================
package io.spring2go.corespring.javabean;
public class JavaBeanMain {
// JavaBean构造对象
public static void main(String[] args) {
User user = new User();
user.setFirstName("william");
user.setLastName("yang");
user.setAge(35);
user.setPhone("18001756666");
user.setAddress("shanghai pudong");
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/javabean/User.java
================================================
package io.spring2go.corespring.javabean;
// JavaBeans模式
public class User {
//region 私有成员
private String firstName;
private String lastName;
private int age;
private String phone;
private String address;
//endregion
public User() {}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/modernbuilder/ModernBuilderMain.java
================================================
package io.spring2go.corespring.modernbuilder;
public class ModernBuilderMain {
public static void main(String[] args) {
User user1 = new User.UserBuilder("william", "Yang")
.age(35)
.phone("123456")
.address("Fake address 1234")
.build();
System.out.println(user1);
User user2 = new User.UserBuilder("Jack", "Liu")
.age(40)
.phone("5655")
//no address
.build();
System.out.println(user2);
User user3 = new User.UserBuilder("Frank", "Han")
//no age
//no phone
//no address
.build();
System.out.println(user3);
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/modernbuilder/User.java
================================================
package io.spring2go.corespring.modernbuilder;
// 流畅接口(Fluent Interface)
public class User {
// 所有字段final
private final String firstName; // 必须
private final String lastName; // 必须
private final int age; // 可选
private final String phone; // 可选
private final String address; // 可选
private User(UserBuilder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
// 全部是getter,没有setter,保证不可变性immutability
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
return "User: " + this.firstName + ", "
+ this.lastName + ", " + this.age + ", "
+ this.phone + ", " + this.address;
}
public static class UserBuilder {
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;
public UserBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public UserBuilder address(String address) {
this.address = address;
return this;
}
// 返回最终构造的用户对象
public User build() {
User user = new User(this);
validateUserObject(user);
return user;
}
private void validateUserObject(User user) {
// 基本的验证检查
// 确保用户对象不违反系统假设
}
}
}
================================================
FILE: patterns/creation/builder/src/main/java/io/spring2go/corespring/telescoping_constructor/User.java
================================================
package io.spring2go.corespring.telescoping_constructor;
// 显微镜构造函数模式
public class User {
// region 私有成员
private String firstName;
private String lastName;
private int age;
private String phone;
private String address;
// endregion
public User(String firstName, String lastName, int age, String phone) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.phone = phone;
}
public User(String firstName, String lastName, String phone, String address) {
this.firstName = firstName;
this.lastName = lastName;
this.phone = phone;
this.address = address;
}
public User(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// region public getter
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
// endregion
}
================================================
FILE: patterns/creation/factory-method/pom.xml
================================================
4.0.0
io.spring2go.corespring
FactoryMethod
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/CeilingFan.java
================================================
package io.spring2go.corespring.factorymethod;
// 吊扇
public class CeilingFan implements IFan {
@Override
public void swithOn() {
System.out.println("The CeilingFan is swithed on ...");
}
@Override
public void switchOff() {
System.out.println("The CeilingFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/CeilingFanFactory.java
================================================
package io.spring2go.corespring.factorymethod;
public class CeilingFanFactory implements IFanFactory {
@Override
public IFan createFan() {
return new CeilingFan();
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/ExhaustFan.java
================================================
package io.spring2go.corespring.factorymethod;
public class ExhaustFan implements IFan {
@Override
public void swithOn() {
System.out.println("The ExhaustFan is swithed on ...");
}
@Override
public void switchOff() {
System.out.println("The ExhaustFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/ExhaustFanFactory.java
================================================
package io.spring2go.corespring.factorymethod;
public class ExhaustFanFactory implements IFanFactory {
@Override
public IFan createFan() {
return new ExhaustFan();
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/FactoryMethodMain.java
================================================
package io.spring2go.corespring.factorymethod;
//客户端代码
public class FactoryMethodMain {
public static void main(String[] args) {
IFanFactory fanFactory = new PropellerFanFactory();
// 使用工厂方法创建一个电扇
IFan fan = fanFactory.createFan();
// 使用创建的对象
fan.swithOn();
fan.switchOff();
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/IFan.java
================================================
package io.spring2go.corespring.factorymethod;
public interface IFan {
public void swithOn();
public void switchOff();
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/IFanFactory.java
================================================
package io.spring2go.corespring.factorymethod;
public interface IFanFactory {
IFan createFan();
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/PropellerFan.java
================================================
package io.spring2go.corespring.factorymethod;
// 螺旋桨式通风扇
public class PropellerFan implements IFan {
@Override
public void swithOn() {
System.out.println("The PropellerFan is swithed on ...");
}
@Override
public void switchOff() {
System.out.println("The PropellerFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/PropellerFanFactory.java
================================================
package io.spring2go.corespring.factorymethod;
public class PropellerFanFactory implements IFanFactory {
@Override
public IFan createFan() {
return new PropellerFan();
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/TableFan.java
================================================
package io.spring2go.corespring.factorymethod;
// 台扇
public class TableFan implements IFan {
@Override
public void swithOn() {
System.out.println("The TableFan is swithed on ...");
}
@Override
public void switchOff() {
System.out.println("The TableFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/factory-method/src/main/java/io/spring2go/corespring/factorymethod/TableFanFactory.java
================================================
package io.spring2go.corespring.factorymethod;
public class TableFanFactory implements IFanFactory {
@Override
public IFan createFan() {
return new TableFan();
}
}
================================================
FILE: patterns/creation/simple-factory/pom.xml
================================================
4.0.0
io.spring2go.corespring
SimpleFactory
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/nofactory/NoFactoryMain.java
================================================
package io.spring2go.corespring.nofactory;
public class NoFactoryMain {
public static void main(String[] args) {
TableFan fan = new TableFan();
fan.switchOn();
}
}
class TableFan {
public void switchOn() {
System.out.println("The TableFan is switched on ...");
}
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/CeilingFan.java
================================================
package io.spring2go.corespring.simplefactory;
public class CeilingFan implements IFan {
@Override
public void swithOn() {
System.out.println("The CeilingFan is swithed on ...");
}
@Override
public void switchOff() {
System.out.println("The CeilingFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/ExhaustFan.java
================================================
package io.spring2go.corespring.simplefactory;
public class ExhaustFan implements IFan {
@Override
public void swithOn() {
System.out.println("The ExhaustFan is swithed on ...");
}
@Override
public void switchOff() {
System.out.println("The ExhaustFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/FanFactory.java
================================================
package io.spring2go.corespring.simplefactory;
public class FanFactory implements IFanFactory {
@Override
public IFan createFan(FanType type) {
switch (type) {
case TableFan:
return new TableFan();
case CeilingFan:
return new CeilingFan();
case ExhaustFan:
return new ExhaustFan();
default:
return new TableFan();
}
}
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/FanType.java
================================================
package io.spring2go.corespring.simplefactory;
public enum FanType {
TableFan, //台扇
CeilingFan, //吊扇
ExhaustFan // 排风扇
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/IFan.java
================================================
package io.spring2go.corespring.simplefactory;
public interface IFan {
public void swithOn();
public void switchOff();
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/IFanFactory.java
================================================
package io.spring2go.corespring.simplefactory;
public interface IFanFactory {
IFan createFan(FanType type);
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/SimpleFactoryMain.java
================================================
package io.spring2go.corespring.simplefactory;
// 客户端代码
public class SimpleFactoryMain {
public static void main(String[] args) {
IFanFactory simpleFactory = new FanFactory();
// 使用简单工厂创建一个电扇
IFan fan = simpleFactory.createFan(FanType.TableFan);
fan.swithOn();
fan.switchOff();
}
}
================================================
FILE: patterns/creation/simple-factory/src/main/java/io/spring2go/corespring/simplefactory/TableFan.java
================================================
package io.spring2go.corespring.simplefactory;
public class TableFan implements IFan {
@Override
public void swithOn() {
System.out.println("The TableFan is swithed on ...");
}
@Override
public void switchOff() {
System.out.println("The TableFan is swithed off ...");
}
}
================================================
FILE: patterns/creation/singleton/pom.xml
================================================
4.0.0
io.spring2go.corespring
Singleton
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton/v3/BillPughSingleton.java
================================================
package io.spring2go.corespring.singleton.v3;
// 比尔.普夫单例
public class BillPughSingleton {
// 私有构造函数,避免被客户端代码使用
private BillPughSingleton() {}
private static class LazyHolder {
private static final BillPughSingleton INSTANCE = new BillPughSingleton();
}
public static BillPughSingleton getInstance() {
return LazyHolder.INSTANCE;
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton/v4/EnumSingleton.java
================================================
package io.spring2go.corespring.singleton.v4;
// 枚举单例
public enum EnumSingleton {
INSTANCE;
// 添加单例方法
public void method() {
System.out.println("Singleton method called...");
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton/v4/TestEnumSingleton.java
================================================
package io.spring2go.corespring.singleton.v4;
public class TestEnumSingleton {
public static void main(String[] args) {
EnumSingleton.INSTANCE.method();
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_deserialization/DemoSingleton.java
================================================
package io.spring2go.corespring.singleton_deserialization;
import java.io.Serializable;
public class DemoSingleton implements Serializable {
private static final long serialVersionUID = -7604766932017737115L;
private static class LazyHolder{
private static final DemoSingleton INSTANCE = new DemoSingleton();
}
public static DemoSingleton getInstance(){
return LazyHolder.INSTANCE;
}
// 确保反序列化单例
protected Object readResolve() {
return getInstance();
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_deserialization/SerializationTest.java
================================================
package io.spring2go.corespring.singleton_deserialization;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
public class SerializationTest {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
DemoSingleton instanceOne = DemoSingleton.getInstance();
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
"filename.ser"));
out.writeObject(instanceOne);
out.close();
// 从文件反序列化到对象
ObjectInput in = new ObjectInputStream(new FileInputStream(
"filename.ser"));
DemoSingleton instanceTwo = (DemoSingleton) in.readObject();
in.close();
System.out.println("instanceOne hashCode="+instanceOne.hashCode());
System.out.println("instanceTwo hashCode="+instanceTwo.hashCode());
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_reflection/ReflectionSingleton.java
================================================
package io.spring2go.corespring.singleton_reflection;
public class ReflectionSingleton {
private static ReflectionSingleton INSTANCE;
private ReflectionSingleton() {
//throw new InstantiationError("不能通过反射创建单例");
}
public static synchronized ReflectionSingleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new ReflectionSingleton();
}
return INSTANCE;
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_reflection/ReflectionTest.java
================================================
package io.spring2go.corespring.singleton_reflection;
import java.lang.reflect.Constructor;
public class ReflectionTest {
public static void main(String[] args) {
ReflectionSingleton instanceOne = ReflectionSingleton.getInstance();
ReflectionSingleton instanceTwo = null;
try {
Constructor constructor = ReflectionSingleton.class.getDeclaredConstructor();
// 下面的代码会破坏单例
constructor.setAccessible(true);
// 创建第二个实例
instanceTwo = (ReflectionSingleton) constructor.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(instanceOne.hashCode());
System.out.println(instanceTwo.hashCode());
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v1/EagerSingleton.java
================================================
package io.spring2go.corespring.singleton_v1;
// 提前初始化单例
public class EagerSingleton {
private static final EagerSingleton INSTANCE = new EagerSingleton();
// 私有构造函数,避免被客户端代码使用
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return INSTANCE;
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v1_1/StaticBlockSingleton.java
================================================
package io.spring2go.corespring.singleton_v1_1;
// 静态初始化块单例
public class StaticBlockSingleton {
private static final StaticBlockSingleton INSTANCE;
// 私有构造函数,避免被客户端使用
private StaticBlockSingleton() {}
static {
try {
INSTANCE = new StaticBlockSingleton();
} catch (Exception e) { // 异常处理
throw new RuntimeException("Uffff, i was not expecting this!", e);
}
}
public static StaticBlockSingleton getInstance() {
return INSTANCE;
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v2/LazySingleton.java
================================================
package io.spring2go.corespring.singleton_v2;
// 延迟初始化单例
public class LazySingleton {
private static LazySingleton INSTANCE;
private LazySingleton(){}
public static LazySingleton getInstance(){
if(INSTANCE == null){
INSTANCE = new LazySingleton();
}
return INSTANCE;
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v2_1/ThreadSafeSingleton.java
================================================
package io.spring2go.corespring.singleton_v2_1;
// ̰߳ȫ
public class ThreadSafeSingleton {
private static ThreadSafeSingleton INSTANCE;
// ˽й캯ⱻͻ˴ʹ
private ThreadSafeSingleton(){}
public static synchronized ThreadSafeSingleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new ThreadSafeSingleton();
}
return INSTANCE;
}
}
================================================
FILE: patterns/creation/singleton/src/main/java/io/spring2go/corespring/singleton_v2_2/DoubleCheckLockingSingleton.java
================================================
package io.spring2go.corespring.singleton_v2_2;
// 双重检查锁定单例
public class DoubleCheckLockingSingleton {
private static volatile DoubleCheckLockingSingleton INSTANCE;
// 私有构造函数,避免被客户端代码使用
private DoubleCheckLockingSingleton() {}
public static DoubleCheckLockingSingleton getInstance() {
if (INSTANCE == null) {
synchronized (DoubleCheckLockingSingleton.class) {
// 双重检查
if (INSTANCE == null) {
INSTANCE = new DoubleCheckLockingSingleton();
}
}
}
return INSTANCE;
}
}
================================================
FILE: patterns/general/dependency-inversion/pom.xml
================================================
4.0.0
io.spring2go.corespring
DependencyInversion
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/injection/AppMonitorConstructorInjection.java
================================================
package io.spring2go.corespring.injection;
import io.spring2go.corespring.ioc.EventLogWriter;
import io.spring2go.corespring.ioc.INotifier;
public class AppMonitorConstructorInjection {
// 事件通知器
private INotifier notifier = null;
public AppMonitorConstructorInjection(INotifier notifier) {
this.notifier = notifier;
}
// 应用有问题时该方法被调用
public void notify(String message) {
notifier.notify(message);
}
public static void main(String[] args) {
EventLogWriter writer = new EventLogWriter();
AppMonitorConstructorInjection monitor =
new AppMonitorConstructorInjection(writer);
monitor.notify("App has a problem ...");
}
}
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/injection/AppMonitorSetterInjection.java
================================================
package io.spring2go.corespring.injection;
import io.spring2go.corespring.ioc.EventLogWriter;
import io.spring2go.corespring.ioc.INotifier;
public class AppMonitorSetterInjection {
// 事件通知器
private INotifier notifier = null;
public void SetNotifier(INotifier notifier) {
this.notifier = notifier;
}
// 应用有问题时该方法被调用
public void notify(String message) {
notifier.notify(message);
}
public static void main(String[] args) {
EventLogWriter writer = new EventLogWriter();
AppMonitorSetterInjection monitor =
new AppMonitorSetterInjection();
// 可以在其它类中设置
monitor.SetNotifier(writer);
// 可以在其它类中调用
monitor.notify("App has a problem ...");
}
}
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/AppMonitorIOC.java
================================================
package io.spring2go.corespring.ioc;
public class AppMonitorIOC {
// 事件通知器
private INotifier notifier = null;
// 应用有问题时该方法被调用
public void notify(String message) {
if (notifier == null) {
// 将抽象接口映射到具体类
notifier = new EventLogWriter();
}
notifier.notify(message);
}
public static void main(String[] args) {
AppMonitorIOC appMonitor = new AppMonitorIOC();
appMonitor.notify("App has a problem ...");
}
}
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/EmailSender.java
================================================
package io.spring2go.corespring.ioc;
public class EmailSender implements INotifier {
public void notify(String message) {
// 发送Email
System.out.println("Send email, message : " + message);
}
}
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/EventLogWriter.java
================================================
package io.spring2go.corespring.ioc;
public class EventLogWriter implements INotifier {
public void notify(String message) {
// 写到事件日志
System.out.println("Write to event log, message : " + message);
}
}
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/INotifier.java
================================================
package io.spring2go.corespring.ioc;
// 事件通知器接口
public interface INotifier {
public void notify(String message);
}
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/ioc/SMSSender.java
================================================
package io.spring2go.corespring.ioc;
public class SMSSender implements INotifier {
public void notify(String message) {
// 发送短消息
System.out.println("Send SMS, message : " + message);
}
}
================================================
FILE: patterns/general/dependency-inversion/src/main/java/io/spring2go/corespring/nodip/AppMonitorNoDIP.java
================================================
package io.spring2go.corespring.nodip;
public class AppMonitorNoDIP {
// 负责将事件日志写到日志系统
private EventLogWriter writer = null;
// 应用有问题时该方法将被调用
public void notify(String message) {
if (writer == null) {
writer = new EventLogWriter();
}
writer.write(message);
}
public static void main(String[] args) {
AppMonitorNoDIP appMonitor = new AppMonitorNoDIP();
appMonitor.notify("App has a problem ...");
}
}
class EventLogWriter {
public void write(String message) {
// 写到事件日志
System.out.println("Write to event log, message : " + message);
}
}
================================================
FILE: patterns/structural/adapter/pom.xml
================================================
4.0.0
io.spring2go.corespring
Adapter
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/IHdmi.java
================================================
package io.spring2go.corespring.display;
// HDMI接口
public interface IHdmi {
public void openHdmi();
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/IVga.java
================================================
package io.spring2go.corespring.display;
// VGA接口
public interface IVga {
public void openVga();
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/LaptopMain.java
================================================
package io.spring2go.corespring.display;
public class LaptopMain {
public static void main(String[] args) {
VgaDisplay vgaDisplay = new VgaDisplay();
Vga2HdmiAdapter adapter = new Vga2HdmiAdapter(vgaDisplay);
operateHdmiLaptop(adapter);
}
static void operateHdmiLaptop(IHdmi hdmiDisplay) {
hdmiDisplay.openHdmi();
}
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/Vga2HdmiAdapter.java
================================================
package io.spring2go.corespring.display;
// VGA2HDMI适配器
public class Vga2HdmiAdapter implements IHdmi {
private IVga vgaDisplay;
public Vga2HdmiAdapter(IVga vgaDisplay) {
this.vgaDisplay = vgaDisplay;
}
public void openHdmi() {
// 适配逻辑
this.vgaDisplay.openVga();
System.out.println("Opening HDMI device");
}
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/display/VgaDisplay.java
================================================
package io.spring2go.corespring.display;
// 支持VGA接口的显示器
public class VgaDisplay implements IVga {
public void openVga() {
System.out.println("Opening..VGA Display...");
}
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/ArrayStack.java
================================================
package io.spring2go.corespring.stack;
// ջʵ
public class ArrayStack implements IStack {
private static final int DEFAULT_CAPACITY = 15;
private int top; // ָջԪ
private T[] array;
// region 캯
/**
* һջָʼ
*/
public ArrayStack(int initialCapacity) {
if (initialCapacity <= 0)
array = (T[]) new Object[DEFAULT_CAPACITY];
else
array = (T[]) new Object[initialCapacity];
top = -1; // ջ
}
/**
* һջʹóʼ
*/
public ArrayStack() {
this(DEFAULT_CAPACITY);
}
// endregion
/**
* ջǷΪ
*/
public boolean isEmpty() {
return top == -1;
}
/**
* ƳջԪ
*/
public T pop() throws StackException {
T x = peek();
array[top] = null; // ȷ
top--;
return x;
}
/**
* ջԪأDzƳ
*/
public T peek() throws StackException {
if (isEmpty())
throw new StackException("Stack is empty");
return array[top];
}
/**
* ջһԪ
*/
public void push(T e) throws StackException {
if (top == array.length)
throw new StackException("Stack has overflowed");
top++;
array[top] = e;
}
/**
* ջԪ
*/
public void clear() {
for (int i = 0; i <= top; i++) {
array[i] = null;
}
top = -1;
}
/**
* ջַʾ
*/
public String toString() {
if (isEmpty())
return "[ ]";
StringBuffer out = new StringBuffer("[");
for (int i = 0; i < top; i++)
out.append(array[i] + ", ");
out.append(array[top] + "]");
return out.toString();
}
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/ArrayStackMain.java
================================================
package io.spring2go.corespring.stack;
public class ArrayStackMain {
public static void main(String[] args) {
ArrayStack stack = new ArrayStack(6);
try {
for(int i = 0; i < 6; i++) {
stack.push(i);
}
System.out.println(stack);
for(int i = 0; i < 5; i++) {
stack.pop();
}
System.out.println(stack);
} catch(StackException e) {
System.err.println(e);
}
}
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/IStack.java
================================================
package io.spring2go.corespring.stack;
// ջӿ
public interface IStack {
public boolean isEmpty();
public T pop() throws StackException;
public T peek() throws StackException;
public void push (T e) throws StackException;
public void clear();
}
================================================
FILE: patterns/structural/adapter/src/main/java/io/spring2go/corespring/stack/StackException.java
================================================
package io.spring2go.corespring.stack;
public class StackException extends RuntimeException {
private static final long serialVersionUID = 1L;
public StackException(String name) {
super(name);
}
public StackException() {
super();
}
}
================================================
FILE: patterns/structural/bridge/pom.xml
================================================
4.0.0
io.spring2go.corespring
Bridge
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/Client.java
================================================
package io.spring2go.corespring.bridge;
public class Client {
public static void main(String[] args) {
String os = "linux";
FileDownloaderAbstraction downloader = null;
switch (os) {
case "windows":
downloader = new FileDownloaderAbstractionImpl(new WindowsFileDownloadImplementor());
break;
case "linux":
downloader = new FileDownloaderAbstractionImpl(new LinuxFileDownloadImplementor());
break;
default:
System.out.println("OS not supported !!");
}
Object fileContent = downloader.download("some path");
downloader.store(fileContent);
}
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/FileDownloadImplementor.java
================================================
package io.spring2go.corespring.bridge;
// Implementor
public interface FileDownloadImplementor {
public Object downloadFile(String path);
public boolean storeFile(Object object);
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/FileDownloaderAbstraction.java
================================================
package io.spring2go.corespring.bridge;
// Abstraction
public interface FileDownloaderAbstraction {
public Object download(String path);
public boolean store(Object object);
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/FileDownloaderAbstractionImpl.java
================================================
package io.spring2go.corespring.bridge;
// RefinedAbstraction
public class FileDownloaderAbstractionImpl implements FileDownloaderAbstraction {
private FileDownloadImplementor provider = null;
public FileDownloaderAbstractionImpl(FileDownloadImplementor provider) {
super();
this.provider = provider;
}
@Override
public Object download(String path) {
return provider.downloadFile(path);
}
@Override
public boolean store(Object path) {
return provider.storeFile(path);
}
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/LinuxFileDownloadImplementor.java
================================================
package io.spring2go.corespring.bridge;
// Concrete Implementor
public class LinuxFileDownloadImplementor implements FileDownloadImplementor {
@Override
public Object downloadFile(String path) {
return new Object();
}
@Override
public boolean storeFile(Object object) {
System.out.println("File download successfully in LINUX !!");
return true;
}
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/WindowsFileDownloadImplementor.java
================================================
package io.spring2go.corespring.bridge;
//Concrete Implementor
public class WindowsFileDownloadImplementor implements FileDownloadImplementor {
@Override
public Object downloadFile(String path) {
return new Object();
}
@Override
public boolean storeFile(Object object) {
System.out.println("File download successfully in WINDOWS !!");
return true;
}
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/abstraction_change/FileDownloaderAbstraction.java
================================================
package io.spring2go.corespring.bridge.abstraction_change;
public interface FileDownloaderAbstraction {
public Object download(String path);
public boolean store(Object object);
// 添加接口
public boolean delete(String object);
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/abstraction_change/FileDownloaderAbstractionImpl.java
================================================
package io.spring2go.corespring.bridge.abstraction_change;
import io.spring2go.corespring.bridge.FileDownloadImplementor;
import io.spring2go.corespring.bridge.abstraction_change.FileDownloaderAbstraction;
public class FileDownloaderAbstractionImpl implements FileDownloaderAbstraction {
private FileDownloadImplementor provider = null;
public FileDownloaderAbstractionImpl(FileDownloadImplementor provider) {
super();
this.provider = provider;
}
@Override
public Object download(String path) {
return provider.downloadFile(path);
}
@Override
public boolean store(Object object) {
return provider.storeFile(object);
}
@Override
public boolean delete(String object) {
return false;
}
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/implementation_change/FileDownloadImplementor.java
================================================
package io.spring2go.corespring.bridge.implementation_change;
public interface FileDownloadImplementor {
public Object downloadFile(String path);
public boolean storeFile(Object object);
// 增加接口
public boolean delete(String object);
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/implementation_change/LinuxFileDownloadImplementor.java
================================================
package io.spring2go.corespring.bridge.implementation_change;
public class LinuxFileDownloadImplementor implements FileDownloadImplementor {
@Override
public Object downloadFile(String path) {
return new Object();
}
@Override
public boolean storeFile(Object object) {
System.out.println("File downloaded successfully in LINUX !!");
return true;
}
@Override
public boolean delete(String object) {
return false;
}
}
================================================
FILE: patterns/structural/bridge/src/main/java/io/spring2go/corespring/bridge/implementation_change/WindowsFileDownloadImplementor.java
================================================
package io.spring2go.corespring.bridge.implementation_change;
public class WindowsFileDownloadImplementor implements FileDownloadImplementor
{
@Override
public Object downloadFile(String path) {
return new Object();
}
@Override
public boolean storeFile(Object object) {
System.out.println("File downloaded successfully in LINUX !!");
return true;
}
@Override
public boolean delete(String object) {
return false;
}
}
================================================
FILE: patterns/structural/composite/pom.xml
================================================
4.0.0
io.spring2go
Composite
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/BaseEmployee.java
================================================
package io.spring2go.corespring.composite_complex;
import java.util.List;
public abstract class BaseEmployee implements IEmployee {
protected String name;
protected int employeeId;
protected List subscriptions;
@Override
public String getName() {
return this.name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public int getEmployeeId() {
return this.employeeId;
}
@Override
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
@Override
public List getSubscriptions() {
return this.subscriptions;
}
@Override
public void setSubscriptions(List subscriptions) {
this.subscriptions = subscriptions;
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/CompanyMain.java
================================================
package io.spring2go.corespring.composite_complex;
import java.util.Arrays;
import java.util.List;
public class CompanyMain {
public static void main(String[] args) {
// 创建一些开发者并赋予订购项
IEmployee emp1 = new Developer("A", 1);
List subs = Arrays.asList(Util.getIntellijSubscription(), Util.getJProfilierSubscription(),
Util.getCSDNSubscription(), Util.getTrainingSubscription());
emp1.setSubscriptions(subs);
IEmployee emp2 = new Developer("B", 2);
subs = Arrays.asList(Util.getIntellijSubscription(), Util.getJProfilierSubscription());
emp2.setSubscriptions(subs);
IEmployee emp3 = new Developer("C", 3);
subs = Arrays.asList(Util.getIntellijSubscription());
emp3.setSubscriptions(subs);
IEmployee emp4 = new Developer("D", 4);
subs = Arrays.asList(Util.getIntellijSubscription());
emp4.setSubscriptions(subs);
IEmployee emp5 = new Developer("E", 5);
subs = Arrays.asList(Util.getIntellijSubscription());
emp5.setSubscriptions(subs);
IEmployee emp6 = new Developer("F", 6);
subs = Arrays.asList(Util.getIntellijSubscription(), Util.getTrainingSubscription());
emp6.setSubscriptions(subs);
IEmployee emp7 = new Developer("G", 7);
subs = Arrays.asList(Util.getIntellijSubscription());
emp7.setSubscriptions(subs);
IEmployee emp8 = new Developer("H", 8);
subs = Arrays.asList(Util.getIntellijSubscription());
emp8.setSubscriptions(subs);
IEmployee emp9 = new Developer("I", 9);
subs = Arrays.asList(Util.getIntellijSubscription());
emp9.setSubscriptions(subs);
IEmployee emp10 = new Developer("J", 10);
subs = Arrays.asList(Util.getIntellijSubscription(), Util.getCSDNSubscription());
emp10.setSubscriptions(subs);
// 获取单个员工的成本细节
System.out.println("Let's get cost details of single employee");
Util.printCostDetails(emp1);
// 获取一组员工的成本细节
List employees = Arrays.asList(emp1, emp2, emp3, emp4, emp5, emp6, emp7, emp8, emp9, emp10);
System.out.println("Let's check cost details of list of employees");
for(IEmployee employee : employees) {
Util.printCostDetails(employee);
}
// 设置经理
subs = Arrays.asList(Util.getIntellijSubscription(), Util.getJProfilierSubscription(),
Util.getCSDNSubscription(), Util.getTrainingSubscription());
List teamMembers = Arrays.asList(emp1, emp2, emp3);
IEmployee mng1 = new Manager("MA", 11, subs, teamMembers);
subs = Arrays.asList(Util.getIntellijSubscription());
teamMembers = Arrays.asList(emp4, emp5, emp6);
IEmployee mng2 = new Manager("MB", 12, subs, teamMembers);
subs = Arrays.asList(Util.getTrainingSubscription());
teamMembers = Arrays.asList(emp7, emp8, emp9, emp10);
IEmployee mng3 = new Manager("MC", 13, subs, teamMembers);
// 获取单个经理的成本细节
System.out.println("Let's get cost details of single manager");
Util.printCostDetails(mng1);
// 获取一组经理的成本细节
System.out.println("Let's check details of list of manager");
List managers = Arrays.asList(mng1, mng2, mng3);
for(IEmployee employee : managers) {
Util.printCostDetails(employee);
}
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Developer.java
================================================
package io.spring2go.corespring.composite_complex;
// Leaf
public class Developer extends BaseEmployee {
public Developer(String name, int employeeId) {
this.name = name;
this.employeeId = employeeId;
}
public double getCost() {
if (subscriptions== null)
return 0;
double cost = subscriptions.stream().mapToDouble(s -> s.getCost()).sum();
return cost;
}
public int getSubscriptionCount(SubscriptionType type) {
if (subscriptions == null)
return 0;
int count = (int) subscriptions.stream().filter(s -> s.getsType() == type).count();
return count;
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/IEmployee.java
================================================
package io.spring2go.corespring.composite_complex;
import java.util.List;
//Component
public interface IEmployee {
public String getName();
public void setName(String name);
public int getEmployeeId();
public void setEmployeeId(int employeeId);
public List getSubscriptions();
public void setSubscriptions(List subscriptions);
public double getCost();
public int getSubscriptionCount(SubscriptionType type);
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Manager.java
================================================
package io.spring2go.corespring.composite_complex;
import java.util.List;
// Composite
public class Manager extends BaseEmployee {
private List teamMembers;
public Manager(String name, int employeeId,
List subscriptions,
List teamMembers) {
this.name = name;
this.employeeId = employeeId;
this.subscriptions = subscriptions;
this.teamMembers = teamMembers;
}
public List getTeamMembers() {
return teamMembers;
}
public void setTeamMembers(List teamMembers) {
this.teamMembers = teamMembers;
}
@Override
public double getCost() {
double subsCost = 0.0;
if (subscriptions != null) {
subsCost = subscriptions.stream().mapToDouble(s -> s.getCost()).sum();
}
double membersCost = 0.0;
if (teamMembers != null) {
membersCost = teamMembers.stream().mapToDouble(m -> m.getCost()).sum();
}
return subsCost + membersCost;
}
@Override
public int getSubscriptionCount(SubscriptionType type) {
int subCount = 0;
if (subscriptions != null) {
subCount = (int) subscriptions.stream().filter(s -> s.getsType() == type).count();
}
int membersSubCount = 0;
if (teamMembers != null) {
for (IEmployee member: teamMembers) {
List subs = member.getSubscriptions();
if (subs != null) {
for(Subscription sub : subs) {
if (sub.getsType() == type) {
membersSubCount++;
}
}
}
}
}
return subCount + membersSubCount;
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Subscription.java
================================================
package io.spring2go.corespring.composite_complex;
public class Subscription {
private SubscriptionType sType; // 订购类型
private String name; // 名称
private double cost; // 费用
public SubscriptionType getsType() {
return sType;
}
public void setsType(SubscriptionType sType) {
this.sType = sType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getCost() {
return cost;
}
public void setCost(double cost) {
this.cost = cost;
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/SubscriptionType.java
================================================
package io.spring2go.corespring.composite_complex;
public enum SubscriptionType {
PRINT, // 打印
SOFTWARE_LICENSE, // 软件License
TRAINING; // 培训
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_complex/Util.java
================================================
package io.spring2go.corespring.composite_complex;
public class Util {
public static void printCostDetails(IEmployee employee) {
double cost = employee.getCost();
int licenseSubCount = employee.getSubscriptionCount(SubscriptionType.SOFTWARE_LICENSE);
int printSubCount = employee.getSubscriptionCount(SubscriptionType.PRINT);
int trainingSubCount = employee.getSubscriptionCount(SubscriptionType.TRAINING);
String outMsg = "Cost: %f, Count License: %d, Count Print: %d, Count Training: %d, Emp ID: %d\n";
System.out.print(String.format(outMsg, cost, licenseSubCount, printSubCount, trainingSubCount, employee.getEmployeeId()));
}
public static Subscription getIntellijSubscription() {
Subscription sub = new Subscription();
sub.setCost(30);
sub.setName("Intellij License");
sub.setsType(SubscriptionType.SOFTWARE_LICENSE);
return sub;
}
public static Subscription getJProfilierSubscription() {
Subscription sub = new Subscription();
sub.setCost(20);
sub.setName("JProfilier License");
sub.setsType(SubscriptionType.SOFTWARE_LICENSE);
return sub;
}
public static Subscription getCSDNSubscription() {
Subscription sub = new Subscription();
sub.setName("CSDN Magazine");
sub.setsType(SubscriptionType.PRINT);
sub.setCost(10);
return sub;
}
public static Subscription getTrainingSubscription() {
Subscription sub = new Subscription();
sub.setName("Java Design Pattern");
sub.setsType(SubscriptionType.TRAINING);
sub.setCost(300);
return sub;
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/CompositePatternMain.java
================================================
package io.spring2go.corespring.composite_simple;
// Client
public class CompositePatternMain {
public static void main(String[] args) {
IEmployee emp1 = new Developer("John", 10000);
IEmployee emp2 = new Developer("David", 15000);
IEmployee manager1 = new Manager("Daniel", 25000);
manager1.add(emp1);
manager1.add(emp2);
IEmployee emp3 = new Developer("Michael", 20000);
Manager generalManager = new Manager("Mark", 50000);
generalManager.add(emp3);
generalManager.add(manager1);
generalManager.print();
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/Developer.java
================================================
package io.spring2go.corespring.composite_simple;
import io.spring2go.corespring.composite_simple.IEmployee;
// leaf
public class Developer implements IEmployee {
private String name;
private double salary;
public Developer(String name, double salary) {
this.name = name;
this.salary = salary;
}
@Override
public void add(IEmployee employee) {
String msg = "not supported by leaf node.";
throw new UnsupportedOperationException(msg);
}
@Override
public void remove(IEmployee employee) {
String msg = "not supported by leaf node.";
throw new UnsupportedOperationException(msg);
}
@Override
public IEmployee getChild(int i) {
String msg = "not supported by leaf node.";;
throw new UnsupportedOperationException(msg);
}
@Override
public String getName() {
return this.name;
}
@Override
public double getSalary() {
return this.salary;
}
@Override
public void print() {
System.out.println("-------------");
System.out.println("Name ="+getName());
System.out.println("Salary ="+getSalary());
System.out.println("-------------");
}
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/IEmployee.java
================================================
package io.spring2go.corespring.composite_simple;
// Component
public interface IEmployee {
public void add(IEmployee employee);
public void remove(IEmployee employee);
public IEmployee getChild(int i);
public String getName();
public double getSalary();
public void print();
}
================================================
FILE: patterns/structural/composite/src/main/java/io/spring2go/corespring/composite_simple/Manager.java
================================================
package io.spring2go.corespring.composite_simple;
import java.util.ArrayList;
import java.util.List;
// Composite
public class Manager implements IEmployee {
private String name;
private double salary;
private List employees = new ArrayList();
public Manager(String name, double salary) {
this.name = name;
this.salary = salary;
}
@Override
public void add(IEmployee employee) {
employees.add(employee);
}
@Override
public void remove(IEmployee employee) {
employees.remove(employee);
}
@Override
public IEmployee getChild(int i) {
return employees.get(i);
}
@Override
public String getName() {
return this.name;
}
@Override
public double getSalary() {
return this.salary;
}
@Override
public void print() {
System.out.println("-------------");
System.out.println("Name =" + getName());
System.out.println("Salary =" + getSalary());
System.out.println("-------------");
for(IEmployee employee : this.employees) {
employee.print();
}
}
}
================================================
FILE: patterns/structural/decorator/pom.xml
================================================
4.0.0
io.spring2go.corespring
Decorator
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/ArtificialScentDecorator.java
================================================
package io.spring2go.corespring.decorator;
//Concrete Decorator
public class ArtificialScentDecorator extends Decorator {
protected ArtificialScentDecorator(BakeryComponent baseComponent) {
super(baseComponent);
this.name = "Artificial Scent";
this.price = 3.0;
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/BakeryComponent.java
================================================
package io.spring2go.corespring.decorator;
// Component Interface
public interface BakeryComponent {
public String getName();
public double getPrice();
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/CakeBase.java
================================================
package io.spring2go.corespring.decorator;
// ConcreteComponent
public class CakeBase implements BakeryComponent {
private String name = "Cake Base";
private double price = 200.0;
@Override
public String getName() {
return this.name;
}
@Override
public double getPrice() {
return this.price;
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/CherryDecorator.java
================================================
package io.spring2go.corespring.decorator;
//Concrete Decorator
public class CherryDecorator extends Decorator {
protected CherryDecorator(BakeryComponent baseComponent) {
super(baseComponent);
this.name = "Cherry";
this.price = 2.0;
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/CreamDecorator.java
================================================
package io.spring2go.corespring.decorator;
// Concrete Decorator
public class CreamDecorator extends Decorator {
protected CreamDecorator(BakeryComponent baseComponent) {
super(baseComponent);
this.name = "Cream";
this.price = 1.0;
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/Decorator.java
================================================
package io.spring2go.corespring.decorator;
// Decorator
public abstract class Decorator implements BakeryComponent {
private BakeryComponent baseComponent = null;
protected String name = "Undefined Decorator";
protected double price = 0.0;
protected Decorator(BakeryComponent baseComponent) {
this.baseComponent = baseComponent;
}
@Override
public String getName() {
return this.baseComponent.getName() + ", " + this.name;
}
@Override
public double getPrice() {
return this.price + this.baseComponent.getPrice();
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/DecoratorMain.java
================================================
package io.spring2go.corespring.decorator;
public class DecoratorMain {
public static void main(String[] args) {
// 先创建一个简单的Cake Base
CakeBase cBase = new CakeBase();
Util.printProductDetails(cBase);
// 在蛋糕上添加奶油
CreamDecorator creamCake = new CreamDecorator(cBase);
Util.printProductDetails(creamCake);
// 在蛋糕上添加樱桃
CherryDecorator cherryCake = new CherryDecorator(creamCake);
Util.printProductDetails(cherryCake);
// 再添加香味
ArtificialScentDecorator scentedCake =
new ArtificialScentDecorator(cherryCake);
Util.printProductDetails(scentedCake);
// 最后在蛋糕上添加名片
NameCardDecorator nameCardOnCake = new NameCardDecorator(scentedCake);
Util.printProductDetails(nameCardOnCake);
// 现在创建一个简单的糕点
PastryBase pastry = new PastryBase();
Util.printProductDetails(pastry);
// 在糕点上只添加奶油和樱桃
CreamDecorator creamPastry = new CreamDecorator(pastry);
CherryDecorator cherryPastry = new CherryDecorator(creamPastry);
Util.printProductDetails(cherryPastry);
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/NameCardDecorator.java
================================================
package io.spring2go.corespring.decorator;
//Concrete Decorator
public class NameCardDecorator extends Decorator {
protected NameCardDecorator(BakeryComponent baseComponent) {
super(baseComponent);
this.name = "Name Card";
this.price = 4.0;
}
@Override
public String getName() {
return super.getName() +
"(Please Collect your discount card for " +
this.price +
")";
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/PastryBase.java
================================================
package io.spring2go.corespring.decorator;
// ConcreteComponent
public class PastryBase implements BakeryComponent {
private String name = "Pastry Base";
private double price = 20.0;
@Override
public String getName() {
return this.name;
}
@Override
public double getPrice() {
return this.price;
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/Util.java
================================================
package io.spring2go.corespring.decorator;
public class Util {
public static void printProductDetails(BakeryComponent bComponent) {
String out = "Item: " + bComponent.getName() + ", " + "Price: " + bComponent.getPrice();
System.out.println(out);
}
}
================================================
FILE: patterns/structural/decorator/src/main/java/io/spring2go/corespring/decorator/uml.ucls
================================================
================================================
FILE: patterns/structural/facade/pom.xml
================================================
4.0.0
io.spring2go.corespring
Facade
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/CostManager.java
================================================
package io.spring2go.corespring.facade;
// 费用计算实现
public class CostManager implements ICosting {
@Override
public float applyDiscount(float price, float discountPercent) {
String out = String.format(
"A discount of %f%% has been applied on the product's price of %f",
discountPercent, price);
System.out.println(out);
return price - ((discountPercent / 100) * price);
}
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/FacadeMain.java
================================================
package io.spring2go.corespring.facade;
public class FacadeMain {
public static void main(String[] args) {
// Creating the Order/Product details
OrderDetails orderDetails = new OrderDetails("Java Design Pattern book",
"Simplified book on design patterns in Java",
500, 10, "Street No 1", "Educational Area", 1212,
"8811123456");
// Using Facade
OnlineShoppingFacade facade = new OnlineShoppingFacade();
facade.finalizeOrder(orderDetails);
}
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/ICosting.java
================================================
package io.spring2go.corespring.facade;
// 费用计算接口
public interface ICosting {
public float applyDiscount(float price, float discountPercent);
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/IInventory.java
================================================
package io.spring2go.corespring.facade;
// 库存接口
public interface IInventory {
public void update(int productId);
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/ILogistics.java
================================================
package io.spring2go.corespring.facade;
// 物流接口
public interface ILogistics {
public void shipProducts(String productName, String shippingAddress);
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/IOrderVerify.java
================================================
package io.spring2go.corespring.facade;
// 订单校验接口
public interface IOrderVerify {
public boolean verifyShippingAddress(int pincode);
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/IPaymentGateway.java
================================================
package io.spring2go.corespring.facade;
// 支付接口
public interface IPaymentGateway {
public boolean verifyCardDetails(String cardNo);
public boolean processPayment(String cardNo, float cost);
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/InventoryManager.java
================================================
package io.spring2go.corespring.facade;
// 库存实现
public class InventoryManager implements IInventory {
@Override
public void update(int productId) {
String msg = "Product# " + productId +
" is subtracted from store's inventory";
System.out.println(msg);
}
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/LogisticsManager.java
================================================
package io.spring2go.corespring.facade;
// 物流实现
public class LogisticsManager implements ILogistics {
@Override
public void shipProducts(String productName, String shippingAddress) {
String out = String.format(
"Congratulations your product %s has been shipped at the following address: %s.",
productName, shippingAddress);
System.out.println(out);
}
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/NoFacadeMain.java
================================================
package io.spring2go.corespring.facade;
// Client Code without Facade.
public class NoFacadeMain {
public static void main(String[] args) {
// Creating the Order/Product details
OrderDetails orderDetails = new OrderDetails("Java Design Pattern book",
"Simplified book on design patterns in Java",
500, 10, "Street No 1", "Educational Area", 1212,
"8811123456");
// Updating the inventory.
IInventory inventory = new InventoryManager();
inventory.update(orderDetails.getProductNo());
// verifying various details for the order such as the shipping address.
IOrderVerify orderVerify = new OrderVerificationManager();
orderVerify.verifyShippingAddress(orderDetails.getPinCode());
// Calculating the final cost after applying various discounts.
ICosting costManager = new CostManager();
orderDetails.setPrice(
costManager.applyDiscount(
orderDetails.getPrice(),
orderDetails.getDiscountPercent()
)
);
// Going through various steps if payment gateway like card verification,
// charging from the card.
IPaymentGateway paymentGateway = new PaymentGatewayManager();
paymentGateway.verifyCardDetails(orderDetails.getCardNo());
paymentGateway.processPayment(orderDetails.getCardNo(), orderDetails.getPrice());
// Completing the order by providing logistics.
ILogistics logistics = new LogisticsManager();
String shippingAddress = String.format("%s, %s - %d",
orderDetails.getAddressLine1(),
orderDetails.getAddressLine2(),
orderDetails.getPinCode());
logistics.shipProducts(orderDetails.getProductName(), shippingAddress);
}
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/OnlineShoppingFacade.java
================================================
package io.spring2go.corespring.facade;
public class OnlineShoppingFacade {
IInventory inventory = new InventoryManager();
IOrderVerify orderVerify = new OrderVerificationManager();
ICosting costManager = new CostManager();
IPaymentGateway paymentGateway = new PaymentGatewayManager();
ILogistics logistics = new LogisticsManager();
public void finalizeOrder(OrderDetails orderDetails) {
inventory.update(orderDetails.getProductNo());
orderVerify.verifyShippingAddress(orderDetails.getPinCode());
orderDetails.setPrice(
costManager.applyDiscount(
orderDetails.getPrice(),
orderDetails.getDiscountPercent()
)
);
paymentGateway.verifyCardDetails(orderDetails.getCardNo());
paymentGateway.processPayment(orderDetails.getCardNo(), orderDetails.getPrice());
String shippingAddress = String.format("%s, %s - %d",
orderDetails.getAddressLine1(),
orderDetails.getAddressLine2(),
orderDetails.getPinCode());
logistics.shipProducts(orderDetails.getCardNo(), shippingAddress);
}
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/OrderDetails.java
================================================
package io.spring2go.corespring.facade;
import java.util.Random;
public class OrderDetails {
// region 私有成员
private int productNo;
private String productName;
private String productDescription;
private float price;
private float discountPercent;
private String addressLine1;
private String addressLine2;
private int pinCode;
private String cardNo;
// endregion
public OrderDetails(String productName, String prodDescription, float price,
float discount, String addressLine1, String addressLine2,
int pinCode, String cardNo) {
this.productNo = new Random(1).nextInt(100);
this.productName = productName;
this.productDescription = prodDescription;
this.price = price;
this.discountPercent = discount;
this.addressLine1 = addressLine1;
this.addressLine2 = addressLine2;
this.pinCode = pinCode;
this.cardNo = cardNo;
}
// region getters
public int getProductNo() {
return productNo;
}
public void setProductNo(int productNo) {
this.productNo = productNo;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDescription() {
return productDescription;
}
public void setProductDescription(String productDescription) {
this.productDescription = productDescription;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public float getDiscountPercent() {
return discountPercent;
}
public void setDiscountPercent(float discountPercent) {
this.discountPercent = discountPercent;
}
public String getAddressLine1() {
return addressLine1;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public void setAddressLine2(String addressLine2) {
this.addressLine2 = addressLine2;
}
public int getPinCode() {
return pinCode;
}
public void setPinCode(int pinCode) {
this.pinCode = pinCode;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
// endregion
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/OrderVerificationManager.java
================================================
package io.spring2go.corespring.facade;
// 订单校验实现
public class OrderVerificationManager implements IOrderVerify {
@Override
public boolean verifyShippingAddress(int pincode) {
System.out.println(
"The product can be shipped to the pincode "
+ pincode);
return true;
}
}
================================================
FILE: patterns/structural/facade/src/main/java/io/spring2go/corespring/facade/PaymentGatewayManager.java
================================================
package io.spring2go.corespring.facade;
// 支付实现
public class PaymentGatewayManager implements IPaymentGateway {
@Override
public boolean verifyCardDetails(String cardNo) {
String out = "Card# " + cardNo +
" has been verified and is accepted.";
System.out.println(out);
return true;
}
@Override
public boolean processPayment(String cardNo, float cost) {
String out = "Card# " + cardNo +
" is used to make a payment of " + cost + ".";
System.out.println(out);
return true;
}
}
================================================
FILE: patterns/structural/proxy/pom.xml
================================================
4.0.0
io.spring2go.corespring
Proxy
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
================================================
FILE: patterns/structural/proxy/src/main/java/io/spring2go/corespring/Folder.java
================================================
package io.spring2go.corespring;
// RealSubject
public class Folder implements IFolder {
public void performOperations() {
// access folder and perform various operations like copy or cut files
System.out.println("Performing operation on folder");
}
}
================================================
FILE: patterns/structural/proxy/src/main/java/io/spring2go/corespring/FolderProxy.java
================================================
package io.spring2go.corespring;
// Proxy
public class FolderProxy implements IFolder {
Folder folder;
User user;
public FolderProxy(User user) {
this.user = user;
}
public void performOperations() {
if (user.getUserName().equalsIgnoreCase("bobo") &&
user.getPassword().equalsIgnoreCase("xyz")) {
folder = new Folder();
folder.performOperations();
} else {
System.out.println("You don't have access to this folder");
}
}
}
================================================
FILE: patterns/structural/proxy/src/main/java/io/spring2go/corespring/IFolder.java
================================================
package io.spring2go.corespring;
// Subject
public interface IFolder {
public void performOperations();
}
================================================
FILE: patterns/structural/proxy/src/main/java/io/spring2go/corespring/ProxyDesignPatternMain.java
================================================
package io.spring2go.corespring;
// Client
public class ProxyDesignPatternMain {
public static void main(String[] args) {
// When you click on folder, Let's say a GUI form will ask for
// usesrName and password.
// and this GUI will create this user object
// If we give correct userName and password
User user = new User("bobo", "xyz");
FolderProxy folderProxy = new FolderProxy(user);
System.out.println("When userName and password are correct:");
folderProxy.performOperations();
System.out.println("**************************************");
// if we give wrong userName and Password
User userWrong = new User("abc", "abc");
FolderProxy folderProxyWrong = new FolderProxy(userWrong);
System.out.println("When userName and password are incorrect");
folderProxyWrong.performOperations();
}
}
================================================
FILE: patterns/structural/proxy/src/main/java/io/spring2go/corespring/User.java
================================================
package io.spring2go.corespring;
public class User {
String username;
String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUserName() {
return this.username;
}
public String getPassword() {
return this.password;
}
}
================================================
FILE: patterns/structural/proxy/src/main/java/io/spring2go/corespring/uml.ucls
================================================