[置顶] 2019年计划.md

[置顶] 发布时间:2019-02-16 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

2018已经荒废,2019新征程已经开始。

设计原则之--单一职责原则(Single Responsibility Principle, SRP)

发布时间:2019-02-25 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

1、核心思想

定义
A class should have only one reason to change. ( 就一个类而言,应该仅有一个引起它变化的原因)

每一个职责都是变化的一个轴线(an axis of change)。当需求变化时,该变化会反映为类的职责变化。如果一个类承担了多于一个的职责,那么引起它变化的原因就会有多个。
如果一个类承担的职责过多,就等于把这些职责耦合在了一起。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生是,设计会遭到意想不到的破坏。

引用自:《Agile Software Development, Principles, Patterns, and Practices》

设计模式之单例模式–懒汉模式与饿汉模式(2)

发布时间:2019-02-21 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

上一章讲了单例模式的基本实现方式,但是在多线程环境下,这种方式是存在严重的问题的。所以本章我们就来解决多线程环境的问题。

懒汉模式

利用方法锁实现

一种方式是在获取实例的方法上加锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 代码清单1

public class LazyInstantiationConfigUtils {

private static Logger logger = LoggerFactory.getLogger(SimpleConfigUtils.class);
private static LazyInstantiationConfigUtils instance = null;

private Map<String, String> props = new HashMap<>();

/**
* 单例的目的就是为了控制实例数量,所以构造函数一定要私有化,这样才能被其他使用者不能够随便实例化对象。
*/
private LazyInstantiationConfigUtils() {
this.readFromConfigFile();
logger.info("对象实例化完成。");
}

/**
* 获取配置实例,方法上加锁。当多个线程同时调用时只有一个线程可以访问方法,其他线程将被阻塞。
* @return 配置实例
*/
public static synchronized LazyInstantiationConfigUtils getInstance() {
if (instance == null) {
instance = new LazyInstantiationConfigUtils();
}
return instance;
}

/**
* 根据配置项的名称获取配置项的值
* @param propName 配置项的名称
* @return 配置项的值
*/
public String getPropertyValue(String propName) {
return this.props.get(propName);
}

private void readFromConfigFile() {
logger.info("假装从配置文件中读取了配置");
props.put("application.name", "DesignPattern");
props.put("application.type", "SpringBoot");
}
}

这种方式简单,但是性能差。每次调用都会判断是否有锁,在同一时刻只能有一个线程调用。

设计模式之单例模式--简单单例模式(1)

发布时间:2019-02-21 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

使用场景:需要在系统中确保类只有一个实例,一般这种类的创建都会比较占用系统资源。比如配置文件初始化,将配置文件中的数据读取到类中,通常需要耗费一定的系统资源,而且配置文件中的内容一般都是不变的,修改完配置文件一般都会要求重启系统。所以这种类最适合使用单例模式

简单单例模式

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
* 简单的单例模式
*
* @author 大扑棱蛾子
* @since 1.0.0
*/
public class SimpleConfigUtils {

private static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SimpleConfigUtils.class);
private static SimpleConfigUtils instance = null;

private Map<String, String> props = new HashMap<>();

/**
* 单例的目的就是为了控制实例数量,所以构造函数一定要私有化,这样才能被其他使用者不能够随便实例化对象。
*/
private SimpleConfigUtils() {
this.readFromConfigFile();
logger.info("对象实例化完成。");
}

/**
* 获取配置实例
* @return 配置实例
*/
public static SimpleConfigUtils getInstance() {
if (instance == null) {
instance = new SimpleConfigUtils();
}
return instance;
}

/**
* 根据配置项的名称获取配置项的值
* @param propName 配置项的名称
* @return 配置项的值
*/
public String getPropertyValue(String propName) {
return this.props.get(propName);
}

private void readFromConfigFile() {
logger.info("假装从配置文件中读取了配置");
props.put("application.name", "DesignPattern");
props.put("application.type", "SpringBoot");
}
}

实现单例模式要注意以下要点

  • 构造函数私有化
  • 提供一个静态方法来获取对象
  • 对象的实例保存在静态变量中。获取实例的时候要验证变量是否被初始化。

redis常用命令

发布时间:2019-02-14 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

查找Key

1
keys product:*

批量删除

1
redis-cli keys "*" | xargs redis-cli del

修改

1
set key value

MVVM模式

发布时间:2019-01-30 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

事件驱动

事件驱动:简单的理解就是用的操作触发了事件,事件触发了监听(js方法),然后监听执行业务逻辑代码进行数据处理、跳转页面或更新DOM等操作。

image.png

传统的事件驱动模式,在页面触发事件之后,需要触发js的方法来请求数据或处理数据,然后重新对页面进行渲染,而这个渲染只直接操作DOM的。在改变少量页面DOM的情况下,这种方法是可以被接受的,但是在页面非常复杂,并且需要改变大量页面数据的情况下,这种方式足以让人崩溃。而且还需要考虑重新渲染的元素的事件绑定正确性。经常会出现js方法里面有大量的HTML代码,导致代码的可读性和可维护性极低。

AngularJs给自定义组件添加样式不起作用怎么办

发布时间:2019-01-30 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

首先看一个自定义组件

panel.component.html

1
2
3
<div class="app-panel" [style]="style">
<ng-content></ng-content>
</div>

panel.component.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { Component, Input, OnInit } from '@angular/core';

@Component({
selector: 'app-panel',
templateUrl: './panel.component.html',
styleUrls: ['./panel.component.css']
})
export class PanelComponent implements OnInit {

@Input() style: any;

constructor() {
}

ngOnInit() {
}

}

4、在Spring Boot中启用Http2.0

发布时间:2018-09-30 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

HTTP2.0特性

使用HTTP/2的几点注意事项

要使用HTTP/2需要注意以下几点

  1. 虽然HTTP/2没有明确要求必须使用TLS,但当前几乎所有浏览器均只支持 HTTP/2 Over TLS。所以在使用之前我们需要先制作一张证书。
  2. 如果您的项目中用的是tomcatjetty,它们并不能直接支持HTTP/2,但是undertow可以。具体可以参考Spring Boot的文档:https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#howto-configure-http2
  3. 我们制作的证书是不被浏览器认可的,所以会有安全提示,不能用于生产环境

在本文的例子中使用的是undertow

函数的等价无穷小

发布时间:2018-08-10 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

$$
\text{如果} lim\frac{\beta}{\alpha}=1, \text{那么就说}\beta \text{与} \alpha \text{是等价无穷小,记作} \alpha \sim \beta
$$

几个常用的等价无穷小关系式

3、SpringBoot-单元测试

发布时间:2018-06-07 作者:大扑棱蛾子 阅读次数:
版权声明:未经允许不得转载至微信公众号,转载至个人博客请注明出处。 阅读原文

3.1 业务类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface UserService {

void login(String username, String password);
}

@Service
public class UserServiceImpl implements UserService {

private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
@Override
public void login(String username, String password) {
logger.info("用户登录成功");
}
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×