装饰模式

……

假设有一个接口Human,一个接口的实现类Man。人类Human是可以跑步的,但是不能飞。

    如果想给人类加上飞翔的翅膀,可以有三种解决方案:

1.修改实现类Man的方法,但不符合开闭原则
2.给实现类Man添加一个子类,扩展一个人类可以飞的功能。问题在于,如果又想给人类增加猎豹般奔跑的速度,需要继续扩展一个子类。显然,使用继承的方式去扩展一个类的功能,会增加类的层级,类的臃肿会加大维护的成本。
3.使用装饰模式扩展一个类的功能。好处在于,如果继承关系是纵向的,那么装饰类则是某个类横向的扩展,并不会影响继承链上的其他类。例如:C extends B , B extends A,如果需要扩展B的功能,可以设计一个B的装饰类,它并不会影响B的子类C。如果采用在B里面增加方法,势必会使B的所有子类结构被改变。

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package com.kevin.结构型模式.装饰模式.decorator;

/**
* @author kevin
* @version 1.0
* @description 抽象组件
* @createDate 2019/3/2
*/
// Component抽象构件角色(车)
public interface ICar {

void move();
}

// Decorator装饰角色
class SuperCar implements ICar{

protected ICar car;
public SuperCar(ICar car) {
this.car = car;
}

@Override
public void move() {
car.move();
}
}

// ConcreteComponent具体构建角色(真实对象)
class Car implements ICar{

@Override
public void move() {
System.out.println("陆地行驶!");
}
}

// ConcreteComponent具体装饰角色
class FlyCar extends SuperCar {

public FlyCar(ICar car) {
super(car);
}

public void fly(){
System.out.println("天上行驶");
}

@Override
public void move() {
car.move();
fly();
}

}

// ConcreteComponent具体装饰角色
class WaterCar extends SuperCar {

public WaterCar(ICar car) {
super(car);
}

public void swim(){
System.out.println("水上行驶");
}

@Override
public void move() {
car.move();
swim();
}

}

// ConcreteComponent具体装饰角色
class AICar extends SuperCar {

public AICar(ICar car) {
super(car);
}

public void autoMove(){
System.out.println("自动行驶");
}

@Override
public void move() {
car.move();
autoMove();
}

}

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
package com.kevin.结构型模式.装饰模式.decorator;

/**
* @author kevin
* @version 1.0
* @description 测试装饰模式
* @createDate 2019/1/18
*/
public class Test {

public static void main(String[] args) {

Car car = new Car();
car.move();

System.out.println("增加新的功能,飞行...");
FlyCar flyCar = new FlyCar(car);
flyCar.move();

System.out.println("增加新的功能,水里游...");
WaterCar waterCar = new WaterCar(car);
waterCar.move();

System.out.println("增加两个新的功能,飞行、水里游...");
WaterCar waterCar1 = new WaterCar(new FlyCar(car));
waterCar1.move();

}
}