Commit dfabd9e8 by yuwei

项目初始化

parent 50722490
...@@ -200,4 +200,28 @@ public class DataConstant { ...@@ -200,4 +200,28 @@ public class DataConstant {
return val; return val;
} }
} }
/**
* Api状态
*/
public enum ApiState{
WAIT("1","待发布"),
PUBLISHED("2","已发布"),
OFFLINE("3","已下线");
ApiState(String key, String val){
this.key = key;
this.val = val;
}
private final String key;
private final String val;
public String getKey() {
return key;
}
public String getVal() {
return val;
}
}
} }
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>datax-common</artifactId>
<groupId>cn.datax</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>2.0.0</version>
<artifactId>datax-common-swagger</artifactId>
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package cn.datax.common.swagger.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties("swagger")
public class SwaggerProperties {
/**
* 是否开启swagger
*/
private Boolean enabled;
/**
* swagger会解析的包路径
**/
private String basePackage = "";
/**
* 标题
**/
private String title = "";
/**
* 描述
**/
private String description = "";
/**
* 版本
**/
private String version = "";
/**
* 许可证
**/
private String license = "";
/**
* 许可证URL
**/
private String licenseUrl = "";
/**
* 服务条款URL
**/
private String termsOfServiceUrl = "";
/**
* host信息
**/
private String host = "";
/**
* 联系人信息
*/
private Contact contact = new Contact();
public Boolean getEnabled()
{
return enabled;
}
public void setEnabled(Boolean enabled)
{
this.enabled = enabled;
}
public String getBasePackage() {
return basePackage;
}
public void setBasePackage(String basePackage)
{
this.basePackage = basePackage;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public String getVersion()
{
return version;
}
public void setVersion(String version)
{
this.version = version;
}
public String getLicense()
{
return license;
}
public void setLicense(String license)
{
this.license = license;
}
public String getLicenseUrl()
{
return licenseUrl;
}
public void setLicenseUrl(String licenseUrl)
{
this.licenseUrl = licenseUrl;
}
public String getTermsOfServiceUrl()
{
return termsOfServiceUrl;
}
public void setTermsOfServiceUrl(String termsOfServiceUrl)
{
this.termsOfServiceUrl = termsOfServiceUrl;
}
public String getHost()
{
return host;
}
public void setHost(String host)
{
this.host = host;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public static class Contact {
/**
* 联系人
**/
private String name = "";
/**
* 联系人url
**/
private String url = "";
/**
* 联系人email
**/
private String email = "";
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getUrl()
{
return url;
}
public void setUrl(String url)
{
this.url = url;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
}
}
\ No newline at end of file
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.common.swagger.config.SwaggerConfig
...@@ -23,6 +23,5 @@ ...@@ -23,6 +23,5 @@
<module>datax-common-dictionary</module> <module>datax-common-dictionary</module>
<module>datax-common-qrcode</module> <module>datax-common-qrcode</module>
<module>datax-common-jasperreport</module> <module>datax-common-jasperreport</module>
<module>datax-common-swagger</module>
</modules> </modules>
</project> </project>
\ No newline at end of file
...@@ -55,15 +55,6 @@ hystrix: ...@@ -55,15 +55,6 @@ hystrix:
strategy: SEMAPHORE strategy: SEMAPHORE
thread: thread:
timeoutInMilliseconds: 5000 #断路器超时时间,默认1000ms timeoutInMilliseconds: 5000 #断路器超时时间,默认1000ms
dataApiCallHystrix: #api调用方法的超时时间 60s
fallback:
enabled: true
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 60000 #断路器超时时间,默认1000ms
dataSqlConsoleHystrix: #sql工作台方法的超时时间 60s dataSqlConsoleHystrix: #sql工作台方法的超时时间 60s
fallback: fallback:
enabled: true enabled: true
......
...@@ -84,18 +84,6 @@ spring: ...@@ -84,18 +84,6 @@ spring:
args: args:
name: dataMarketHystrix name: dataMarketHystrix
fallbackUri: forward:/fallback fallbackUri: forward:/fallback
# 数据API调用
- id: datax-service-data-api-call
uri: lb://datax-service-data-api-call
predicates:
- Path=/data/api/**
filters:
- SwaggerHeaderFilter
- StripPrefix=2
- name: Hystrix
args:
name: dataApiCallHystrix
fallbackUri: forward:/fallback
# 数据SQL工作台 # 数据SQL工作台
- id: datax-service-data-sql-console - id: datax-service-data-sql-console
uri: lb://datax-service-data-sql-console uri: lb://datax-service-data-sql-console
......
# 数据源配置
spring:
redis:
database: 1
host: 192.168.234.101
port: 6379
password: 1234@abcd # 密码(默认为空)
timeout: 6000ms # 连接超时时长(毫秒)
lettuce:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
datasource:
dynamic:
type: com.zaxxer.hikari.HikariDataSource
hikari:
auto-commit: false
connection-timeout: 30000
idle-timeout: 25000
login-timeout: 5
max-lifetime: 30000
read-only: false
validation-timeout: 3000
maximum-pool-size: 15
minimum-idle: 5
pool-name: DataxHikariCP
connection-test-query: SELECT 1 FROM DUAL
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
useLocalSessionState: true
rewriteBatchedStatements: true
cacheResultSetMetadata: true
cacheServerConfiguration: true
elideSetAutoCommits: true
maintainTimeStats: false
primary: mysql
datasource:
mysql:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://192.168.234.100:3306/data_cloud?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 1234@abcd
mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml
type-aliases-package: cn.datax.service.data.market.api.entity
global-config:
db-config:
id-type: ASSIGN_ID
banner: false
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# spring security 配置
security:
oauth2:
client:
access-token-uri: http://localhost:8612/auth/oauth/token
user-authorization-uri: http://localhost:8612/auth/oauth/authorize
client-id: datax
client-secret: 123456
scope: all
resource:
loadBalanced: true
token-info-uri: http://localhost:8612/auth/oauth/check_token
\ No newline at end of file
...@@ -11,6 +11,18 @@ spring: ...@@ -11,6 +11,18 @@ spring:
properties.mail.smtp.starttls.enable: true properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true properties.mail.smtp.ssl.enable: true
redis:
database: 1
host: 192.168.234.101
port: 6379
password: 1234@abcd # 密码(默认为空)
timeout: 6000ms # 连接超时时长(毫秒)
lettuce:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
datasource: datasource:
dynamic: dynamic:
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>datax-learning</artifactId>
<groupId>cn.datax</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>design-patterns</artifactId>
</project>
\ No newline at end of file
package cn.datax.learning.design.patterns;
/**
* Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)
* 总共有 23 种设计模式
* 分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)
*/
public class DesignPatterns {
/**
* 创建型模式
* 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
*
* 工厂模式(Factory Pattern)
* 抽象工厂模式(Abstract Factory Pattern)
* 单例模式(Singleton Pattern)
* 建造者模式(Builder Pattern)
* 原型模式(Prototype Pattern)
*/
/**
* 结构型模式
* 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
*
* 适配器模式(Adapter Pattern)
* 桥接模式(Bridge Pattern)
* 过滤器模式(Filter、Criteria Pattern)
* 组合模式(Composite Pattern)
* 装饰器模式(Decorator Pattern)
* 外观模式(Facade Pattern)
* 享元模式(Flyweight Pattern)
* 代理模式(Proxy Pattern)
*/
/**
* 行为型模式
* 这些设计模式特别关注对象之间的通信。
*
* 责任链模式(Chain of Responsibility Pattern)
* 命令模式(Command Pattern)
* 解释器模式(Interpreter Pattern)
* 迭代器模式(Iterator Pattern)
* 中介者模式(Mediator Pattern)
* 备忘录模式(Memento Pattern)
* 观察者模式(Observer Pattern)
* 状态模式(State Pattern)
* 空对象模式(Null Object Pattern)
* 策略模式(Strategy Pattern)
* 模板模式(Template Pattern)
* 访问者模式(Visitor Pattern)
*/
/**
* 设计模式的六大原则
*
* 1、开闭原则(Open Close Principle)
* 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
*
* 2、里氏代换原则(Liskov Substitution Principle)
* 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
*
* 3、依赖倒转原则(Dependence Inversion Principle)
* 这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
*
* 4、接口隔离原则(Interface Segregation Principle)
* 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
*
* 5、迪米特法则,又称最少知道原则(Demeter Principle)
* 最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
*
* 6、合成复用原则(Composite Reuse Principle)
* 合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
*/
}
package cn.datax.learning.design.patterns.behavioral.chain;
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
//责任链中的下一个元素
protected AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger) {
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message) {
if (this.level <= level) {
write(message);
}
if (nextLogger !=null) {
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
package cn.datax.learning.design.patterns.behavioral.chain;
/**
* 责任链模式(Chain of Responsibility Pattern)
*/
public class ChainPatternDemo {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information.");
loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");
}
}
package cn.datax.learning.design.patterns.behavioral.chain;
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Standard Console::Logger: " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.chain;
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Console::Logger: " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.chain;
public class FileLogger extends AbstractLogger {
public FileLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File::Logger: " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.command;
import java.util.ArrayList;
import java.util.List;
public class Broker {
private List<Order> orderList = new ArrayList<Order>();
public void takeOrder(Order order) {
orderList.add(order);
}
public void placeOrders() {
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
public class BuyStock implements Order {
private Stock abcStock;
public BuyStock(Stock abcStock) {
this.abcStock = abcStock;
}
public void execute() {
abcStock.buy();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
/**
* 命令模式(Command Pattern)
*/
public class CommandPatternDemo {
public static void main(String[] args) {
Stock abcStock = new Stock();
BuyStock buyStockOrder = new BuyStock(abcStock);
SellStock sellStockOrder = new SellStock(abcStock);
Broker broker = new Broker();
broker.takeOrder(buyStockOrder);
broker.takeOrder(sellStockOrder);
broker.placeOrders();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
public interface Order {
void execute();
}
package cn.datax.learning.design.patterns.behavioral.command;
public class SellStock implements Order {
private Stock abcStock;
public SellStock(Stock abcStock) {
this.abcStock = abcStock;
}
public void execute() {
abcStock.sell();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
public class Stock {
private String name = "ABC";
private int quantity = 10;
public void buy() {
System.out.println("Stock [ Name: " + name + ", Quantity: " + quantity + " ] bought");
}
public void sell() {
System.out.println("Stock [ Name: " + name + ", Quantity: " + quantity + " ] sold");
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public class AndExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public interface Expression {
public boolean interpret(String context);
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
/**
* 解释器模式(Interpreter Pattern)
*/
public class InterpreterPatternDemo {
//规则:Robert 和 John 是男性
public static Expression getMaleExpression() {
Expression robert = new TerminalExpression("Robert");
Expression john = new TerminalExpression("John");
return new OrExpression(robert, john);
}
//规则:Julie 是一个已婚的女性
public static Expression getMarriedWomanExpression() {
Expression julie = new TerminalExpression("Julie");
Expression married = new TerminalExpression("Married");
return new AndExpression(julie, married);
}
public static void main(String[] args) {
Expression isMale = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("John is male? " + isMale.interpret("John"));
System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie"));
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public class OrExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data) {
this.data = data;
}
@Override
public boolean interpret(String context) {
if (context.contains(data)) {
return true;
}
return false;
}
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public interface Container {
public Iterator getIterator();
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
package cn.datax.learning.design.patterns.behavioral.iterator;
/**
* 迭代器模式(Iterator Pattern)
*/
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for (Iterator iter = namesRepository.getIterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new StringArrayIterator(names);
}
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public class StringArrayIterator implements Iterator{
String[] args;
int index = 0;
public StringArrayIterator(String[] argsTemp) {
this.args = argsTemp;
}
@Override
public boolean hasNext(){
if(index < args.length){
return true;
}
return false;
}
@Override
public Object next(){
if(index < args.length){
return args[index++];
}
return null;
}
}
package cn.datax.learning.design.patterns.behavioral.mediator;
import java.util.Date;
public class ChatRoom {
public static void showMessage(User user, String message) {
System.out.println(new Date().toString()
+ " [" + user.getName() + "] : " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.mediator;
/**
* 中介者模式(Mediator Pattern)
*/
public class MediatorPatternDemo {
public static void main(String[] args) {
User robert = new User("Robert");
User john = new User("John");
robert.sendMessage("Hi! John!");
john.sendMessage("Hello! Robert!");
}
}
package cn.datax.learning.design.patterns.behavioral.mediator;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public void sendMessage(String message) {
ChatRoom.showMessage(this, message);
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
import java.util.ArrayList;
import java.util.List;
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
/**
* 备忘录模式(Memento Pattern)
*/
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento Memento) {
state = Memento.getState();
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public abstract class AbstractCustomer {
protected String name;
public abstract boolean isNil();
public abstract String getName();
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public class CustomerFactory {
public static final String[] names = {"Rob", "Joe", "Julie"};
public static AbstractCustomer getCustomer(String name) {
for (int i = 0; i < names.length; i++) {
if (names[i].equalsIgnoreCase(name)) {
return new RealCustomer(name);
}
}
return new NullCustomer();
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public class NullCustomer extends AbstractCustomer {
@Override
public String getName() {
return "Not Available in Customer Database";
}
@Override
public boolean isNil() {
return true;
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
/**
* 空对象模式(Null Object Pattern)
*/
public class NullPatternDemo {
public static void main(String[] args) {
AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob");
AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob");
AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie");
AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura");
System.out.println("Customers");
System.out.println(customer1.getName());
System.out.println(customer2.getName());
System.out.println(customer3.getName());
System.out.println(customer4.getName());
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public class RealCustomer extends AbstractCustomer {
public RealCustomer(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public boolean isNil() {
return false;
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState()));
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public class HexaObserver extends Observer{
public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: "
+ Integer.toHexString( subject.getState()).toUpperCase());
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
package cn.datax.learning.design.patterns.behavioral.observer;
/**
* 观察者模式(Observer Pattern)
*/
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public class OctalObserver extends Observer{
public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState()));
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public class Context {
private State state;
public Context(){
state = null;
}
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public class StartState implements State {
public void doAction(Context context) {
System.out.println("Player is in start state");
context.setState(this);
}
public String toString() {
return "Start State";
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public interface State {
public void doAction(Context context);
}
package cn.datax.learning.design.patterns.behavioral.state;
/**
* 状态模式(State Pattern)
*/
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
System.out.println(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public class StopState implements State {
public void doAction(Context context) {
System.out.println("Player is in stop state");
context.setState(this);
}
public String toString() {
return "Stop State";
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class Context {
private Strategy strategy;
public Context() {}
public void SetStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class OperationSubstract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public interface Strategy {
public int doOperation(int num1, int num2);
}
package cn.datax.learning.design.patterns.behavioral.strategy;
/**
* 策略模式(Strategy Pattern)
*/
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context();
context.SetStrategy(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context.SetStrategy(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context.SetStrategy(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
package cn.datax.learning.design.patterns.behavioral.template;
public class Cricket extends Game {
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
package cn.datax.learning.design.patterns.behavioral.template;
public class Football extends Game {
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}
package cn.datax.learning.design.patterns.behavioral.template;
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play() {
//初始化游戏
initialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
package cn.datax.learning.design.patterns.behavioral.template;
/**
* 模板模式(Template Pattern)
*/
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
package cn.datax.learning.design.patterns.behavioral.visitor;
public class Computer implements ComputerPart {
ComputerPart[] parts;
public Computer() {
parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
package cn.datax.learning.design.patterns.behavioral.visitor;
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
package cn.datax.learning.design.patterns.behavioral.visitor;
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Computer computer) {
System.out.println("Displaying Computer.");
}
@Override
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
package cn.datax.learning.design.patterns.behavioral.visitor;
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
package cn.datax.learning.design.patterns.behavioral.visitor;
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package cn.datax.learning.design.patterns.behavioral.visitor;
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package cn.datax.learning.design.patterns.behavioral.visitor;
public class Mouse implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package cn.datax.learning.design.patterns.behavioral.visitor;
/**
* 访问者模式(Visitor Pattern)
*/
public class VisitorPatternDemo {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
package cn.datax.learning.design.patterns.creational.builder;
public abstract class Builder {
public abstract void setPart(String name, String type);
public abstract Product getProduct();
}
package cn.datax.learning.design.patterns.creational.builder;
/**
* 建造者模式(Builder Pattern)
* 四个要素:
* 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
* 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
* 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
* 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
*/
public class BuilderPatternDemo {
public static void main(String[] args){
Director director = new Director();
Product product1 = director.getAProduct();
product1.showProduct();
Product product2 = director.getBProduct();
product2.showProduct();
}
}
package cn.datax.learning.design.patterns.creational.builder;
public class ConcreteBuilder extends Builder {
private Product product = new Product();
@Override
public void setPart(String name, String type) {
product.setName(name);
product.setType(type);
}
@Override
public Product getProduct() {
return product;
}
}
package cn.datax.learning.design.patterns.creational.builder;
public class Director {
private Builder builder = new ConcreteBuilder();
public Product getAProduct(){
builder.setPart("宝马汽车","X7");
return builder.getProduct();
}
public Product getBProduct(){
builder.setPart("奥迪汽车","Q5");
return builder.getProduct();
}
}
package cn.datax.learning.design.patterns.creational.builder;
public class Product {
private String name;
private String type;
public void showProduct(){
System.out.println("名称:" + name);
System.out.println("型号:" + type);
}
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this.type = type;
}
}
package cn.datax.learning.design.patterns.creational.factory;
public class Blue implements Color {
@Override
public void fill() {
System.out.println("Inside Blue::fill() method.");
}
}
package cn.datax.learning.design.patterns.creational.factory;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
package cn.datax.learning.design.patterns.creational.factory;
public interface Color {
void fill();
}
package cn.datax.learning.design.patterns.creational.factory;
public class Green implements Color {
@Override
public void fill() {
System.out.println("Inside Green::fill() method.");
}
}
package cn.datax.learning.design.patterns.creational.factory;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
package cn.datax.learning.design.patterns.creational.factory;
public class Red implements Color {
@Override
public void fill() {
System.out.println("Inside Red::fill() method.");
}
}
package cn.datax.learning.design.patterns.creational.factory;
public interface Shape {
void draw();
}
package cn.datax.learning.design.patterns.creational.factory;
import cn.datax.learning.design.patterns.creational.factory.Shape;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
package cn.datax.learning.design.patterns.creational.factory.abstractFactory;
import cn.datax.learning.design.patterns.creational.factory.Color;
import cn.datax.learning.design.patterns.creational.factory.Shape;
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape);
}
package cn.datax.learning.design.patterns.creational.factory.abstractFactory;
import cn.datax.learning.design.patterns.creational.factory.Color;
import cn.datax.learning.design.patterns.creational.factory.Shape;
/**
* 抽象工厂模式(Abstract Factory Pattern)
*/
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
Shape shape3 = shapeFactory.getShape("SQUARE");
shape3.draw();
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
Color color1 = colorFactory.getColor("RED");
color1.fill();
Color color2 = colorFactory.getColor("Green");
color2.fill();
Color color3 = colorFactory.getColor("BLUE");
color3.fill();
}
}
package cn.datax.learning.design.patterns.creational.factory.abstractFactory;
import cn.datax.learning.design.patterns.creational.factory.*;
public class ColorFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
if (color == null){
return null;
}
if (color.equalsIgnoreCase("RED")) {
return new Red();
} else if (color.equalsIgnoreCase("GREEN")) {
return new Green();
} else if (color.equalsIgnoreCase("BLUE")) {
return new Blue();
}
return null;
}
@Override
public Shape getShape(String shapeType) {
return null;
}
}
package cn.datax.learning.design.patterns.creational.factory.abstractFactory;
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("SHAPE")){
return new ShapeFactory();
}else if(choice.equalsIgnoreCase("COLOR")){
return new ColorFactory();
}
return null;
}
}
package cn.datax.learning.design.patterns.creational.factory.abstractFactory;
import cn.datax.learning.design.patterns.creational.factory.*;
public class ShapeFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
return null;
}
@Override
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}
package cn.datax.learning.design.patterns.creational.factory.method;
import cn.datax.learning.design.patterns.creational.factory.Blue;
import cn.datax.learning.design.patterns.creational.factory.Color;
public class BlueFactory implements ColorFactory {
@Override
public Color getColor() {
return new Blue();
}
}
package cn.datax.learning.design.patterns.creational.factory.method;
import cn.datax.learning.design.patterns.creational.factory.Color;
public interface ColorFactory {
Color getColor();
}
package cn.datax.learning.design.patterns.creational.factory.method;
import cn.datax.learning.design.patterns.creational.factory.Color;
/**
* 工厂模式(Factory Pattern)
* 2.工厂方法模式
*/
public class FactoryMethodDemo {
public static void main(String[] args) {
ColorFactory colorFactory1 = new RedFactory();
Color color1 = colorFactory1.getColor();
color1.fill();
ColorFactory colorFactory2 = new GreenFactory();
Color color2 = colorFactory2.getColor();
color2.fill();
ColorFactory colorFactory3 = new BlueFactory();
Color color3 = colorFactory3.getColor();
color3.fill();
}
}
package cn.datax.learning.design.patterns.creational.factory.method;
import cn.datax.learning.design.patterns.creational.factory.Color;
import cn.datax.learning.design.patterns.creational.factory.Green;
public class GreenFactory implements ColorFactory {
@Override
public Color getColor() {
return new Green();
}
}
package cn.datax.learning.design.patterns.creational.factory.method;
import cn.datax.learning.design.patterns.creational.factory.Color;
import cn.datax.learning.design.patterns.creational.factory.Red;
public class RedFactory implements ColorFactory {
@Override
public Color getColor() {
return new Red();
}
}
package cn.datax.learning.design.patterns.creational.factory.simple;
import cn.datax.learning.design.patterns.creational.factory.Circle;
import cn.datax.learning.design.patterns.creational.factory.Rectangle;
import cn.datax.learning.design.patterns.creational.factory.Shape;
import cn.datax.learning.design.patterns.creational.factory.Square;
public class ShapeFactory {
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}
package cn.datax.learning.design.patterns.creational.factory.simple;
import cn.datax.learning.design.patterns.creational.factory.Shape;
/**
* 工厂模式(Factory Pattern)
* 1.简单工厂模式又称静态工厂模式
*/
public class SimpleFactoryDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
Shape shape3 = shapeFactory.getShape("SQUARE");
shape3.draw();
}
}
package cn.datax.learning.design.patterns.creational.prototype;
public class Circle extends Shape {
public Circle() {
type = "Circle";
}
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
package cn.datax.learning.design.patterns.creational.prototype;
/**
* 原型模式(Prototype Pattern)
*/
public class PrototypePatternDemo {
public static void main(String[] args) {
ShapeCache.loadCache();
Shape clonedShape1 = ShapeCache.getShape("1");
System.out.println("Shape : " + clonedShape1.getType());
Shape clonedShape2 = ShapeCache.getShape("2");
System.out.println("Shape : " + clonedShape2.getType());
Shape clonedShape3 = ShapeCache.getShape("3");
System.out.println("Shape : " + clonedShape3.getType());
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment