装饰模式使用一种对客户端透明的方案来动态地扩展对象的功能,同时它也是继承方案的一种替代方案之一。
这里举一个简答的汽车改装的例子来说明以下装饰模式的组成
基本抽象类
1 | public abstract class Car { |
具体类:继承基本抽象类
1 | public class Limousine extends Car { |
这是需要装饰的类,所以只需要最基本的东西
装饰抽象类
1 | public abstract class CarRefit extends Car { |
在装饰类中我们需要持有一个基本类的对象,以便进行装饰操作
具体装饰类
1.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class ExpensiveRefit extends CarRefit {
public ExpensiveRefit(Car car) {
super(car);
}
@Override
public void have() {
super.have();
haveHUD();
haveBetterEngine();
}
private void haveHUD() {
System.out.println("加装了HUD");
}
private void haveBetterEngine() {
System.out.println("加装了更好的发动机");
}
}
2.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class OtherRefit extends CarRefit {
public OtherRefit(Car car) {
super(car);
}
@Override
public void have() {
super.have();
havePaint();
haveEmpennage();
}
private void havePaint() {
System.out.println("加装了个性喷漆");
}
private void haveEmpennage() {
System.out.println("加装了尾翼");
}
}
使用如下:
1 | public class Main { |
结果
由上可知,装饰模式不需要依靠继承来实现功能的扩展,最重要的一步是抽象装饰类