一、概述
装饰者模式指的是在不必改变原来类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰者来包裹真实的对象。
二、角色
抽象构件(Component):是一个接口或者抽象类,就是定义最核心的对象,也就是最原始的对象
具体构件(Concrete Component):是Component的实现,被装饰者
抽象装饰(Decorator):一般是一个抽象类,持有一个private的Componet对象
具体装饰(Concrete Decorator):把最核心的、最原始的、最基本的东西装饰成其他东西
三、装饰者模式
1.抽象构件
/**
* 抽象构建角色(对应动物类)
*/
public interface Animal {
void function();
}
2.具体构件
/**
* 具体构建角色(对应狗)
*/
public class Dog implements Animal {
@Override
public void function() {
System.out.println("基本功能:呼吸+睡觉");
}
}
3.抽象装饰
/**
* 装饰角色
*/
public class AnimalDecorator implements Animal {
// 持有一个Component类型的对象引用
private Animal animal;
public AnimalDecorator(Animal animal) {
this.animal = animal;
}
@Override
public void function() {
// 客户端的调用委派给具体的子类
animal.function();
}
}
4.具体装饰
/**
* 具体装饰角色
*/
public class AnimalConcreteDecorator extends AnimalDecorator {
public AnimalConcreteDecorator(Animal animal) {
super(animal);
}
@Override
public void function() {
super.function();
System.out.println("附加功能:");
this.bellow();
}
private void bellow() {
System.out.println("吼叫");
}
}
5.测试
@Test
public void testDecorator() {
System.out.println("- - - 装饰前: - - -");
Animal animal = new Dog();
animal.function();
System.out.println("- - - 装饰后: - - -");
Animal newAnimal = new AnimalConcreteDecorator(animal);
newAnimal.function();
}