定义
动态给一个对象添加、修改功能,就添加功能而言,装饰模式比生成自类更加灵活。
举个栗子
记录一波小明的行为(日志)。
/**
* 动物
*/
public abstract class Animal {
/**
* 学习行为
*/
public abstract void learn();
}
public class People extends Animal {
@Override
public void learn() {
System.out.println("1岁的小明:吃饭、睡觉");
}
}
/**
* 2岁的小明
*/
public class XiaoMing extends Decorator {
public XiaoMing(Animal animal) {
super(animal);
}
@Override
public void learn() {
super.learn();
afterLearn();
}
private void afterLearn(){
System.out.println("2岁的小明学会了新技能:爬行");
}
}
/**
* 8岁的小明--上学
*/
public class XiaoMing2 extends Decorator {
public XiaoMing2(Animal animal) {
super(animal);
}
@Override
public void learn() {
super.learn();
afterLearn();
}
private void afterLearn(){
System.out.println("8岁的小明上学了");
}
}
/**
* 装饰器父类
*/
public abstract class Decorator extends Animal {
private Animal animal;
public Decorator(Animal animal) {
this.animal = animal;
}
@Override
public void learn() {
animal.learn();
}
}
测试
@Test
void dicoratorTest(){
People people = new People();
Decorator xiaoMing = new XiaoMing(people);
XiaoMing2 xiaoMing2 = new XiaoMing2(xiaoMing);
xiaoMing2.learn();
}
1岁的小明:吃饭、睡觉
2岁的小明学会了新技能:爬行
8岁的小明上学了
总结
1.装饰器类与被装饰类保持相同的接口类型,把被装饰对象传给装饰器实现动态、透明添加职责。
2.本质:动态组合。动态是手段、组合才是目的。
3.场景:不影响其他对象,动态、透明添加职责;不适合使用字类进行拓展等场景。