模式理解
装饰模式:动态地给一个对象添加一些额外的职责
就增加功能而言,装饰模式比生成子类更加灵活。
其UML图如下所示:
- 对象接口:定义对象接口,给对象动态地添加职责
- 具体对象:定义一个具体对象,也可给对象添加职责
- 装饰抽象类:从外部扩展对象的功能,但该对象无需知道
- 具体装饰对象:具体的装饰对象,给对象添加职责
例:给人一层一层穿衣服的实现
// 人类
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public void show(){
System.out.println(name);
}
}
// 装饰类
public class Decorations extends Person {
protected Person component;
public void setDecoration(Person component) {
this.component = component;
}
@Override
public void show() {
if (component != null) {
component.show();
}
}
}
class Tshirt extends Decorations {
@Override
public void show() {
System.out.println("add T-shirt");
super.show();
}
}
class Pants extends Decorations {
@Override
public void show() {
System.out.println("add Pants");
super.show();
}
}
class Shoes extends Decorations {
@Override
public void show() {
System.out.println("add Shoes");
super.show();
}
}
// 客户端
public class Demo {
public static void main(String[] args) {
Person person = new Person("Amy");
person.show();
Tshirt tshirt = new Tshirt();
Pants pants = new Pants();
Shoes shoes = new Shoes();
tshirt.setDecoration(person);
pants.setDecoration(tshirt);
shoes.setDecoration(pants);
shoes.show();
}
}
显示结果:
注意装饰的顺序。
使用场景
- 为已经完善的类添加功能
- 重构类,使其功能更加聚合