向一个现有的类添加新的功能,同时又不改变其结构
用装饰类来包装原有的类(通过组合,而不是继承),提供额外的功能。
事例
需求:水果包装进行打包后,分别增加防伪、加固、加急的功能
功能如图
数据结构如图
装饰类要继承被装饰类Bag,这样才能代替被装饰类
装饰类:
public abstract class BagDecorator implements Bag {
protected Bag mBag;
public BagDecorator(Bag bag) {
mBag = bag;
}
}
tips: 抽象类不需要实现接口的方法
实现类:
// 防伪实现类
public class CheckedDecorator extends BagDecorator {
public CheckedDecorator(Bag bag) {
super(bag);
}
@Override
public void pack() {
mBag.pack();
checked();
}
private void checked() {
// 防伪的业务代码
}
}
// 加固实现类
public class ReinforceDecorator extends BagDecorator {
public ReinforceDecorator(Bag bag) {
super(bag);
}
@Override
public void pack() {
mBag.pack();
reinforce();
}
private void reinforce() {
// 加固的业务代码
}
}
// 加急实现类
public class SpeedDecorator extends BagDecorator {
public SpeedDecorator(Bag bag) {
super(bag);
}
@Override
public void pack() {
mBag.pack();
speed();
}
private void speed() {
// 加急的业务代码
}
}
测试:
public void decorate() {
AppleBag appleBag = new AppleBag();
// 用防伪装饰类来包装AppleBag
Bag bag = new CheckedDecorator(appleBag);
// 打包和防伪都会执行
bag.pack();
}
总结
优点
- 降低耦合。装饰者和被装饰者可独立发展
- 扩展功能不通过继承产生而新的子类,简化了系统结构
缺点
- 多层装饰较复杂,会增加系统复杂性