Skip to content

Commit 20fac32

Browse files
author
Mike
committed
finish Chinese translation of observer and strategy
1 parent 1e38505 commit 20fac32

File tree

2 files changed

+295
-0
lines changed

2 files changed

+295
-0
lines changed

zh/observer/README.md

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
---
2+
layout: pattern
3+
title: Observer
4+
folder: observer
5+
permalink: /patterns/observer/
6+
categories: Behavioral
7+
tags:
8+
- Gang Of Four
9+
- Reactive
10+
---
11+
12+
## Also known as
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+
```java
40+
public interface WeatherObserver {
41+
42+
void update(WeatherType currentWeather);
43+
}
44+
45+
public class Orcs implements WeatherObserver {
46+
47+
private static final Logger LOGGER = LoggerFactory.getLogger(Orcs.class);
48+
49+
@Override
50+
public void update(WeatherType currentWeather) {
51+
LOGGER.info("The orcs are facing " + currentWeather.getDescription() + " weather now");
52+
}
53+
}
54+
55+
public class Hobbits implements WeatherObserver {
56+
57+
private static final Logger LOGGER = LoggerFactory.getLogger(Hobbits.class);
58+
59+
@Override
60+
public void update(WeatherType currentWeather) {
61+
switch (currentWeather) {
62+
LOGGER.info("The hobbits are facing " + currentWeather.getDescription() + " weather now");
63+
}
64+
}
65+
```
66+
67+
然后这里是不断变化的天气。
68+
69+
```java
70+
public class Weather {
71+
72+
private static final Logger LOGGER = LoggerFactory.getLogger(Weather.class);
73+
74+
private WeatherType currentWeather;
75+
private final List<WeatherObserver> observers;
76+
77+
public Weather() {
78+
observers = new ArrayList<>();
79+
currentWeather = WeatherType.SUNNY;
80+
}
81+
82+
public void addObserver(WeatherObserver obs) {
83+
observers.add(obs);
84+
}
85+
86+
public void removeObserver(WeatherObserver obs) {
87+
observers.remove(obs);
88+
}
89+
90+
/**
91+
* Makes time pass for weather.
92+
*/
93+
public void timePasses() {
94+
var enumValues = WeatherType.values();
95+
currentWeather = enumValues[(currentWeather.ordinal() + 1) % enumValues.length];
96+
LOGGER.info("The weather changed to {}.", currentWeather);
97+
notifyObservers();
98+
}
99+
100+
private void notifyObservers() {
101+
for (var obs : observers) {
102+
obs.update(currentWeather);
103+
}
104+
}
105+
}
106+
```
107+
108+
这是完整的示例。
109+
110+
```java
111+
var weather = new Weather();
112+
weather.addObserver(new Orcs());
113+
weather.addObserver(new Hobbits());
114+
115+
weather.timePasses();
116+
// The weather changed to rainy.
117+
// The orcs are facing rainy weather now
118+
// The hobbits are facing rainy weather now
119+
weather.timePasses();
120+
// The weather changed to windy.
121+
// The orcs are facing windy weather now
122+
// The hobbits are facing windy weather now
123+
weather.timePasses();
124+
// The weather changed to cold.
125+
// The orcs are facing cold weather now
126+
// The hobbits are facing cold weather now
127+
weather.timePasses();
128+
// The weather changed to sunny.
129+
// The orcs are facing sunny weather now
130+
// The hobbits are facing sunny weather now
131+
```
132+
133+
## Class diagram
134+
![alt text](../../observer/etc/observer.png "Observer")
135+
136+
## 应用
137+
在下面任何一种情况下都可以使用观察者模式
138+
139+
* 当抽象具有两个方面时,一个方面依赖于另一个方面。将这些方面封装在单独的对象中,可以使你分别进行更改和重用
140+
* 当一个对象的改变的同时需要改变其他对象,同时你又不知道有多少对象需要改变时
141+
* 当一个对象可以通知其他对象而无需假设这些对象是谁时。换句话说,你不想让这些对象紧耦合。
142+
143+
## 典型用例
144+
145+
* 一个对象的改变导致其他对象的改变
146+
147+
## Java中的例子
148+
149+
* [java.util.Observer](http://docs.oracle.com/javase/8/docs/api/java/util/Observer.html)
150+
* [java.util.EventListener](http://docs.oracle.com/javase/8/docs/api/java/util/EventListener.html)
151+
* [javax.servlet.http.HttpSessionBindingListener](http://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSessionBindingListener.html)
152+
* [RxJava](https://github.com/ReactiveX/RxJava)
153+
154+
## 鸣谢
155+
156+
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
157+
* [Java Generics and Collections](https://www.amazon.com/gp/product/0596527756/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596527756&linkCode=as2&tag=javadesignpat-20&linkId=246e5e2c26fe1c3ada6a70b15afcb195)
158+
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)
159+
* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7)

zh/strategy/README.md

+136
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
---
2+
layout: pattern
3+
title: Strategy
4+
folder: strategy
5+
permalink: /patterns/strategy/
6+
categories: Behavioral
7+
tags:
8+
- Gang of Four
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+
```java
37+
@FunctionalInterface
38+
public interface DragonSlayingStrategy {
39+
40+
void execute();
41+
}
42+
43+
public class MeleeStrategy implements DragonSlayingStrategy {
44+
45+
private static final Logger LOGGER = LoggerFactory.getLogger(MeleeStrategy.class);
46+
47+
@Override
48+
public void execute() {
49+
LOGGER.info("With your Excalibur you sever the dragon's head!");
50+
}
51+
}
52+
53+
public class ProjectileStrategy implements DragonSlayingStrategy {
54+
55+
private static final Logger LOGGER = LoggerFactory.getLogger(ProjectileStrategy.class);
56+
57+
@Override
58+
public void execute() {
59+
LOGGER.info("You shoot the dragon with the magical crossbow and it falls dead on the ground!");
60+
}
61+
}
62+
63+
public class SpellStrategy implements DragonSlayingStrategy {
64+
65+
private static final Logger LOGGER = LoggerFactory.getLogger(SpellStrategy.class);
66+
67+
@Override
68+
public void execute() {
69+
LOGGER.info("You cast the spell of disintegration and the dragon vaporizes in a pile of dust!");
70+
}
71+
}
72+
```
73+
74+
现在有一个强力的屠龙者要基于上面的组件来选择他的战斗策略。
75+
76+
```java
77+
public class DragonSlayer {
78+
79+
private DragonSlayingStrategy strategy;
80+
81+
public DragonSlayer(DragonSlayingStrategy strategy) {
82+
this.strategy = strategy;
83+
}
84+
85+
public void changeStrategy(DragonSlayingStrategy strategy) {
86+
this.strategy = strategy;
87+
}
88+
89+
public void goToBattle() {
90+
strategy.execute();
91+
}
92+
}
93+
```
94+
95+
最后是屠龙者的行动。
96+
97+
```java
98+
LOGGER.info("Green dragon spotted ahead!");
99+
var dragonSlayer = new DragonSlayer(new MeleeStrategy());
100+
dragonSlayer.goToBattle();
101+
LOGGER.info("Red dragon emerges.");
102+
dragonSlayer.changeStrategy(new ProjectileStrategy());
103+
dragonSlayer.goToBattle();
104+
LOGGER.info("Black dragon lands before you.");
105+
dragonSlayer.changeStrategy(new SpellStrategy());
106+
dragonSlayer.goToBattle();
107+
108+
// Green dragon spotted ahead!
109+
// With your Excalibur you sever the dragon's head!
110+
// Red dragon emerges.
111+
// You shoot the dragon with the magical crossbow and it falls dead on the ground!
112+
// Black dragon lands before you.
113+
// You cast the spell of disintegration and the dragon vaporizes in a pile of dust!
114+
```
115+
116+
## 类图
117+
![alt text](../../strategy/etc/strategy_1.png "Strategy")
118+
119+
## 应用
120+
使用策略模式当
121+
122+
* 许多相关的类只是行为不同。策略模式提供了一种为一种类配置多种行为的能力。
123+
* 你需要一种算法的不同变体。比如,你可能定义反应不用时间空间权衡的算法。当这些算法的变体使用类的层次结构来实现时就可以使用策略模式。
124+
* 一个算法使用的数据客户不应该对其知晓。使用策略模式来避免暴露复杂的,特定于算法的数据结构。
125+
* 一个类定义了许多行为,这些行为在其操作中展现为多个条件语句。移动相关的条件分支到它们分别的策略类中来代替这些条件语句。
126+
127+
## 教学
128+
129+
* [Strategy Pattern Tutorial](https://www.journaldev.com/1754/strategy-design-pattern-in-java-example-tutorial)
130+
131+
## 鸣谢
132+
133+
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
134+
* [Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions](https://www.amazon.com/gp/product/1937785467/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1937785467&linkCode=as2&tag=javadesignpat-20&linkId=7e4e2fb7a141631491534255252fd08b)
135+
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)
136+
* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7)

0 commit comments

Comments
 (0)