设计模式-装饰器
# 介绍
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
使用场景:
- 扩展一个类的功能。
- 动态增加功能,动态撤销。
JDK中的装饰模式:
- java.io.BufferedInputStream(InputStream)
- java.io.DataInputStream(InputStream)
- java.io.BufferedOutputStream(OutputStream)
- java.util.zip.ZipOutputStream(OutputStream)
- java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap
# 优缺点及注意
# 优点
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
# 缺点
多层装饰比较复杂。
# 注意
可代替继承。
# 实现
public class Person {
public void playGame() {
System.out.println("打LOL了");
}
}
1
2
3
4
5
2
3
4
5
public class PlayGameDecorator {
Person person;
public void playGame() {
System.out.println("用顶配外星人");
person.playGame();
}
public PlayGameDecorator(Person person) {
this.person = person;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
public class Test {
public static void main(String[] args) {
PlayGameDecorator decorator = new PlayGameDecorator(new Person());
decorator.playGame();
}
}
1
2
3
4
5
6
2
3
4
5
6
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11