Skip to content

Commit e432210

Browse files
committed
完成观察者模式
1 parent 0aac1ae commit e432210

File tree

9 files changed

+149
-3
lines changed

9 files changed

+149
-3
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.chrischen.designpattern.observer.ob;
2+
3+
import com.chrischen.designpattern.observer.subject.Subject;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
7+
public class CurrentConditionsDisplay implements Observer, DisplayElement {
8+
9+
private static final Logger log = LoggerFactory.getLogger(CurrentConditionsDisplay.class);
10+
11+
private Subject weatherData;
12+
13+
private float temp;
14+
15+
private float humidity;
16+
17+
private float pressure;
18+
19+
public CurrentConditionsDisplay(Subject weatherData) {
20+
this.weatherData = weatherData;
21+
weatherData.registerObserver(this);
22+
}
23+
24+
@Override
25+
public void update(float temp, float humidity, float pressure) {
26+
this.temp = temp;
27+
this.humidity = humidity;
28+
this.pressure = humidity;
29+
this.display();
30+
}
31+
32+
@Override
33+
public void display() {
34+
log.info("今天的天气情况,温度:{},湿度:{},气压:{}", this.temp, this.humidity, this.pressure);
35+
}
36+
37+
38+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.chrischen.designpattern.observer.ob;
2+
3+
public interface DisplayElement {
4+
5+
void display();
6+
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.chrischen.designpattern.observer.ob;
2+
3+
public interface Observer {
4+
5+
void update(float temp, float humidity, float pressure);
6+
7+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.chrischen.designpattern.observer.subject;
2+
3+
import com.chrischen.designpattern.observer.ob.Observer;
4+
5+
public interface Subject {
6+
7+
void registerObserver(Observer observer);
8+
9+
void removeObserver(Observer observer);
10+
11+
void notifyObserver();
12+
13+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.chrischen.designpattern.observer.subject;
2+
3+
import com.chrischen.designpattern.observer.ob.Observer;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class WeatherData implements Subject {
9+
10+
private List observers = new ArrayList();
11+
12+
private float temperature;
13+
14+
private float humidity;
15+
16+
private float pressure;
17+
18+
public void setTemperature(float temperature) {
19+
this.temperature = temperature;
20+
}
21+
22+
public void setHumidity(float humidity) {
23+
this.humidity = humidity;
24+
}
25+
26+
public void setPressure(float pressure) {
27+
this.pressure = pressure;
28+
}
29+
30+
@Override
31+
public void registerObserver(Observer observer) {
32+
observers.add(observer);
33+
}
34+
35+
@Override
36+
public void removeObserver(Observer observer) {
37+
int target = observers.indexOf(observer);
38+
if (target > -1) {
39+
observers.remove(target);
40+
}
41+
}
42+
43+
@Override
44+
public void notifyObserver() {
45+
for (int i = 0; i < observers.size(); i++) {
46+
Observer observer = (Observer) observers.get(i);
47+
observer.update(this.temperature, this.humidity, this.pressure);
48+
}
49+
}
50+
51+
public void measurementsChanged(float temperature, float humidity, float pressure) {
52+
this.temperature = temperature;
53+
this.humidity = humidity;
54+
this.pressure = pressure;
55+
this.notifyObserver();
56+
}
57+
}

src/main/java/com/chrischen/designpattern/strategy/character/Character.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public void fight() {
1717
}
1818

1919
public void setWeapon(WeaponBehavior weapon) {
20-
2120
this.weapon = weapon;
2221
log.info("change now weapon!");
2322
}

src/main/java/com/chrischen/designpattern/strategy/weapon/BowAndArrowBehavior.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ public class BowAndArrowBehavior implements WeaponBehavior {
99

1010
@Override
1111
public void useWeapon() {
12-
log.info("noe use bow and arrow to hit enemy");
12+
log.info("now use bow and arrow to hit enemy");
1313
}
1414
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.chrischen.designpattern.strategy;
2+
3+
import com.chrischen.designpattern.observer.ob.CurrentConditionsDisplay;
4+
import com.chrischen.designpattern.observer.subject.WeatherData;
5+
import org.junit.Test;
6+
7+
8+
public class ObserverTest {
9+
10+
@Test
11+
public void test() {
12+
WeatherData weatherData = new WeatherData();
13+
14+
CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
15+
16+
weatherData.measurementsChanged(24, 51, 1.1f);
17+
18+
weatherData.removeObserver(currentConditionsDisplay);
19+
weatherData.measurementsChanged(24, 51, 1.1f);
20+
21+
weatherData.registerObserver(currentConditionsDisplay);
22+
weatherData.measurementsChanged(22, 53, 1.0f);
23+
}
24+
25+
}

src/test/java/com/chrischen/designpattern/strategy/StrategyTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class StrategyTest {
1111
@Test
1212
public void initCharacter() {
1313
Character king = new King();
14-
king.startGame();
14+
// king.startGame();
1515
king.fight();
1616
king.setWeapon(new SwordBehavior());
1717
king.fight();

0 commit comments

Comments
 (0)