Skip to content

Commit

Permalink
20/10/20
Browse files Browse the repository at this point in the history
  • Loading branch information
WindRunnerMax committed Oct 20, 2020
1 parent c8d8a4a commit 476ef4d
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 2 deletions.
5 changes: 5 additions & 0 deletions CATALOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Catalog

**2020-10-19**
> 第238题:[观察者模式](Patterns/观察者模式.md)
<br>

**2020-10-18**
> 第237题:[Js中Date对象](JavaScript/Js中Date对象.md)
Expand Down
2 changes: 1 addition & 1 deletion JavaScript/Js中Math对象.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ console.log(Math.floor(6.6)); // 6

### Math.fround()
`Math.fround(doubleFloat)`
`Math.fround()`可以将任意的数字转换为离它最近的单精度浮点数形式的数字。`JavaScript`内部使用`64`位的双浮点数字,支持很高的精度。但是有时需要用`32`位浮点数字,比如从一个`Float32Array`读取值时,这时会产生混乱,检查一个`64`位浮点数和一个`32`位浮点数是否相等会失败,即使二个数字几乎一模一样,要解决这个问题,可以使用`Math.fround()`来将`64`位的浮点数转换为`32`位浮点数,在内部`JavaScript`继续把这个数字作为`64`位浮点数看待,仅仅是在尾数部分的第`23`位执行了舍入到偶”的操作,并将后续的尾数位设置为`0`,如果数字超出`32`位浮点数的范围,则返回`Infinity``-Infinity`
`Math.fround()`可以将任意的数字转换为离它最近的单精度浮点数形式的数字。`JavaScript`内部使用`64`位的双浮点数字,支持很高的精度。但是有时需要用`32`位浮点数字,比如从一个`Float32Array`读取值时,这时会产生混乱,检查一个`64`位浮点数和一个`32`位浮点数是否相等会失败,即使二个数字几乎一模一样,要解决这个问题,可以使用`Math.fround()`来将`64`位的浮点数转换为`32`位浮点数,在内部`JavaScript`继续把这个数字作为`64`位浮点数看待,仅仅是在尾数部分的第`23`位执行了舍入到偶的操作,并将后续的尾数位设置为`0`,如果数字超出`32`位浮点数的范围,则返回`Infinity``-Infinity`

```javascript
// 数字1.5可以在二进制数字系统中精确表示,32位和64位的值相同
Expand Down
80 changes: 80 additions & 0 deletions Patterns/状态模式.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# 状态模式
状态模式`State Pattern`是一种对象行为型模式,其以面向对象的方式实现状态机,使用状态模式,通过将每个单独的状态实现为状态模式接口的派生类,并通过调用由模式的超类定义的方法来实现状态转换,来实现状态机,状态模式也可以解释为策略模式,它能够通过调用模式接口中定义的方法来切换当前策略。

## 描述
在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的`stateful`对象,此种对象状态是从事先定义好的一系列值中取出的,当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化,状态模式允许一个对象在其内部状态改变时改变其行为,通常用于解决过多的`if else`条件分支问题。

### 优点
* 封装了转换规则。
* 枚举可能的状态,在枚举状态之前需要确定状态种类。
* 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
* 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
* 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

### 缺点
* 状态模式的使用必然会增加系统类和对象的个数。
* 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
* 状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。


### 适用环境
* 对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。
* 代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态。


## 实现

```javascript
// 例子:我们能够改变输入的文本的状态
// 如果选择大写,将开始以大写打印
// 如果选择小写,那么就用小写打印等等

const upperCase = str => str.toUpperCase();
const lowerCase = str => str.toLowerCase();
const defaultTransform = str => str;

class TextEditor {
constructor(transform) {
this._transform = transform;
}

setTransform(transform) {
this._transform = transform;
}

type(words) {
console.log(this._transform(words));
}
}

(function(){
const editor = new TextEditor(defaultTransform);

editor.type("First line"); // First line

editor.setTransform(upperCase);

editor.type("Second line"); // SECOND LINE
editor.type("Third line"); // THIRD LINE

editor.setTransform(lowerCase);

editor.type("Fourth line"); // fourth line
editor.type("Fifth line"); // fifth line
})();
```


## 每日一题

```
https://github.com/WindrunnerMax/EveryDay
```

## 参考

```
https://www.runoob.com/design-pattern/state-pattern.html
https://github.com/sohamkamani/javascript-design-patterns-for-humans#-state
https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/state.html
```
2 changes: 1 addition & 1 deletion Patterns/观察者模式.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
* 观察者模式在观察目标和观察者之间建立一个抽象的耦合。
* 观察者模式支持广播通信。
* 观察者模式符合“开闭原则”的要求
* 观察者模式符合开闭原则的要求

### 缺点
* 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@
* [组合模式](Patterns/组合模式.md)
* [享元模式](Patterns/享元模式.md)
* [模板方法模式](Patterns/模板方法模式.md)
* [观察者模式](Patterns/观察者模式.md)

## Linux
* [cat命令](Linux/cat命令.md)
Expand Down

0 comments on commit 476ef4d

Please sign in to comment.