文章目录
  1. 1. 策略模式
  2. 2. 观察者模式

策略模式

“叶子”有很多种,对“根”的情意不变。

  • 每个子类中该方法都相同——方法实现放在基类中
  • 每个子类的该方法都不同——方法改写为抽象方法,在各个子类中实现
  • 每个子类的该方法有的相同有的不同——策略模式
  • 定义:“策略模式”定义了算法族,使算法变化独立于客户。
  • 实际操作:针对接口编程的思想,在基类中声明接口,然后new成继承了该接口的类。
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
public class 策略模式 {
public static void main(String[] args) {
//传入枝叶产生多样性
Man m = new Man(new SwordBehavior());
m.performUseWeapon();
Man n = new Man(new KnifeBehavior());
n.performUseWeapon();
}
}
interface WeaponBehavior {
void useWeapon();
}
//行为接口扩展(树根长成枝叶)
class SwordBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("用宝剑");
}
}
class KnifeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("用小刀");
}
}
//类中定义行为(树根)
class Man {
private WeaponBehavior weaponBehavior;
public Man(WeaponBehavior w) {
this.weaponBehavior = w;
}
public void performUseWeapon() {
weaponBehavior.useWeapon();
}
}

观察者模式

合适在一起聆听你,不合适就分开,不再联系。

  • 定义:对象之间一对多依赖,当主对象发生改变时,它的所有依赖者都会收到通知并自动更新。(并且有推拉两种模式可选)
    实际操作:Subject维护Observer的列表,并拥有遍历Observer发消息的功能。新建Observer对象时需要传入Subject对象以进行注册。
    Java内置API:Observable类和Observer接口。
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
48
49
50
51
52
53
54
55
56
57
public class 观察者模式 {
public static void main(String[] args) {
//Subject
WeatherData weatherData = new WeatherData();
//观察者
currentConditionDisplay c = new currentConditionDisplay(weatherData);
weatherData.setMeasurements(1, 2, 3);
}
}
class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
}
public void measurementChanged() {
setChanged();
notifyObservers(); //没有传送数据对象,说明是拉
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
//设置change标志位
measurementChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
class currentConditionDisplay implements Observer {
Observable observable;
private float temperature;
private float humidity;
public currentConditionDisplay(Observable o) {
this.observable = o;
//构造方法中传入并注册
observable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeatherData) {
WeatherData weatherData = (WeatherData) o;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
System.out.println("temperature:" + temperature + " humidity:" + humidity);
}
}
}
文章目录
  1. 1. 策略模式
  2. 2. 观察者模式