Java策略模式

  • 假如有这样一个需求,需要我们做一个玩具狗管理系统:
  • 玩具狗有名字,有颜色….属性,橡皮狗会游泳,电子狗会汪汪
  • 此时脑子里浮现的画面是(先写一个基类,基类中是所有狗属性),然后让电狗继承基类,橡皮狗也继承基类…..某些狗有自己特有的属性,而某些狗不具有这些属性,这样以来就显的我们的基类很累赘
  • 设计思路:找出应用可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起,取出来写成一个接口,所有具备属性的狗狗都可以实现这个接口
  • 设计原则:针对接口编程,而不是针对实现编程,多用组合,少用继承

dog


1. 玩具狗基类(所有狗都继承它)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* Created by zhangfeng on 2016/10/18.
* 所有玩具狗
*/
public class ToyDogs {
/**
* 名字
*/
public String name() {
return name();
}
/**
* 颜色
*/
public String colour() {
return colour();
}
}
2. 普通狗登场
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
/**
* Created by zhangfeng on 2016/10/18.
* 普通狗
*/
public class CommonDog extends ToyDogs {
private String name;
private String colour;
public CommonDog(String name, String colour) {
this.name = name;
this.colour = colour;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour = colour;
}
@Override
public String name() {
return getName();
}
@Override
public String colour() {
return getColour();
}
}
3. 电子狗具备不同于普通狗(它会汪汪)
1
2
3
4
5
6
7
8
9
10
11
/**
* Created by zhangfeng on 2016/10/18.
* 电子狗特有的属性
*/
public interface ElectronImp {
/**
* 电子狗会汪汪
* @return
*/
public String cryOut();
}
4. 电子狗登场
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
/**
* Created by zhangfeng on 2016/10/18.
* 电子狗
*/
public class ElectronDog extends ToyDogs implements ElectronImp {
private String name;
private String colour;
private String cryOut;
public ElectronDog(String name, String colour, String cryOut) {
this.name = name;
this.colour = colour;
this.cryOut = cryOut;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour = colour;
}
public String getCryOut() {
return cryOut;
}
public void setCryOut(String cryOut) {
this.cryOut = cryOut;
}
@Override
public String name() {
return getName();
}
@Override
public String colour() {
return getColour();
}
@Override
public String cryOut() {
return getCryOut();
}
}
5. 测试
1
2
ElectronDog electronDog = new ElectronDog("哈士奇", "魔力棕", "汪汪汪...");
CommonDog commonDog = new CommonDog("单身狗", "沧桑白...");
6. 结果输出
1
2
我的名字叫哈士奇,颜色是魔力棕,我会汪汪...
我的名字叫单身狗,颜色是沧桑白...